[Bf-blender-cvs] [0b834c4fd9] clay-engine: Introduce Per-Collection Render settings

Dalai Felinto noreply at git.blender.org
Thu Feb 2 11:28:44 CET 2017


Commit: 0b834c4fd9733d073d49ef14d6c982f5850248c8
Author: Dalai Felinto
Date:   Thu Feb 2 11:04:01 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB0b834c4fd9733d073d49ef14d6c982f5850248c8

Introduce Per-Collection Render settings

Pending:

* UI template for those settings (showing USE)
* Depsgraph evaluation of them (to flush into objects)
* RNA to see if a settings is being used

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index e74cfbe9a1..3fb898fa82 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -41,11 +41,13 @@ extern "C" {
 #define TODO_LAYER_OPERATORS /* collection mamanger and property panel operators */
 #define TODO_LAYER /* generic todo */
 
+struct CollectionEngineSettings;
 struct LayerCollection;
 struct ID;
 struct Main;
 struct Object;
 struct ObjectBase;
+struct RenderEngine;
 struct Scene;
 struct SceneCollection;
 struct SceneLayer;
@@ -91,6 +93,16 @@ void BKE_layer_sync_object_unlink(struct Scene *scene, struct SceneCollection *s
 
 void BKE_collection_override_datablock_add(struct LayerCollection *lc, const char *data_path, struct ID *id);
 
+/* engine settings */
+typedef void (*CollectionEngineSettingsCB)(struct RenderEngine *engine, struct CollectionEngineSettings *ces);
+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_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);
+struct CollectionEngineProperty *BKE_collection_engine_property_get(struct CollectionEngineSettings *ces, const char *name);
+
 /* 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 39b0053122..6b77b556a1 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -49,6 +49,7 @@ 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 object_bases_Iterator_next(Iterator *iter, const int flag);
+static void layer_collection_create_engine_settings(LayerCollection *lc);
 
 /* RenderLayer */
 
@@ -296,6 +297,12 @@ static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
 	for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
 		layer_collection_free(sl, nlc);
 	}
+
+	for (CollectionEngineSettings *cse = lc->engine_settings.first; cse; cse = cse->next) {
+		BLI_freelistN(&cse->properties);
+	}
+	BLI_freelistN(&lc->engine_settings);
+
 	BLI_freelistN(&lc->layer_collections);
 }
 
@@ -467,6 +474,7 @@ static LayerCollection *layer_collection_add(SceneLayer *sl, ListBase *lb, Scene
 	lc->scene_collection = sc;
 	lc->flag = COLLECTION_VISIBLE + COLLECTION_SELECTABLE + COLLECTION_FOLDED;
 
+	layer_collection_create_engine_settings(lc);
 	layer_collection_populate(sl, lc, sc);
 	return lc;
 }
@@ -579,6 +587,129 @@ void BKE_collection_override_datablock_add(LayerCollection *UNUSED(lc), const ch
 }
 
 /* ---------------------------------------------------------------------- */
