Code refactor: reduce number of loops over meshes.
This commit is contained in:
@@ -2057,7 +2057,9 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
|
|||||||
|
|
||||||
VLOG(1) << "Total " << scene->meshes.size() << " meshes.";
|
VLOG(1) << "Total " << scene->meshes.size() << " meshes.";
|
||||||
|
|
||||||
/* Update normals. */
|
bool true_displacement_used = false;
|
||||||
|
size_t total_tess_needed = 0;
|
||||||
|
|
||||||
foreach(Mesh *mesh, scene->meshes) {
|
foreach(Mesh *mesh, scene->meshes) {
|
||||||
foreach(Shader *shader, mesh->used_shaders) {
|
foreach(Shader *shader, mesh->used_shaders) {
|
||||||
if(shader->need_update_mesh)
|
if(shader->need_update_mesh)
|
||||||
@@ -2065,6 +2067,7 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(mesh->need_update) {
|
if(mesh->need_update) {
|
||||||
|
/* Update normals. */
|
||||||
mesh->add_face_normals();
|
mesh->add_face_normals();
|
||||||
mesh->add_vertex_normals();
|
mesh->add_vertex_normals();
|
||||||
|
|
||||||
@@ -2072,22 +2075,25 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
|
|||||||
mesh->add_undisplaced();
|
mesh->add_undisplaced();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(progress.get_cancel()) return;
|
/* Test if we need tesselation. */
|
||||||
}
|
if(mesh->subdivision_type != Mesh::SUBDIVISION_NONE &&
|
||||||
}
|
|
||||||
|
|
||||||
/* Tessellate meshes that are using subdivision */
|
|
||||||
size_t total_tess_needed = 0;
|
|
||||||
foreach(Mesh *mesh, scene->meshes) {
|
|
||||||
if(mesh->need_update &&
|
|
||||||
mesh->subdivision_type != Mesh::SUBDIVISION_NONE &&
|
|
||||||
mesh->num_subd_verts == 0 &&
|
mesh->num_subd_verts == 0 &&
|
||||||
mesh->subd_params)
|
mesh->subd_params)
|
||||||
{
|
{
|
||||||
total_tess_needed++;
|
total_tess_needed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if we need displacement. */
|
||||||
|
if(mesh->has_true_displacement()) {
|
||||||
|
true_displacement_used = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(progress.get_cancel()) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tessellate meshes that are using subdivision */
|
||||||
|
if(total_tess_needed) {
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
foreach(Mesh *mesh, scene->meshes) {
|
foreach(Mesh *mesh, scene->meshes) {
|
||||||
if(mesh->need_update &&
|
if(mesh->need_update &&
|
||||||
@@ -2110,19 +2116,12 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
|
|||||||
|
|
||||||
if(progress.get_cancel()) return;
|
if(progress.get_cancel()) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update images needed for true displacement. */
|
/* Update images needed for true displacement. */
|
||||||
bool true_displacement_used = false;
|
|
||||||
bool old_need_object_flags_update = false;
|
bool old_need_object_flags_update = false;
|
||||||
foreach(Mesh *mesh, scene->meshes) {
|
|
||||||
if(mesh->need_update &&
|
|
||||||
mesh->has_true_displacement())
|
|
||||||
{
|
|
||||||
true_displacement_used = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(true_displacement_used) {
|
if(true_displacement_used) {
|
||||||
VLOG(1) << "Updating images used for true displacement.";
|
VLOG(1) << "Updating images used for true displacement.";
|
||||||
device_update_displacement_images(device, scene, progress);
|
device_update_displacement_images(device, scene, progress);
|
||||||
@@ -2148,12 +2147,18 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
|
|||||||
|
|
||||||
/* Update displacement. */
|
/* Update displacement. */
|
||||||
bool displacement_done = false;
|
bool displacement_done = false;
|
||||||
|
size_t num_bvh = 0;
|
||||||
|
|
||||||
foreach(Mesh *mesh, scene->meshes) {
|
foreach(Mesh *mesh, scene->meshes) {
|
||||||
if(mesh->need_update &&
|
if(mesh->need_update) {
|
||||||
displace(device, dscene, scene, mesh, progress))
|
if(displace(device, dscene, scene, mesh, progress)) {
|
||||||
{
|
|
||||||
displacement_done = true;
|
displacement_done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(mesh->need_build_bvh()) {
|
||||||
|
num_bvh++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: properly handle cancel halfway displacement */
|
/* TODO: properly handle cancel halfway displacement */
|
||||||
@@ -2167,17 +2172,9 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
|
|||||||
if(progress.get_cancel()) return;
|
if(progress.get_cancel()) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update bvh. */
|
|
||||||
size_t num_bvh = 0;
|
|
||||||
foreach(Mesh *mesh, scene->meshes) {
|
|
||||||
if(mesh->need_update && mesh->need_build_bvh()) {
|
|
||||||
num_bvh++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TaskPool pool;
|
TaskPool pool;
|
||||||
|
|
||||||
i = 0;
|
size_t i = 0;
|
||||||
foreach(Mesh *mesh, scene->meshes) {
|
foreach(Mesh *mesh, scene->meshes) {
|
||||||
if(mesh->need_update) {
|
if(mesh->need_update) {
|
||||||
pool.push(function_bind(&Mesh::compute_bvh,
|
pool.push(function_bind(&Mesh::compute_bvh,
|
||||||
|
Reference in New Issue
Block a user