[Bf-blender-cvs] [9c493ca378d] blender2.8: Depsgraph: Add missing synchronize code to scene

Sergey Sharybin noreply at git.blender.org
Wed Jan 24 15:05:46 CET 2018


Commit: 9c493ca378d3458881750f046bdb170affcae133
Author: Sergey Sharybin
Date:   Wed Jan 24 15:01:05 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB9c493ca378d3458881750f046bdb170affcae133

Depsgraph: Add missing synchronize code to scene

The issue here is that we can not duplicate the whole datablock since we
use view layer pointers in depsgraph callbacks.

Maybe this whole chunk of code belongs to somewhere else, or maybe we
can find a smart solution to avoid need of CoW pointers passed to the
evaluation functions.

This fixes lack of viewport update when toggling collection enabled flag.

===================================================================

M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc

===================================================================

diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index ff447b53b1e..a6668208574 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -46,6 +46,7 @@
 #include "BLI_string.h"
 
 #include "BKE_global.h"
+#include "BKE_idprop.h"
 #include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
@@ -467,6 +468,137 @@ void update_special_pointers(const Depsgraph *depsgraph,
 	}
 }
 
+void update_copy_on_write_layer_collections(
+        ListBase *layer_collections_cow,
+        const ListBase *layer_collections_orig);
+
+void update_copy_on_write_layer_collection(
+        LayerCollection *layer_collection_cow,
+        const LayerCollection *layer_collection_orig)
+{
+	// Make a local copy of original layer collection, so we can start
+	// modifying it.
+	LayerCollection local = *layer_collection_orig;
+	// Copy all pointer data from original CoW version of layer collection.
+	local.next = layer_collection_cow->next;
+	local.prev = layer_collection_cow->prev;
+	local.scene_collection = layer_collection_cow->scene_collection;
+	local.object_bases = layer_collection_cow->object_bases;
+	local.overrides = layer_collection_cow->overrides;
+	local.layer_collections = layer_collection_cow->layer_collections;
+	local.properties = layer_collection_cow->properties;
+	local.properties_evaluated = layer_collection_cow->properties_evaluated;
+	// Synchronize pointer-related data.
+	IDP_Reset(local.properties, layer_collection_orig->properties);
+	// Copy synchronized version back.
+	*layer_collection_cow = local;
+	// Recurs into nested layer collections.
+	update_copy_on_write_layer_collections(
+	        &layer_collection_cow->layer_collections,
+	        &layer_collection_orig->layer_collections);
+}
+
+void update_copy_on_write_layer_collections(
+        ListBase *layer_collections_cow,
+        const ListBase *layer_collections_orig)
+{
+	const LayerCollection *layer_collection_orig =
+	        (const LayerCollection *)layer_collections_orig->first;
+	LayerCollection *layer_collection_cow =
+	        (LayerCollection *)layer_collections_cow->first;
+	while (layer_collection_orig != NULL) {
+		update_copy_on_write_layer_collection(layer_collection_cow,
+		                                      layer_collection_orig);
+		layer_collection_orig = layer_collection_orig->next;
+		layer_collection_cow = layer_collection_cow->next;
+	}
+}
+
+void update_copy_on_write_view_layer(const Depsgraph *depsgraph,
+                                     ViewLayer *view_layer_cow,
+                                     const ViewLayer *view_layer_orig)
+{
+	// Update pointers to active base.
+	if (view_layer_orig->basact == NULL) {
+		view_layer_cow->basact = NULL;
+	}
+	else {
+		const Object *obact_orig = view_layer_orig->basact->object;
+		Object *obact_cow = (Object *)depsgraph->get_cow_id(&obact_orig->id);
+		view_layer_cow->basact = BKE_view_layer_base_find(view_layer_cow, obact_cow);
+	}
+	// Update base flags.
+	//
+	// TODO(sergey): We should probably check visibled/selectabled.
+	// flag here?
+	const Base *base_orig = (Base *)view_layer_orig->object_bases.first;
+	Base *base_cow = (Base *)view_layer_cow->object_bases.first;;
+	while (base_orig != NULL) {
+		base_cow->flag = base_orig->flag;
+		base_orig = base_orig->next;
+		base_cow = base_cow->next;
+	}
+	// Synchronize settings.
+	view_layer_cow->active_collection = view_layer_orig->active_collection;
+	view_layer_cow->flag = view_layer_orig->flag;
+	view_layer_cow->layflag = view_layer_orig->layflag;
+	view_layer_cow->passflag = view_layer_orig->passflag;
+	view_layer_cow->pass_alpha_threshold = view_layer_orig->pass_alpha_threshold;
+	// Synchronize ID properties.
+	IDP_Reset(view_layer_cow->properties, view_layer_orig->properties);
+	IDP_Reset(view_layer_cow->id_properties, view_layer_orig->id_properties);
+	// Synchronize layer collections.
+	update_copy_on_write_layer_collections(
+	        &view_layer_cow->layer_collections,
+	        &view_layer_orig->layer_collections);
+}
+
+void update_copy_on_write_view_layers(const Depsgraph *depsgraph,
+                                      Scene *scene_cow,
+                                      const Scene *scene_orig)
+{
+	const ViewLayer *view_layer_orig = (const ViewLayer *)scene_orig->view_layers.first;
+	ViewLayer *view_layer_cow = (ViewLayer *)scene_cow->view_layers.first;
+	while (view_layer_orig != NULL) {
+		update_copy_on_write_view_layer(depsgraph,
+		                                view_layer_cow,
+		                                view_layer_orig);
+		view_layer_orig = view_layer_orig->next;
+		view_layer_cow = view_layer_cow->next;
+	}
+}
+
+void update_copy_on_write_scene_collections(
+        ListBase *collections_cow,
+        const ListBase *collections_orig);
+
+void update_copy_on_write_scene_collection(
+        SceneCollection *collection_cow,
+        const SceneCollection *collection_orig)
+{
+	collection_cow->active_object_index = collection_orig->active_object_index;
+	update_copy_on_write_scene_collections(
+	        &collection_cow->scene_collections,
+	        &collection_orig->scene_collections);
+}
+
+void update_copy_on_write_scene_collections(
+        ListBase *collections_cow,
+        const ListBase *collections_orig)
+{
+	const SceneCollection *nested_collection_orig =
+	        (const SceneCollection *)collections_orig->first;
+	SceneCollection *nested_collection_cow =
+	        (SceneCollection *)collections_cow->first;
+	while (nested_collection_orig != NULL) {
+		update_copy_on_write_scene_collection(
+		        nested_collection_cow,
+		        nested_collection_orig);
+		nested_collection_orig = nested_collection_orig->next;
+		nested_collection_cow = nested_collection_cow->next;
+	}
+}
+
 /* Update copy-on-write version of scene from original scene. */
 void update_copy_on_write_scene(const Depsgraph *depsgraph,
                                 Scene *scene_cow,
@@ -476,33 +608,10 @@ void update_copy_on_write_scene(const Depsgraph *depsgraph,
 	// TODO(sergey): Are we missing something here?
 	scene_cow->r.cfra = scene_orig->r.cfra;
 	scene_cow->r.subframe = scene_orig->r.subframe;
-	// Update bases.
-	const ViewLayer *view_layer_orig = (ViewLayer *)scene_orig->view_layers.first;
-	ViewLayer *view_layer_cow = (ViewLayer *)scene_cow->view_layers.first;
-	while (view_layer_orig != NULL) {
-		// Update pointers to active base.
-		if (view_layer_orig->basact == NULL) {
-			view_layer_cow->basact = NULL;
-		}
-		else {
-			const Object *obact_orig = view_layer_orig->basact->object;
-			Object *obact_cow = (Object *)depsgraph->get_cow_id(&obact_orig->id);
-			view_layer_cow->basact = BKE_view_layer_base_find(view_layer_cow, obact_cow);
-		}
-		// Update base flags.
-		//
-		// TODO(sergey): We should probably check visibled/selectabled
-		// flag here?
-		const Base *base_orig = (Base *)view_layer_orig->object_bases.first;
-		Base *base_cow = (Base *)view_layer_cow->object_bases.first;;
-		while (base_orig != NULL) {
-			base_cow->flag = base_orig->flag;
-			base_orig = base_orig->next;
-			base_cow = base_cow->next;
-		}
-		view_layer_orig = view_layer_orig->next;
-		view_layer_cow = view_layer_cow->next;
-	}
+	// Update view layers and collections.
+	update_copy_on_write_view_layers(depsgraph, scene_cow, scene_orig);
+	update_copy_on_write_scene_collection(scene_cow->collection,
+	                                      scene_orig->collection);
 	// Update edit object pointer.
 	if (scene_orig->obedit != NULL) {
 		scene_cow->obedit = (Object *)depsgraph->get_cow_id(&scene_orig->obedit->id);



More information about the Bf-blender-cvs mailing list