[Bf-blender-cvs] [6432c8cc00] blender2.8: Layers: get/update CollectionEngineSettings (depsgraph placeholder)

Dalai Felinto noreply at git.blender.org
Tue Feb 7 17:01:23 CET 2017


Commit: 6432c8cc002cb7391e2ac5eae3c300fed28fc422
Author: Dalai Felinto
Date:   Tue Feb 7 16:54:09 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB6432c8cc002cb7391e2ac5eae3c300fed28fc422

Layers: get/update CollectionEngineSettings (depsgraph placeholder)

Every time:
  * A collection settings is set
  * A collection visibility changes
  * An object is added/removed/ ...

We need to recalculate the "accumulated" CollectionEngineSettings that
the render engine should use for an object.

This is to be handled by the depsgraph. Meanwhile this code should allow
us to start using those settings in the render engines.

Note: We are storing this in the objects, which means we can only have
one active calculated option every time.

This is intended to get the conversation with the Depsgraph department
going.

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

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/writefile.c
M	source/blender/draw/engines/clay/clay.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 de8a577d27..a1eec8653a 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -71,7 +71,9 @@ 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_update(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 SceneLayer *sl, const char *engine_name);
 
 void BKE_layer_collection_free(struct SceneLayer *sl, struct LayerCollection *lc);
 
@@ -103,8 +105,9 @@ typedef void (*CollectionEngineSettingsCB)(struct RenderEngine *engine, struct C
 struct CollectionEngineSettings *BKE_layer_collection_engine_get(struct LayerCollection *lc, const char *engine_name);
 void BKE_layer_collection_engine_settings_callback_register(struct Main *bmain, const char *engine_name, CollectionEngineSettingsCB func);
 void BKE_layer_collection_engine_settings_callback_free(void);
-void BKE_layer_collection_engine_settings_create(struct ListBase *lb, const char *engine_name);
-void BKE_layer_collection_engine_settings_free(struct ListBase *lb);
+
+struct CollectionEngineSettings *BKE_layer_collection_engine_settings_create(const char *engine_name);
+void BKE_layer_collection_engine_settings_free(struct CollectionEngineSettings *ces);
 
 void BKE_collection_engine_property_add_float(struct CollectionEngineSettings *ces, const char *name, float value);
 void BKE_collection_engine_property_add_int(struct CollectionEngineSettings *ces, const char *name, int value);
@@ -195,10 +198,10 @@ void BKE_visible_bases_Iterator_end(Iterator *iter);
 }
 
 /* temporary hacky solution waiting for final depsgraph evaluation */
-#define DEG_OBJECT_ITER(sl_, ob_)                                             \
+#define DEG_OBJECT_ITER(sl_, engine_name_, ob_)                               \
 {                                                                             \
 	/* temporary solution, waiting for depsgraph update */                    \
-	BKE_scene_layer_engine_settings_update(sl);                               \
+	BKE_scene_layer_engine_settings_update(sl, engine_name_);                 \
 	                                                                          \
 	/* flush all the data to objects*/                                        \
 	Base *base_;                                                              \
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index f374ebd1e5..2798edfc47 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -119,6 +119,7 @@ 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);
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 28c5e9aff5..c36a67c27b 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -49,8 +49,10 @@ struct CollectionEngineSettingsCB_Type;
 static void layer_collection_free(SceneLayer *sl, LayerCollection *lc);
 static LayerCollection *layer_collection_add(SceneLayer *sl, ListBase *lb, SceneCollection *sc);
 static LayerCollection *find_layer_collection_by_scene_collection(LayerCollection *lc, const SceneCollection *sc);
-static void collection_engine_settings_create(ListBase *lb, struct CollectionEngineSettingsCB_Type *ces_type);
+static CollectionEngineSettings *collection_engine_settings_create(struct CollectionEngineSettingsCB_Type *ces_type);
+static void layer_collection_engine_settings_free(LayerCollection *lc);
 static void layer_collection_create_engine_settings(LayerCollection *lc);
+static void scene_layer_engine_settings_update(SceneLayer *sl, Object *ob, const char *engine_name);
 static void object_bases_Iterator_next(Iterator *iter, const int flag);
 
 /* RenderLayer */
@@ -257,8 +259,6 @@ void BKE_scene_layer_base_flag_recalculate(SceneLayer *sl)
 			base->flag &= ~BASE_SELECTED;
 		}
 	}
-
-	BKE_scene_layer_engine_settings_recalculate(sl);
 }
 
 /**
@@ -266,9 +266,45 @@ void BKE_scene_layer_base_flag_recalculate(SceneLayer *sl)
  *
  * Temporary function, waiting for real depsgraph
  */
-void BKE_scene_layer_engine_settings_recalculate(struct SceneLayer *sl)
+void BKE_scene_layer_engine_settings_recalculate(SceneLayer *sl)
 {
 	sl->flag |= SCENE_LAYER_ENGINE_DIRTY;
+	for (Base *base = sl->object_bases.first; base; base = base->next) {
+		base->flag |= BASE_DIRTY_ENGINE_SETTINGS;
+	}
+}
+
+/**
+ * Tag Object in SceneLayer to recalculation
+ *
+ * Temporary function, waiting for real depsgraph
+ */
+void BKE_scene_layer_engine_settings_object_recalculate(SceneLayer *sl, Object *ob)
+{
+	Base *base = BLI_findptr(&sl->object_bases, ob, offsetof(Base, object));
+	if (base) {
+		sl->flag |= SCENE_LAYER_ENGINE_DIRTY;
+		base->flag |= BASE_DIRTY_ENGINE_SETTINGS;
+	}
+}
+
+/**
+ * Tag all Objects in LayerCollection to recalculation
+ *
+ * Temporary function, waiting for real depsgraph
+ */
+void BKE_scene_layer_engine_settings_collection_recalculate(SceneLayer *sl, LayerCollection *lc)
+{
+	sl->flag |= SCENE_LAYER_ENGINE_DIRTY;
+
+	for (LinkData *link = lc->object_bases.first; link; link = link->next) {
+		Base *base = (Base *)link->data;
+		base->flag |= BASE_DIRTY_ENGINE_SETTINGS;
+	}
+
+	for (LayerCollection *lcn = lc->layer_collections.first; lcn; lcn = lcn->next) {
+		BKE_scene_layer_engine_settings_collection_recalculate(sl, lcn);
+	}
 }
 
 /**
@@ -276,14 +312,21 @@ void BKE_scene_layer_engine_settings_recalculate(struct SceneLayer *sl)
  *
  * Temporary function, waiting for real depsgraph
  */
