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:
authorJacques Lucke <jacques@blender.org>2021-11-04 20:32:37 +0300
committerJacques Lucke <jacques@blender.org>2021-11-04 20:32:37 +0300
commit101fa4a425d6723c58823484d7e7f3a98acc774f (patch)
tree77bacd993a89e31829b608d5470b57f1d08fe9e3 /intern/cycles/blender
parent2373ce7fcf998203ae77f6bc1cb37eb4b4d2c5ea (diff)
parentc7fcc50842d85664d2b07c32b181951ea7661440 (diff)
Merge branch 'blender-v3.0-release'
Diffstat (limited to 'intern/cycles/blender')
-rw-r--r--intern/cycles/blender/object.cpp6
-rw-r--r--intern/cycles/blender/sync.cpp9
-rw-r--r--intern/cycles/blender/sync.h2
3 files changed, 17 insertions, 0 deletions
diff --git a/intern/cycles/blender/object.cpp b/intern/cycles/blender/object.cpp
index 9919b9d1836..3800ea0ecd2 100644
--- a/intern/cycles/blender/object.cpp
+++ b/intern/cycles/blender/object.cpp
@@ -161,6 +161,11 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
if (is_instance) {
persistent_id_array = b_instance.persistent_id();
persistent_id = persistent_id_array.data;
+ if (!b_ob_info.is_real_object_data()) {
+ /* Remember which object data the geometry is coming from, so that we can sync it when the
+ * object has changed. */
+ instance_geometries_by_object[b_ob_info.real_object.ptr.data].insert(b_ob_info.object_data);
+ }
}
/* light is handled separately */
@@ -560,6 +565,7 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
else {
geometry_motion_synced.clear();
}
+ instance_geometries_by_object.clear();
/* initialize culling */
BlenderObjectCulling culling(scene, b_scene);
diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp
index cf0b77a9b16..ffd1e78b7f8 100644
--- a/intern/cycles/blender/sync.cpp
+++ b/intern/cycles/blender/sync.cpp
@@ -183,6 +183,15 @@ void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d
(object_subdivision_type(b_ob, preview, experimental) != Mesh::SUBDIVISION_NONE)) {
BL::ID key = BKE_object_is_modified(b_ob) ? b_ob : b_ob.data();
geometry_map.set_recalc(key);
+
+ /* Sync all contained geometry instances as well when the object changed.. */
+ map<void *, set<BL::ID>>::const_iterator instance_geometries =
+ instance_geometries_by_object.find(b_ob.ptr.data);
+ if (instance_geometries != instance_geometries_by_object.end()) {
+ for (BL::ID geometry : instance_geometries->second) {
+ geometry_map.set_recalc(geometry);
+ }
+ }
}
if (updated_geometry) {
diff --git a/intern/cycles/blender/sync.h b/intern/cycles/blender/sync.h
index c2377406876..7e5d0324ca9 100644
--- a/intern/cycles/blender/sync.h
+++ b/intern/cycles/blender/sync.h
@@ -225,6 +225,8 @@ class BlenderSync {
set<Geometry *> geometry_synced;
set<Geometry *> geometry_motion_synced;
set<Geometry *> geometry_motion_attribute_synced;
+ /** Remember which geometries come from which objects to be able to sync them after changes. */
+ map<void *, set<BL::ID>> instance_geometries_by_object;
set<float> motion_times;
void *world_map;
bool world_recalc;