Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-10-03 01:42:16 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-10-03 10:55:31 +0400
commit7dabfb2048958c60afccf353c21eca2f5c08bc4d (patch)
tree99cd891fa43d9890175c31f30bcaa274560f762c /intern/cycles/render
parent50af4d208d7d2f3cbc789e91e54d87adf37590fb (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.cpp4
-rw-r--r--intern/cycles/render/object.cpp17
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 */