[Bf-blender-cvs] [8c1536d326] temp-depsgraph-layers: Blender 2.8: Initial hook of layer collections evaluation in DEG

Sergey Sharybin noreply at git.blender.org
Mon Mar 20 19:48:13 CET 2017


Commit: 8c1536d326ccb6e5f3b7e32384a88cec743efd73
Author: Sergey Sharybin
Date:   Fri Mar 17 12:47:29 2017 +0100
Branches: temp-depsgraph-layers
https://developer.blender.org/rB8c1536d326ccb6e5f3b7e32384a88cec743efd73

Blender 2.8: Initial hook of layer collections evaluation in DEG

This moves selectability/visibility flag flush from some hardcoded
places in the code to depsgraph. This way it is possible to simply
tag depsgraph to update those flags and rest it'll do on it's own.

Using depsgraph for such flush is an overkill: those flags are fully
static and can not be animated, so it doesn't really make sense to
hook only those to depsgraph.

However, in the future we will have overrides on collections, which
ideally would need to be animatable and drivable and easiest way
to support this is to do this on depsgraph level, so it ensures
proper order of evaluation for animation and drivers. And it seems
logical to do both overrides and flags flush from depsgraph from
this point of view.

This commit lacks two things:

1. Proper flag for DAG_id_tag_update(), so currently the only way
   to inform depsgraph about nered to flush visiblity/selectability
   flags is to tag scene ID for update. Flag of 0 will to the trick
   for now.

2. Any operation which changes layer collections or render layers
   need to tag relations to update. This is not done, so any change
   to those will cause crash.

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/depsgraph/CMakeLists.txt
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
A	source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
A	source/blender/depsgraph/intern/builder/deg_builder_relations_layer.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc
M	source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
M	source/blender/depsgraph/intern/depsgraph_type_defines.cc
M	source/blender/depsgraph/intern/depsgraph_types.h
M	source/blender/depsgraph/intern/nodes/deg_node_component.cc
M	source/blender/depsgraph/intern/nodes/deg_node_component.h
M	source/blender/editors/space_outliner/outliner_draw.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index e1ae266aaa..24d8f26a71 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -43,6 +43,7 @@ extern "C" {
 #define TODO_LAYER /* generic todo */
 
 struct CollectionEngineSettings;
+struct EvaluationContext;
 struct LayerCollection;
 struct ID;
 struct ListBase;
@@ -132,6 +133,16 @@ void BKE_collection_engine_property_value_set_bool(struct CollectionEngineSettin
 bool BKE_collection_engine_property_use_get(struct CollectionEngineSettings *ces, const char *name);
 void BKE_collection_engine_property_use_set(struct CollectionEngineSettings *ces, const char *name, bool value);
 
+/* evaluation */
+
+void BKE_layer_eval_layer_collection_pre(struct EvaluationContext *eval_ctx,
+                                         struct SceneLayer *scene_layer);
+void BKE_layer_eval_layer_collection(struct EvaluationContext *eval_ctx,
+                                     struct LayerCollection *layer_collection,
+                                     struct LayerCollection *parent_layer_collection);
+void BKE_layer_eval_layer_collection_post(struct EvaluationContext *eval_ctx,
+                                          struct SceneLayer *scene_layer);
+
 /* iterators */
 
 void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in);
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 6ab7e85cd0..fe638e44b7 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -33,6 +33,8 @@
 #include "BLT_translation.h"
 
 #include "BKE_collection.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
 #include "BKE_layer.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
@@ -47,6 +49,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#define DEBUG_PRINT if (G.debug & G_DEBUG_DEPSGRAPH) printf
+
 /* prototype */
 struct CollectionEngineSettingsCB_Type;
 static void layer_collection_free(SceneLayer *sl, LayerCollection *lc);
@@ -1779,3 +1783,62 @@ void BKE_scene_layer_doversion_update(Main *bmain)
 
 	layer_collection_engine_settings_free(&lc_ref);
 }
