[Bf-blender-cvs] [eba09b1520c] blender2.8: Blender 2.8: Hook of layer collections evaluation in DEG

Sergey Sharybin noreply at git.blender.org
Sat Apr 1 01:46:55 CEST 2017


Commit: eba09b1520c06df304bc353e93d7220b4e83b755
Author: Sergey Sharybin
Date:   Fri Mar 17 12:47:29 2017 +0100
Branches: blender2.8
https://developer.blender.org/rBeba09b1520c06df304bc353e93d7220b4e83b755

Blender 2.8: 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 its 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 also includes the evaluation of IDProperty for collections,
which basically are just another form of override. So once we implement
the other kind of overrides the flushing and collection evaluation won't
change.

Patch by Sergey Sharybin and Dalai Felinto

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/blenloader/intern/writefile.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/draw/intern/draw_manager.c
M	source/blender/editors/render/render_shading.c
M	source/blender/editors/space_outliner/outliner_collections.c
M	source/blender/editors/space_outliner/outliner_draw.c
M	source/blender/editors/space_outliner/outliner_tools.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesdna/DNA_object_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 07d1c255188..9e7155cf482 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -44,6 +44,7 @@ extern "C" {
 
 #define ROOT_PROP "root"
 
+struct EvaluationContext;
 struct LayerCollection;
 struct ID;
 struct IDProperty;
@@ -72,12 +73,6 @@ struct SceneLayer *BKE_scene_layer_find_from_collection(const struct Scene *scen
 struct Base *BKE_scene_layer_base_find(struct SceneLayer *sl, struct Object *ob);
 void BKE_scene_layer_base_deselect_all(struct SceneLayer *sl);
 void BKE_scene_layer_base_select(struct SceneLayer *sl, struct Base *selbase);
-void BKE_scene_layer_base_flag_recalculate(struct SceneLayer *sl);
-
-void BKE_scene_layer_engine_settings_recalculate(struct SceneLayer *sl);
-void BKE_scene_layer_engine_settings_object_recalculate(struct SceneLayer *sl, struct Object *ob);
-void BKE_scene_layer_engine_settings_collection_recalculate(struct SceneLayer *sl, struct LayerCollection *lc);
-void BKE_scene_layer_engine_settings_update(struct Scene *scene, struct SceneLayer *sl);
 
 void BKE_layer_collection_free(struct SceneLayer *sl, struct LayerCollection *lc);
 
@@ -129,6 +124,18 @@ void BKE_collection_engine_property_value_set_int(struct IDProperty *props, cons
 void BKE_collection_engine_property_value_set_float(struct IDProperty *props, const char *name, float value);
 void BKE_collection_engine_property_value_set_bool(struct IDProperty *props, const char *name, bool value);
 
+/* evaluation */
+
+void BKE_layer_eval_layer_collection_pre(struct EvaluationContext *eval_ctx,
+                                         struct Scene *scene,
+                                         struct SceneLayer *scene_layer);
+void BKE_layer_eval_layer_collection(struct EvaluationContext *eval_ctx,
+                                     struct Scene *scene,
+                                     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);
@@ -188,18 +195,18 @@ void BKE_visible_bases_Iterator_end(Iterator *iter);
 	IteratorBeginCb func_begin;                                               \
 	IteratorCb func_next, func_end;                                           \
 	void *data_in;                                                            \
-                                                                                  \
+	                                                                          \
 	if (flag == SELECT) {                                                     \
-		func_begin = &BKE_selected_objects_Iterator_begin;                \
-		func_next = &BKE_selected_objects_Iterator_next;                  \
-		func_end = &BKE_selected_objects_Iterator_end;                    \
-		data_in = (sl);                                                   \
+	    func_begin = &BKE_selected_objects_Iterator_begin;                    \
+	    func_next = &BKE_selected_objects_Iterator_next;                      \
+	    func_end = &BKE_selected_objects_Iterator_end;                        \
+	    data_in = (sl);                                                       \
 	}                                                                         \
 	else {                                                                    \
-		func_begin = BKE_scene_objects_Iterator_begin;                    \
-		func_next = BKE_scene_objects_Iterator_next;                      \
-		func_end = BKE_scene_objects_Iterator_end;                        \
-		data_in = (scene);                                                \
+	    func_begin = BKE_scene_objects_Iterator_begin;                        \
+	    func_next = BKE_scene_objects_Iterator_next;                          \
+	    func_end = BKE_scene_objects_Iterator_end;                            \
+	    data_in = (scene);                                                    \
 	}                                                                         \
 	ITER_BEGIN(func_begin, func_next, func_end, data_in, Object *, _instance)
 
@@ -208,24 +215,20 @@ void BKE_visible_bases_Iterator_end(Iterator *iter);
 	ITER_END                                                                  \
 }
 
-/* temporary hacky solution waiting for final depsgraph evaluation */
-#define DEG_OBJECT_ITER(scene_, sl_, instance_)                               \
+/* temporary hacky solution waiting for CoW depsgraph implementation */
+#define DEG_OBJECT_ITER(sl_, instance_)                                       \
 {                                                                             \
+	/* flush all the depsgraph data to objects */                             \
 	Object *instance_;                                                        \
-	/* temporary solution, waiting for depsgraph update */                    \
-	BKE_scene_layer_engine_settings_update(scene_, sl_);                      \
-                                                                                  \
-	/* flush all the data to objects*/                                        \
 	Base *base_;                                                              \
 	for (base_ = (sl_)->object_bases.first; base_; base_ = base_->next) {     \
-	if ((base_->flag & BASE_VISIBLED) == 0) {                                 \
-		continue;                                                         \
-	}                                                                         \
-                                                                                  \
-	instance_ = base_->object;                                                \
-	instance_->base_flag = base_->flag;
+	    if ((base_->flag & BASE_VISIBLED) != 0) {                             \
+	        instance_ = base_->object;                                        \
+	        instance_->base_flag = base_->flag;                               \
+	        instance_->base_collection_properties = base_->collection_properties;
 
 #define DEG_OBJECT_ITER_END                                                   \
+        }                                                                     \
     }                                                                         \
 }
 
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index b4662393151..b16162dfbc0 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -119,7 +119,6 @@ static void layer_collection_remove(SceneLayer *sl, ListBase *lb, const SceneCol
 	LayerCollection *lc = lb->first;
 	while (lc) {
 		if (lc->scene_collection == sc) {
-			BKE_scene_layer_engine_settings_collection_recalculate(sl, lc);
 			BKE_layer_collection_free(sl, lc);
 			BLI_remlink(lb, lc);
 
@@ -165,7 +164,6 @@ bool BKE_collection_remove(Scene *scene, SceneCollection *sc)
 	/* check all layers that use this collection and clear them */
 	for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
 		layer_collection_remove(sl, &sl->layer_collections, sc);
-		BKE_scene_layer_base_flag_recalculate(sl);
 		sl->active_collection = 0;
 	}
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 45ef1adc2e9..242ab9ae159 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_idprop.h"
 #include "BKE_layer.h"
 #include "BKE_main.h"
@@ -48,6 +50,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);
@@ -56,7 +60,6 @@ static LayerCollection *find_layer_collection_by_scene_collection(LayerCollectio
 static IDProperty *collection_engine_settings_create(struct CollectionEngineSettingsCB_Type *ces_type, const bool populate);
 static IDProperty *collection_engine_get(IDProperty *root, const int type, const char *engine_name);
 static void collection_engine_settings_init(IDProperty *root, const bool populate);
-static void scene_layer_engine_settings_update(Scene *scene, SceneLayer *sl, Object *ob);
 static void object_bases_Iterator_next(Iterator *iter, const int flag);
 
 /* RenderLayer */
@@ -145,6 +148,13 @@ bool BKE_scene_layer_remove(Main *bmain, Scene *scene, SceneLayer *sl)
 void BKE_scene_layer_free(SceneLayer *sl)
 {
 	sl->basact = NULL;
+
+	for (Base *base = sl->object_bases.first; base; base = base->next) {
+		if (base->collection_properties) {
+			IDP_FreeProperty(base->collection_properties);
+			MEM_freeN(base->collection_properties);
+		}
+	}
 	BLI_freelistN(&sl->object_bases);
 
 	for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
@@ -236,124 +246,14 @@ static void scene_layer_object_base_unref(SceneLayer *sl, Base *base)
 			sl->basact = NULL;
 		}
 
-		BLI_remlink(&sl->object_bases, base);
-		MEM_freeN(base);
-	}
-}
-
-static void layer_collection_base_flag_recalculate(
-        LayerCollection *lc, const bool tree_is_visible, const bool tree_is_selectable)
-{
-	bool is_visible = tree_is_visible && ((lc->flag & COLLECTION_VISIBLE) != 0);
-	/* an object can only be selected if it's visible */
-	bool is_selectable = tree_is_selectable && is_visible && ((lc->flag & COLLECTION_SELECTABLE) != 0);
-
-	for (LinkData *link = lc->object_bases.first; link; link = link->next) {
-		Base *base = link->data;
-
-		if (is_visible) {
-			base->flag |= BASE_VISIBLED;
-		}
-
-		if (is_selectable) {
-			base->flag |= BASE_SELECTABLED;
-		}
-	}
-
-	for (LayerCollection *lcn = lc->layer_collections.first; lcn; lcn = lcn->next) {
-		layer_collection_base_flag_recalculate(lcn, is_visible, is_selectable);
-	}
-}
-
-/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list