+/* Engine Settings */
+
+ListBase R_engines_settings_callbacks = {NULL, NULL};
+
+typedef struct CollectionEngineSettingsCB_Type {
+	struct CollectionEngineSettingsCB_Type *next, *prev;
+
+	char name[MAX_NAME]; /* engine name */
+
+	CollectionEngineSettingsCB callback;
+
+} CollectionEngineSettingsCB_Type;
+
+
+static void create_engine_settings_layer_collection(LayerCollection *lc, CollectionEngineSettingsCB_Type *ces_type)
+{
+	if (BKE_layer_collection_engine_get(lc, ces_type->name)) {
+		return;
+	}
+
+	/* 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(&lc->engine_settings, ces);
+
+	/* call callback */
+	ces_type->callback(NULL, ces);
+
+	for (LayerCollection *lcn = lc->layer_collections.first; lcn; lcn = lcn->next) {
+		create_engine_settings_layer_collection(lcn, ces_type);
+	}
+}
+
+static void create_engines_settings_scene(Scene *scene, CollectionEngineSettingsCB_Type *ces_type)
+{
+	for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
+		for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+			create_engine_settings_layer_collection(lc, ces_type);
+		}
+	}
+}
+
+void BKE_layer_collection_engine_settings_callback_register(
+        Main *bmain, const char *engine_name, CollectionEngineSettingsCB func)
+{
+	CollectionEngineSettingsCB_Type	*ces_type;
+
+	/* cleanup in case it existed */
+	ces_type = BLI_findstring(&R_engines_settings_callbacks, engine_name, offsetof(CollectionEngineSettingsCB_Type, name));
+
+	if (ces_type) {
+		BLI_remlink(&R_engines_settings_callbacks, ces_type);
+		MEM_freeN(ces_type);
+	}
+
+	ces_type = MEM_callocN(sizeof(CollectionEngineSettingsCB_Type), "collection_engine_type");
+	BLI_strncpy_utf8(ces_type->name, engine_name, sizeof(ces_type->name));
+	ces_type->callback = func;
+	BLI_addtail(&R_engines_settings_callbacks, ces_type);
+
+	if (bmain) {
+		/* populate all of the collections of the scene with those settings */
+		for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
+			create_engines_settings_scene(scene, ces_type);
+		}
+	}
+}
+
+void BKE_layer_collection_engine_settings_callback_free(void)
+{
+	BLI_freelistN(&R_engines_settings_callbacks);
+}
+
+/**
+ * Initialize the render settings for a single LayerCollection
+ */
+static void layer_collection_create_engine_settings(LayerCollection *lc)
+{
+	CollectionEngineSettingsCB_Type *ces_type;
+	for (ces_type = R_engines_settings_callbacks.first; ces_type; ces_type = ces_type->next) {
+		create_engine_settings_layer_collection(lc, ces_type);
+	}
+}
+
+/**
+ * Return layer collection engine settings for specified engine
+ */
+CollectionEngineSettings *BKE_layer_collection_engine_get(LayerCollection *lc, const char *engine_name)
+{
+	CollectionEngineSettings *ces;
+	ces = BLI_findstring(&lc->engine_settings, engine_name, offsetof(CollectionEngineSettings, name));
+	return ces;
+}
+
+/* ---------------------------------------------------------------------- */
+/* Engine Settings Properties */
+
+void BKE_collection_engine_property_add_float(CollectionEngineSettings *ces, const char *name, float value)
+{
+	CollectionEnginePropertyFloat *prop;
+	prop = MEM_callocN(sizeof(CollectionEnginePropertyFloat), "collection engine settings float");
+	prop->data.type = COLLECTION_PROP_TYPE_FLOAT;
+	BLI_strncpy_utf8(prop->data.name, name, sizeof(prop->data.name));
+	prop->value = value;
+	BLI_addtail(&ces->properties, prop);
+}
+
+void BKE_collection_engine_property_add_int(CollectionEngineSettings *ces, const char *name, int value)
+{
+	CollectionEnginePropertyInt *prop;
+	prop = MEM_callocN(sizeof(CollectionEnginePropertyInt), "collection engine settings int");
+	prop->data.type = COLLECTION_PROP_TYPE_INT;
+	BLI_strncpy_utf8(prop->data.name, name, sizeof(prop->data.name));
+	prop->value = value;
+	BLI_addtail(&ces->properties, prop);
+}
+
+CollectionEngineProperty *BKE_collection_engine_property_get(CollectionEngineSettings *ces, const char *name)
+{
+	return BLI_findstring(&ces->properties, name, offsetof(CollectionEngineProperty, name));
+}
+
+/* ---------------------------------------------------------------------- */
 /* Iterators */
 
 static void object_bases_Iterator_begin(Iterator *iter, void *data_in, const int flag)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 134ce910dc..cb69d54fc4 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5559,6 +5559,7 @@ static void direct_link_object(FileData *fd, Object *ob)
 	ob->bb = NULL;
 	ob->derivedDeform = NULL;
 	ob->derivedFinal = NULL;
+	ob->collection_settings = NULL;
 	BLI_listbase_clear(&ob->gpulamp);
 	link_list(fd, &ob->pc_ids);
 
@@ -5931,6 +5932,14 @@ static void direct_link_scene_collection(FileData *fd, SceneCollection *sc)
 	}
 }
 
+static void direct_link_engine_settings(FileData *fd, ListBase *lb)
+{
+	link_list(fd, lb);
+	for (CollectionEngineSettings *ces = lb->first; ces; ces = ces->next) {
+		link_list(fd, &ces->properties);
+	}
+}
+
 static void direct_link_layer_collections(FileData *fd, ListBase *lb)
 {
 	link_list(fd, lb);
@@ -5945,6 +5954,8 @@ static void direct_link_layer_collections(FileData *fd, ListBase *lb)
 
 		link_list(fd, &lc->overrides);
 
+		direct_link_engine_settings(fd, &lc->engine_settings);
+
 		direct_link_layer_collections(fd, &lc->layer_collections);
 	}
 }
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index e20e6a1f94..fc4e16b2cd 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1894,6 +1894,8 @@ static void write_objects(WriteData *wd, ListBase *idbase)
 
 			writelist(wd, DATA, LinkData, &ob->pc_ids);
 			writelist(wd, DATA, LodLevel, &ob->lodlevels);
+
+			ob->collection_settings = NULL;
 		}
 
 		write_previews(wd, ob->preview);
@@ -2656,6 +2658,26 @@ static void write_scene_collection(WriteData *wd, SceneCollection *sc)
 	}
 }
 
+static void write_collection_engine_settings(WriteData *wd, ListBase *lb)
+{
+	for (CollectionEngineSettings *ces = lb->first; ces; ces = ces->next) {
+		writestruct(wd, DATA, CollectionEngineSettings, 1, ces);
+
+		for (CollectionEngineProperty *prop = ces->properties.first; prop; prop = prop->next) {
+			switch (prop->type) {
+			    case COLLECTION_PROP_TYPE_FLOAT:
+				    writestruct(wd, DATA, CollectionEnginePropertyFloat, 1, prop);
+				    break;
+			    case COLLECTION_PROP_TYPE_INT:
+				    writestruct(wd, DATA, CollectionEnginePropertyInt, 1, prop);
+				    break;
+			    default:
+				    ; /* error: don't know how to write this file */
+			}
+		}
+	}
+}
+
 static void write_layer_collections(Wr

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list