-void BKE_scene_layer_engine_settings_update(struct SceneLayer *sl)
+void BKE_scene_layer_engine_settings_update(struct SceneLayer *sl, const char *engine_name)
 {
 	if ((sl->flag & SCENE_LAYER_ENGINE_DIRTY) == 0) {
 		return;
 	}
 
 	/* do the complete settings update */
-	TODO_LAYER_DEPSGRAPH;
+	for (Base *base = sl->object_bases.first; base; base = base->next) {
+		if (((base->flag & BASE_DIRTY_ENGINE_SETTINGS) != 0) && \
+		    (base->flag & BASE_VISIBLED) != 0)
+		{
+			scene_layer_engine_settings_update(sl, base->object, engine_name);
+			base->flag &= ~BASE_DIRTY_ENGINE_SETTINGS;
+		}
+	}
 
 	sl->flag &= ~SCENE_LAYER_ENGINE_DIRTY;
 }
@@ -324,7 +367,7 @@ static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
 
 	BLI_freelistN(&lc->object_bases);
 	BLI_freelistN(&lc->overrides);
-	BKE_layer_collection_engine_settings_free(&lc->engine_settings);
+	layer_collection_engine_settings_free(lc);
 
 	for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
 		layer_collection_free(sl, nlc);
@@ -442,6 +485,7 @@ void BKE_collection_unlink(SceneLayer *sl, LayerCollection *lc)
 {
 	BKE_layer_collection_free(sl, lc);
 	BKE_scene_layer_base_flag_recalculate(sl);
+	BKE_scene_layer_engine_settings_collection_recalculate(sl, lc);
 
 	BLI_remlink(&sl->layer_collections, lc);
 	MEM_freeN(lc);
@@ -462,6 +506,7 @@ static void layer_collection_object_add(SceneLayer *sl, LayerCollection *lc, Obj
 	BLI_addtail(&lc->object_bases, BLI_genericNodeN(base));
 
 	BKE_scene_layer_base_flag_recalculate(sl);
+	BKE_scene_layer_engine_settings_object_recalculate(sl, ob);
 }
 
 static void layer_collection_object_remove(SceneLayer *sl, LayerCollection *lc, Object *ob)
@@ -599,6 +644,7 @@ void BKE_layer_sync_object_unlink(Scene *scene, SceneCollection *sc, Object *ob)
 			}
 		}
 		BKE_scene_layer_base_flag_recalculate(sl);
+		BKE_scene_layer_engine_settings_object_recalculate(sl, ob);
 	}
 }
 
@@ -633,7 +679,8 @@ static void create_engine_settings_layer_collection(LayerCollection *lc, Collect
 		return;
 	}
 
-	collection_engine_settings_create(&lc->engine_settings, ces_type);
+	CollectionEngineSettings *ces = collection_engine_settings_create(ces_type);
+	BLI_addtail(&lc->engine_settings, ces);
 
 	for (LayerCollection *lcn = lc->layer_collections.first; lcn; lcn = lcn->next) {
 		create_engine_settings_layer_collection(lcn, ces_type);
@@ -680,15 +727,16 @@ void BKE_layer_collection_engine_settings_callback_free(void)
 	BLI_freelistN(&R_engines_settings_callbacks);
 }
 
-static void collection_engine_settings_create(ListBase *lb, CollectionEngineSettingsCB_Type *ces_type)
+static CollectionEngineSettings *collection_engine_settings_create(CollectionEngineSettingsCB_Type *ces_type)
 {
 	/* create callback data */
 	CollectionEngineSettings *ces = MEM_callocN(sizeof(CollectionEngineSettings), "Collection Engine Settings");
 	BLI_strncpy_utf8(ces->name, ces_type->name, sizeof(ces->name));
-	BLI_addtail(lb, ces);
 
 	/* call callback */
 	ces_type->callback(NULL, ces);
+
+	return ces;
 }
 
 /**
@@ -697,26 +745,30 @@ static void collection_engine_settings_create(ListBase *lb, CollectionEngineSett
  * Usually we would pass LayerCollection->engine_settings
  * But depsgraph uses this for Object->collection_settings
  */
-void BKE_layer_collection_engine_settings_create(ListBase *lb, const char *engine_name)
+CollectionEngineSettings *BKE_layer_collection_engine_settings_create(const char *engine_name)
 {
 	CollectionEngineSettingsCB_Type *ces_type;
 	ces_type = BLI_findstring(&R_engines_settings_callbacks, engine_name, offsetof(CollectionEngineSettingsCB_Type, name));
 	BLI_assert(ces_type);
-	collection_engine_settings_create(lb, ces_type);
+
+	CollectionEngineSettings *ces = collection_engine_settings_create(ces_type);
+	return ces;
 }
 
 /**
- * Free the CollectionEngineSettings ListBase
- *
- * Usually we would pass LayerCollection->engine_settings
- * But depsgraph uses this for Objec

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list