+
+/* Evaluation  */
+
+void BKE_layer_eval_layer_collection_pre(EvaluationContext *UNUSED(eval_ctx),
+                                         SceneLayer *scene_layer)
+{
+	DEBUG_PRINT("%s on %s\n", __func__, scene_layer->name);
+	for (Base *base = scene_layer->object_bases.first; base != NULL; base = base->next) {
+		base->flag &= ~(BASE_VISIBLED | BASE_SELECTABLED);
+	}
+	/* TODO(sergey): Is it always required? */
+	scene_layer->flag |= SCENE_LAYER_ENGINE_DIRTY;
+}
+
+void BKE_layer_eval_layer_collection(EvaluationContext *UNUSED(eval_ctx),
+                                     LayerCollection *layer_collection,
+                                     LayerCollection *parent_layer_collection)
+{
+	DEBUG_PRINT("%s on %s, parent %s \n",
+	            __func__,
+	            layer_collection->scene_collection->name,
+	            (parent_layer_collection != NULL) ? parent_layer_collection->scene_collection->name : "NONE");
+
+	layer_collection->flag_evaluated = layer_collection->flag;
+	bool is_visible = (layer_collection->flag & COLLECTION_VISIBLE) != 0;
+	bool is_selectable = (layer_collection->flag & COLLECTION_SELECTABLE) != 0;
+
+	if (parent_layer_collection != NULL) {
+		is_visible &= (parent_layer_collection->flag_evaluated & COLLECTION_VISIBLE) != 0;
+		is_selectable &= (parent_layer_collection->flag_evaluated & COLLECTION_SELECTABLE) != 0;
+		layer_collection->flag_evaluated &= parent_layer_collection->flag_evaluated;
+	}
+
+	for (LinkData *link = layer_collection->object_bases.first; link != NULL; link = link->next) {
+		Base *base = link->data;
+		/* Non-recursive code from base_flag_recalculate(). */
+		if (is_visible) {
+			base->flag |= BASE_VISIBLED;
+		}
+		if (is_selectable) {
+			base->flag |= BASE_SELECTABLED;
+		}
+		/* Non-recursive code from engine_settings_collection_recalculate(). */
+		/* TODO(sergey): Is it always required? */
+		base->flag |= BASE_DIRTY_ENGINE_SETTINGS;
+	}
+}
+
+void BKE_layer_eval_layer_collection_post(EvaluationContext *UNUSED(eval_ctx),
+                                          SceneLayer *scene_layer)
+{
+	DEBUG_PRINT("%s on %s\n", __func__, scene_layer->name);
+	/* if base is not selectabled, clear select */
+	for (Base *base = scene_layer->object_bases.first; base; base = base->next) {
+		if ((base->flag & BASE_SELECTABLED) == 0) {
+			base->flag &= ~BASE_SELECTED;
+		}
+	}
+}
diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt
index 2d32e85bf6..a266f30fe1 100644
--- a/source/blender/depsgraph/CMakeLists.txt
+++ b/source/blender/depsgraph/CMakeLists.txt
@@ -43,11 +43,13 @@ set(SRC
 	intern/builder/deg_builder.cc
 	intern/builder/deg_builder_cycle.cc
 	intern/builder/deg_builder_nodes.cc
+	intern/builder/deg_builder_nodes_layer.cc
 	intern/builder/deg_builder_nodes_rig.cc
 	intern/builder/deg_builder_nodes_scene.cc
 	intern/builder/deg_builder_pchanmap.cc
 	intern/builder/deg_builder_relations.cc
 	intern/builder/deg_builder_relations_keys.cc
+	intern/builder/deg_builder_relations_layer.cc
 	intern/builder/deg_builder_relations_rig.cc
 	intern/builder/deg_builder_relations_scene.cc
 	intern/builder/deg_builder_transitive.cc
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index c9d1d7dd0f..d28aaf6a10 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -41,6 +41,7 @@ struct Image;
 struct FCurve;
 struct Group;
 struct Key;
+struct LayerCollection;
 struct Main;
 struct Material;
 struct Mask;
@@ -161,6 +162,17 @@ struct DepsgraphNodeBuilder {
 	void build_mask(Mask *mask);
 	void build_movieclip(MovieClip *clip);
 
+	struct LayerCollectionState {
+		int index;
+		LayerCollection *parent;
+	};
+	void build_layer_collection(Scene *scene,
+	                            LayerCollection *layer_collection,
+	                            LayerCollectionState *state);
+	void build_layer_collections(Scene *scene,
+	                             ListBase *layer_collections,
+	                             LayerCollectionState *state);
+	void build_scene_layer_collections(Scene *scene);
 protected:
 	Main *m_bmain;
 	Depsgraph *m_graph;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
new file mode 100644
index 0000000000..2decba1ea8
--- /dev/null
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
@@ -0,0 +1,120 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2013 Blender Foundation.
+ * All rights reserved.
+ *
+ * Original Author: Joshua Leung
+ * Contributor(s): Based on original depsgraph.c code - Blender Foundation (2005-2013)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
+ *  \ingroup depsgraph
+ *
+ * Methods for constructing depsgraph's nodes
+ */
+
+#include "intern/builder/deg_builder_nodes.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "MEM_guardedalloc.h"
+
+extern "C" {
+#include "BLI_utildefines.h"
+
+#include "BKE_layer.h"
+
+#include "DNA_scene_types.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+} /* extern "C" */
+
+#include "intern/builder/deg_builder.h"
+#include "intern/nodes/deg_node.h"
+#include "intern/nodes/deg_node_component.h"
+#include "intern/nodes/deg_node_operation.h"
+#include "intern/depsgraph_types.h"
+#include "intern/depsgraph_intern.h"
+#include "util/deg_util_foreach.h"
+
+namespace DEG {
+
+void DepsgraphNodeBuilder::build_layer_collection(Scene *scene,
+                                                  LayerCollection *layer_collection,
+                                                  LayerCollectionState *state)
+{
+	/* TODO(sergey): This will attempt to create component for each collection.
+	 * Harmless but could be optimized.
+	 */
+	ComponentDepsNode *comp = add_component_node(&scene->id, DEPSNODE_TYPE_LAYER_COLLECTIONS);
+
+	add_operation_node(comp,
+	                   DEPSOP_TYPE_EXEC,
+	                   function_bind(BKE_layer_eval_layer_collection,
+	                                 _1,
+	                                 layer_collection,
+	                                 state->parent),
+	                   DEG_OPCODE_SCENE_LAYER_EVAL,
+	                   layer_collection->scene_collection->name,
+	                   state->index);
+	++state->index;
+
+	/* Recurs into nested layer collections. */
+	LayerCollection *parent = state->parent;
+	state->parent = layer_collection;
+	build_layer_collections(scene, &layer_collection->layer_collections, state);
+	state->parent = parent;
+}
+
+void DepsgraphNodeBuilder::build_layer_collections(Scene *scene,
+                                                   ListBase *layer_collections,
+                                                   LayerCollectionState *state)
+{
+	LINKLIST_FOREACH (LayerCollection *, layer_collection, layer_collections) {
+		build_layer_collection(scene, layer_collection, state);
+	}
+}
+
+void DepsgraphNodeBuilder::build_scene_layer_collections(Scene *scene)
+{
+	LayerCollectionState state;
+	state.index = 0;
+	LINKLIST_FOREACH (SceneLayer *

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list