[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