diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-10-03 01:42:16 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-10-03 10:55:31 +0400 |
commit | 7dabfb2048958c60afccf353c21eca2f5c08bc4d (patch) | |
tree | 99cd891fa43d9890175c31f30bcaa274560f762c /intern/cycles/render | |
parent | 50af4d208d7d2f3cbc789e91e54d87adf37590fb (diff) |
Cycles: Speedup of kernel side camera-in-volume detection
The idea is to only count intersections with objects which has volumetric shader
and ignore all other objects.
This is probably as fast as we can go without involving some forth level magic.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/mesh.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/render/object.cpp | 17 |
2 files changed, 17 insertions, 4 deletions
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 54cfab42a97..cc141b771d1 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -1034,13 +1034,9 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen /* update normals */ foreach(Mesh *mesh, scene->meshes) { - mesh->has_volume = false; foreach(uint shader, mesh->used_shaders) { if(scene->shaders[shader]->need_update_attributes) mesh->need_update = true; - if(scene->shaders[shader]->has_volume) { - mesh->has_volume = true; - } } if(mesh->need_update) { diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 1f148d34ea6..1966fe4bb7f 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -342,9 +342,26 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene objects[offset+9] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], __int_as_float(numkeys)); objects[offset+10] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], __int_as_float(numsteps), __int_as_float(numverts)); + /* That's a bit weird place to update mesh flags, but we do it here + * because object needs to know if it's a volume or not and mesh needs + * to have the updated. + * + * TODO(sergey): Check on whether we can reshuffle update order in scene. + */ + if(ob->mesh->need_update) { + foreach(uint shader, ob->mesh->used_shaders) { + if(scene->shaders[shader]->has_volume) { + ob->mesh->has_volume = true; + break; + } + } + } + /* object flag */ if(ob->use_holdout) flag |= SD_HOLDOUT_MASK; + if(ob->mesh->has_volume) + flag |= SD_OBJECT_HAS_VOLUME; object_flag[i] = flag; /* have curves */ |