diff options
Diffstat (limited to 'intern/cycles/render/geometry.cpp')
-rw-r--r-- | intern/cycles/render/geometry.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index e9a70e4b3fd..124a41db21e 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -1917,9 +1917,12 @@ void GeometryManager::device_update(Device *device, } } - /* update the bvh even when there is no geometry so the kernel bvh data is still valid, - * especially when removing all of the objects during interactive renders */ - bool need_update_scene_bvh = (scene->bvh == nullptr); + /* Update the BVH even when there is no geometry so the kernel's BVH data is still valid, + * especially when removing all of the objects during interactive renders. + * Also update the BVH if the transformations change, we cannot rely on tagging the Geometry + * as modified in this case, as we may accumulate displacement if the vertices do not also + * change. */ + bool need_update_scene_bvh = (scene->bvh == nullptr || (update_flags & TRANSFORM_MODIFIED) != 0); { scoped_callback_timer timer([scene](double time) { if (scene->update_stats) { @@ -1961,7 +1964,6 @@ void GeometryManager::device_update(Device *device, scene->update_stats->geometry.times.add_entry({"device_update (compute bounds)", time}); } }); - vector<Object *> volume_objects; foreach (Object *object, scene->objects) { object->compute_bounds(motion_blur); } |