[Bf-blender-cvs] [05dc3d43caf] master: Move base flags evaluation to its own function

Sergey Sharybin noreply at git.blender.org
Wed Feb 27 14:48:52 CET 2019


Commit: 05dc3d43caf5a5153a8bd1e69d5f77b0e019aa3d
Author: Sergey Sharybin
Date:   Tue Feb 26 15:58:37 2019 +0100
Branches: master
https://developer.blender.org/rB05dc3d43caf5a5153a8bd1e69d5f77b0e019aa3d

Move base flags evaluation to its own function

No need to have iterator loop in the view layer evaluation,
this only makes it more difficult to have base flags covered
by the dependency graph.

Other good thing is that we don't need to worry about whether
base has been removed from the evaluated view layer or not.

Reviewers: brecht

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D4414

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/object_update.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/makesdna/DNA_layer_types.h

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 36f977ea244..e3a182f9ec1 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -114,11 +114,6 @@ bool BKE_layer_collection_set_visible(struct ViewLayer *view_layer, struct Layer
 
 /* evaluation */
 
-void BKE_layer_eval_view_layer(
-        struct Depsgraph *depsgraph,
-        struct Scene *scene,
-        struct ViewLayer *view_layer);
-
 void BKE_layer_eval_view_layer_indexed(
         struct Depsgraph *depsgraph,
         struct Scene *scene,
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 86c71b5a9fb..66a3d96cbdc 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -260,7 +260,7 @@ void BKE_object_data_select_update(
         struct Depsgraph *depsgraph,
         struct ID *object_data);
 
-void BKE_object_eval_flush_base_flags(
+void BKE_object_eval_eval_base_flags(
         struct Depsgraph *depsgraph,
         struct Scene *scene, const int view_layer_index,
         struct Object *object, int base_index,
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 11bcbadecbe..74c7ce6d9bd 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -1462,18 +1462,13 @@ void BKE_view_layer_bases_in_mode_iterator_end(BLI_Iterator *UNUSED(iter))
 
 /* Evaluation  */
 
-void BKE_layer_eval_view_layer(
+static void layer_eval_view_layer(
         struct Depsgraph *depsgraph,
         struct Scene *UNUSED(scene),
         ViewLayer *view_layer)
 {
 	DEG_debug_print_eval(depsgraph, __func__, view_layer->name, view_layer);
 
-	/* Visibility based on depsgraph mode. */
-	const eEvaluationMode mode = DEG_get_mode(depsgraph);
-	const int base_enabled_flag = (mode == DAG_EVAL_VIEWPORT)
-	        ? BASE_ENABLED_VIEWPORT
-	        : BASE_ENABLED_RENDER;
 	/* Create array of bases, for fast index-based lookup. */
 	const int num_object_bases = BLI_listbase_count(&view_layer->object_bases);
 	MEM_SAFE_FREE(view_layer->object_bases_array);
@@ -1481,37 +1476,8 @@ void BKE_layer_eval_view_layer(
 	        num_object_bases, sizeof(Base *), "view_layer->object_bases_array");
 	int base_index = 0;
 	for (Base *base = view_layer->object_bases.first; base; base = base->next) {
-		/* Compute visibility for depsgraph evaluation mode. */
-		if (base->flag & base_enabled_flag) {
-			base->flag |= BASE_ENABLED;
-
-			/* When rendering, visibility is controlled by the enable/disable option. */
-			if (mode == DAG_EVAL_RENDER) {
-				base->flag |= BASE_VISIBLE;
-			}
-		}
-		else {
-			base->flag &= ~(BASE_ENABLED | BASE_VISIBLE | BASE_SELECTABLE);
-		}
-		/* If base is not selectabled, clear select. */
-		if ((base->flag & BASE_SELECTABLE) == 0) {
-			base->flag &= ~BASE_SELECTED;
-		}
 		view_layer->object_bases_array[base_index++] = base;
 	}
-	/* Flush back base flag to the original view layer for editing. */
-	if (DEG_is_active(depsgraph) && (view_layer == DEG_get_evaluated_view_layer(depsgraph))) {
-		ViewLayer *view_layer_orig = DEG_get_input_view_layer(depsgraph);
-		Base *base_orig = view_layer_orig->object_bases.first;
-		const Base *base_eval = view_layer->object_bases.first;
-		while (base_orig != NULL) {
-			if (base_orig->flag & base_enabled_flag) {
-				base_orig->flag = base_eval->flag;
-				base_eval = base_eval->next;
-			}
-			base_orig = base_orig->next;
-		}
-	}
 }
 
 void BKE_layer_eval_view_layer_indexed(
@@ -1522,5 +1488,5 @@ void BKE_layer_eval_view_layer_indexed(
 	BLI_assert(view_layer_index >= 0);
 	ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index);
 	BLI_assert(view_layer != NULL);
-	BKE_layer_eval_view_layer(depsgraph, scene, view_layer);
+	layer_eval_view_layer(depsgraph, scene, view_layer);
 }
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index dd0b5668c25..da6960ebc95 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -405,10 +405,10 @@ void BKE_object_data_select_update(Depsgraph *depsgraph, ID *object_data)
 	}
 }
 
-void BKE_object_eval_flush_base_flags(Depsgraph *depsgraph,
-                                      Scene *scene, const int view_layer_index,
-                                      Object *object, int base_index,
-                                      const bool is_from_set)
+void BKE_object_eval_eval_base_flags(Depsgraph *depsgraph,
+                                     Scene *scene, const int view_layer_index,
+                                     Object *object, int base_index,
+                                     const bool is_from_set)
 {
 	/* TODO(sergey): Avoid list lookup. */
 	BLI_assert(view_layer_index >= 0);
@@ -422,6 +422,28 @@ void BKE_object_eval_flush_base_flags(Depsgraph *depsgraph,
 
 	DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
 
+	/* Visibility based on depsgraph mode. */
+	const eEvaluationMode mode = DEG_get_mode(depsgraph);
+	const int base_enabled_flag = (mode == DAG_EVAL_VIEWPORT)
+	        ? BASE_ENABLED_VIEWPORT
+	        : BASE_ENABLED_RENDER;
+
+	/* Compute visibility for depsgraph evaluation mode. */
+	if (base->flag & base_enabled_flag) {
+		base->flag |= BASE_ENABLED;
+		/* When rendering, visibility is controlled by the enable/disable option. */
+		if (mode == DAG_EVAL_RENDER) {
+			base->flag |= BASE_VISIBLE;
+		}
+	}
+	else {
+		base->flag &= ~(BASE_ENABLED | BASE_VISIBLE | BASE_SELECTABLE);
+	}
+	/* If base is not selectable, clear select. */
+	if ((base->flag & BASE_SELECTABLE) == 0) {
+		base->flag &= ~BASE_SELECTED;
+	}
+
 	/* Copy flags and settings from base. */
 	object->base_flag = base->flag;
 	if (is_from_set) {
@@ -438,4 +460,12 @@ void BKE_object_eval_flush_base_flags(Depsgraph *depsgraph,
 			BKE_particle_batch_cache_dirty_tag(psys, BKE_PARTICLE_BATCH_DIRTY_ALL);
 		}
 	}
+
+	/* Copy base flag back to the original view layer for editing. */
+	if (DEG_is_active(depsgraph) && (view_layer == DEG_get_evaluated_view_layer(depsgraph))) {
+		Base *base_orig = base->base_orig;
+		BLI_assert(base_orig != NULL);
+		BLI_assert(base_orig->object != NULL);
+		base_orig->flag = base->flag;
+	}
 }
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 0fe4afd7b55..d0723ea0ded 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -658,7 +658,7 @@ void DepsgraphNodeBuilder::build_object_flags(
 	add_operation_node(&object->id,
 	                   NodeType::OBJECT_FROM_LAYER,
 	                   OperationCode::OBJECT_BASE_FLAGS,
-	                   function_bind(BKE_object_eval_flush_base_flags,
+	                   function_bind(BKE_object_eval_eval_base_flags,
 	                                 _1,
 	                                 scene_cow,
 	                                 view_layer_index_,
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 bd713058cce..86786a968a3 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
@@ -368,12 +368,7 @@ void view_layer_remove_disabled_bases(const Depsgraph *depsgraph,
 	const int base_enabled_flag = (depsgraph->mode == DAG_EVAL_VIEWPORT) ?
 		BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER;
 	ListBase enabled_bases = {NULL, NULL};
-	for (Base *base = reinterpret_cast<Base *>(view_layer->object_bases.first),
-	          *base_next;
-	     base != NULL;
-	     base = base_next)
-	{
-		base_next = base->next;
+	LISTBASE_FOREACH_MUTABLE (Base *, base, &view_layer->object_bases) {
 		const bool is_object_enabled = (base->flag & base_enabled_flag);
 		if (is_object_enabled) {
 			BLI_addtail(&enabled_bases, base);
@@ -388,12 +383,26 @@ void view_layer_remove_disabled_bases(const Depsgraph *depsgraph,
 	view_layer->object_bases = enabled_bases;
 }
 
-void scene_cleanup_view_layers(const Depsgraph *depsgraph, Scene *scene_cow)
+void view_layer_update_orig_base_pointers(ViewLayer *view_layer_orig,
+                                          ViewLayer *view_layer_eval)
+{
+	Base *base_orig =
+	        reinterpret_cast<Base *>(view_layer_orig->object_bases.first);
+	LISTBASE_FOREACH (Base *, base_eval, &view_layer_eval->object_bases) {
+		base_eval->base_orig = base_orig;
+		base_orig = base_orig->next;
+	}
+}
+
+void scene_setup_view_layers_after_copy(const Depsgraph *depsgraph,
+                                        Scene *scene_cow)
 {
 	scene_remove_unused_view_layers(depsgraph, scene_cow);
-	view_layer_remove_disabled_bases(
-	        depsgraph,
-	        reinterpret_cast<ViewLayer *>(scene_cow->view_layers.first));
+	ViewLayer *view_layer_orig = depsgraph->view_layer;
+	ViewLayer *view_layer_eval =
+	        reinterpret_cast<ViewLayer *>(scene_cow->view_layers.first);
+	view_layer_update_orig_base_pointers(view_layer_orig, view_layer_eval);
+	view_layer_remove_disabled_bases(depsgraph, view_layer_eval);
 	/* TODO(sergey): Remove objects from collections as well.
 	 * Not a HUGE deal for now, nobody is looking into those CURRENTLY.
 	 * Still not an excuse to have those. */
@@ -720,7 +729,7 @@ ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph,
 		{
 			done = scene_copy_inplace_no_main((Scene *)id_orig, (Scene *)id_cow);
 			if (done) {
-				scene_cleanup_view_layers(depsgraph, (Scene *)id_cow);
+				scene_setup_view_layers_after_copy(depsgraph, (Scene *)id_cow);
 			}
 			break;
 		}
diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h
index 1462d456563..44246952468 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -36,6 +36,11 @@ typedef struct Base {
 	struct Object *object;
 	unsigned int lay DNA_DEPRECATED;
 	int flag_legacy;
+
+	/* Pointer to an original base. Is initiali

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list