Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2017-02-02 13:04:01 +0300
committerDalai Felinto <dfelinto@gmail.com>2017-02-02 13:26:36 +0300
commit0b834c4fd9733d073d49ef14d6c982f5850248c8 (patch)
tree1ae769b310e9579de3968bcd7b062d980cacd913 /source/blender
parent0651227c4ad00da7d64e7764ab523e1365ef6301 (diff)
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
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_layer.h12
-rw-r--r--source/blender/blenkernel/intern/layer.c131
-rw-r--r--source/blender/blenloader/intern/readfile.c11
-rw-r--r--source/blender/blenloader/intern/writefile.c24
-rw-r--r--source/blender/draw/engines/clay/clay.c4
-rw-r--r--source/blender/draw/intern/draw_manager.c2
-rw-r--r--source/blender/makesdna/DNA_layer_types.h48
-rw-r--r--source/blender/makesdna/DNA_object_types.h3
-rw-r--r--source/blender/makesrna/RNA_access.h1
-rw-r--r--source/blender/makesrna/intern/rna_render.c30
-rw-r--r--source/blender/makesrna/intern/rna_scene.c66
-rw-r--r--source/blender/render/extern/include/RE_engine.h5
-rw-r--r--source/blender/render/intern/source/external_engine.c19
13 files changed, 347 insertions, 9 deletions
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index e74cfbe9a11..3fb898fa82c 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 39b00531222..6b77b556a1b 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 134ce910dcf..cb69d54fc49 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 e20e6a1f94f..fc4e16b2cd1 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(WriteData *wd, ListBase *lb)
{
for (LayerCollection *lc = lb->first; lc; lc = lc->next) {
@@ -2664,6 +2686,8 @@ static void write_layer_collections(WriteData *wd, ListBase *lb)
writelist(wd, DATA, LinkData, &lc->object_bases);
writelist(wd, DATA, CollectionOverride, &lc->overrides);
+ write_collection_engine_settings(wd, &lc->engine_settings);
+
write_layer_collections(wd, &lc->layer_collections);
}
}
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 2be3418171d..0ea81146ed8 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -686,6 +686,6 @@ void clay_engine_free(void)
RenderEngineType viewport_clay_type = {
NULL, NULL,
"BLENDER_CLAY", N_("Clay"), RE_INTERNAL | RE_USE_OGL_PIPELINE,
- NULL, NULL, NULL, NULL, &CLAY_view_draw, NULL,
+ NULL, NULL, NULL, NULL, &CLAY_view_draw, NULL, NULL,
{NULL, NULL, NULL}
-}; \ No newline at end of file
+};
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index dc40c669c87..e9ff6343b09 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1092,7 +1092,7 @@ bool DRW_viewport_cache_is_dirty(void)
void DRW_engines_init(void)
{
- BLI_addtail(&R_engines, &viewport_clay_type);
+ RE_engines_register(NULL, &viewport_clay_type);
}
void DRW_engines_free(void)
diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h
index d725a56d826..b8344cf8628 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -55,6 +55,7 @@ typedef struct LayerCollection {
ListBase object_bases; /* (ObjectBase *)LinkData->data - synced with collection->objects and collection->filter_objects */
ListBase overrides;
ListBase layer_collections; /* synced with collection->collections */
+ ListBase engine_settings; /* CollectionEngineSettings */
} LayerCollection;
typedef struct SceneLayer {
@@ -100,6 +101,53 @@ enum {
SCENE_LAYER_RENDER = (1 << 0),
};
+
+/* *************************************************************** */
+/* Engine Settings */
+
+typedef struct CollectionEngineProperty {
+ struct CollectionEngineProperty *next, *prev;
+ char name[64]; /* MAX_NAME */
+ short type;
+ short pad;
+ char flag;
+ char pad2[3];
+} CollectionEngineProperty;
+
+typedef struct CollectionEnginePropertyInt {
+ struct CollectionEngineProperty data;
+ int value;
+ int pad;
+} CollectionEnginePropertyInt;
+
+typedef struct CollectionEnginePropertyFloat {
+ struct CollectionEngineProperty data;
+ float value;
+ float pad;
+} CollectionEnginePropertyFloat;
+
+typedef struct CollectionEngineSettings {
+ struct CollectionEngineSettings *next, *prev;
+ char name[32]; /* engine name - MAX_NAME */
+ ListBase properties; /* CollectionProperty */
+} CollectionEngineSettings;
+
+/* CollectionEngineProperty->flag */
+enum {
+ COLLECTION_PROP_USE = (1 << 0),
+};
+
+/* CollectionEntineProperty.type */
+typedef enum CollectionEnginePropertyType {
+ COLLECTION_PROP_TYPE_FLOAT = 0,
+ COLLECTION_PROP_TYPE_INT = 1,
+ COLLECTION_PROP_TYPE_BOOLEAN = 2,
+ COLLECTION_PROP_TYPE_POINTER = 3,
+} CollectionEnginePropertyType;
+
+/* *************************************************************** */
+
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 60aaa4ace20..44f3a72708e 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -46,6 +46,7 @@ struct Object;
struct AnimData;
struct Ipo;
struct BoundBox;
+struct CollectionSettings;
struct Path;
struct Material;
struct PartDeflect;
@@ -302,6 +303,8 @@ typedef struct Object {
LodLevel *currentlod;
struct PreviewImage *preview;
+
+ struct CollectionSettings *collection_settings; /* used by depsgraph, flushed from collection-tree */
} Object;
/* Warning, this is not used anymore because hooks are now modifiers */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index d3b4c350487..2221526fa8b 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -106,6 +106,7 @@ extern StructRNA RNA_ClothCollisionSettings;
extern StructRNA RNA_ClothModifier;
extern StructRNA RNA_ClothSettings;
extern StructRNA RNA_CloudsTexture;
+extern StructRNA RNA_CollectionEngineSettings;
extern StructRNA RNA_CollectionProperty;
extern StructRNA RNA_CollisionModifier;
extern StructRNA RNA_CollisionSensor;
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 518c7efd915..5f796261c73 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -261,6 +261,24 @@ static void engine_update_script_node(RenderEngine *engine, struct bNodeTree *nt
RNA_parameter_list_free(&list);
}
+static void engine_collection_settings_create(RenderEngine *engine, struct CollectionEngineSettings *ces)
+{
+ extern FunctionRNA rna_RenderEngine_collection_settings_create_func;
+ PointerRNA ptr,cesptr;
+ ParameterList list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+ RNA_pointer_create(NULL, &RNA_CollectionEngineSettings, ces, &cesptr);
+ func = &rna_RenderEngine_collection_settings_create_func;
+
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "collection_settings", &cesptr);
+ engine->type->ext.call(NULL, &ptr, func, &list);
+
+ RNA_parameter_list_free(&list);
+}
+
/* RenderEngine registration */
static void rna_RenderEngine_unregister(Main *UNUSED(bmain), StructRNA *type)
@@ -281,7 +299,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
RenderEngineType *et, dummyet = {NULL};
RenderEngine dummyengine = {NULL};
PointerRNA dummyptr;
- int have_function[6];
+ int have_function[7];
/* setup dummy engine & engine type to store static properties in */
dummyengine.type = &dummyet;
@@ -323,8 +341,9 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
et->view_update = (have_function[3]) ? engine_view_update : NULL;
et->view_draw = (have_function[4]) ? engine_view_draw : NULL;
et->update_script_node = (have_function[5]) ? engine_update_script_node : NULL;
+ et->collection_settings_create = (have_function[6]) ? engine_collection_settings_create : NULL;
- BLI_addtail(&R_engines, et);
+ RE_engines_register(bmain, et);
return et->ext.srna;
}
@@ -489,6 +508,13 @@ static void rna_def_render_engine(BlenderRNA *brna)
parm = RNA_def_pointer(func, "node", "Node", "", "");
RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
+ /* per-collection engine settings initialization */
+ func = RNA_def_function(srna, "collection_settings_create", NULL);
+ RNA_def_function_ui_description(func, "Create the per collection settings for the engine");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
+ parm = RNA_def_pointer(func, "collection_settings", "CollectionEngineSettings", "", "");
+ RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
+
/* tag for redraw */
func = RNA_def_function(srna, "tag_redraw", "engine_tag_redraw");
RNA_def_function_ui_description(func, "Request redraw for viewport rendering");
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index b9ca9ea277b..189ea7135fe 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -82,6 +82,8 @@
#include "BLI_threads.h"
+#define NO_ENGINE "NO_ENGINE"
+
#ifdef WITH_OPENEXR
EnumPropertyItem rna_enum_exr_codec_items[] = {
{R_IMF_EXR_CODEC_NONE, "NONE", 0, "None", ""},
@@ -2352,6 +2354,19 @@ static void rna_SceneCollection_object_unlink(
WM_main_add_notifier(NC_SCENE | ND_LAYER | ND_OB_ACTIVE, scene);
}
+/****** layer collection engine settings *******/
+
+static StructRNA *rna_CollectionEngineSettings_refine(struct PointerRNA *ptr)
+{
+ CollectionEngineSettings *ces = (CollectionEngineSettings *)ptr->data;
+
+ /* TODO - handle engines */
+ TODO_LAYER;
+ (void) ces;
+
+ return &RNA_CollectionEngineSettings;
+}
+
static void rna_LayerCollection_name_get(PointerRNA *ptr, char *value)
{
SceneCollection *sc = ((LayerCollection *)ptr->data)->scene_collection;
@@ -2381,6 +2396,25 @@ static PointerRNA rna_LayerCollection_objects_get(CollectionPropertyIterator *it
return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, base->object);
}
+static PointerRNA rna_LayerCollection_engine_settings_get(ID *UNUSED(id), LayerCollection *lc, bContext *C, const char *engine)
+{
+ Scene *scene = CTX_data_scene(C);
+ const char *engine_name;
+
+ if (STREQ(engine, NO_ENGINE)) {
+ RenderData *rd = &scene->r;
+ engine_name = rd->engine;
+ }
+ else {
+ engine_name = engine;
+ }
+
+ PointerRNA ptr;
+ CollectionEngineSettings *ces = BKE_layer_collection_engine_get(lc, engine_name);
+ RNA_pointer_create(NULL, &RNA_CollectionEngineSettings, ces, &ptr);
+ return rna_pointer_inherit_refine(&ptr, &RNA_CollectionEngineSettings, ces);
+}
+
static void rna_LayerCollection_hide_update(bContext *C, PointerRNA *ptr)
{
Scene *scene = CTX_data_scene(C);
@@ -5643,11 +5677,31 @@ static void rna_def_layer_collection_override(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, NULL);
}
+static void rna_def_layer_collection_engine_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "CollectionEngineSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Collections Engine Settings", "Engine specific settings for this collection");
+ RNA_def_struct_refine_func(srna, "rna_CollectionEngineSettings_refine");
+
+ prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Name", "Engine name");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_struct_name_property(srna, prop);
+
+ /* the engine specific structs */
+}
+
static void rna_def_layer_collection(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
srna = RNA_def_struct(brna, "LayerCollection", NULL);
RNA_def_struct_ui_text(srna, "Layer Collection", "Layer collection");
@@ -5679,6 +5733,15 @@ static void rna_def_layer_collection(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "LayerCollectionOverride");
RNA_def_property_ui_text(prop, "Collection Overrides", "");
+ func = RNA_def_function(srna, "get_engine_settings", "rna_LayerCollection_engine_settings_get");
+ RNA_def_function_ui_description(func, "Return the engine settings for this collection");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_CONTEXT);
+ parm = RNA_def_string(func, "engine", NO_ENGINE, MAX_NAME, "Engine", "use context one by default");
+ RNA_def_parameter_clear_flags(parm, 0, PARM_REQUIRED);
+ parm = RNA_def_pointer(func, "result", "CollectionEngineSettings", "", "");
+ RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
+ RNA_def_function_return(func, parm);
+
/* Flags */
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", COLLECTION_VISIBLE);
@@ -8378,6 +8441,7 @@ void RNA_def_scene(BlenderRNA *brna)
rna_def_scene_collection(brna);
rna_def_layer_collection(brna);
rna_def_layer_collection_override(brna);
+ rna_def_layer_collection_engine_settings(brna);
rna_def_scene_layer(brna);
rna_def_object_base(brna);
RNA_define_animate_sdna(true);
@@ -8393,3 +8457,5 @@ void RNA_def_scene(BlenderRNA *brna)
}
#endif
+
+#undef NO_ENGINE
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 42e3cfb16d0..f1b3534b40a 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -39,6 +39,8 @@
struct bNode;
struct bNodeTree;
+struct CollectionEngineSettings;
+struct Main;
struct Object;
struct Render;
struct RenderData;
@@ -98,6 +100,8 @@ typedef struct RenderEngineType {
void (*update_script_node)(struct RenderEngine *engine, struct bNodeTree *ntree, struct bNode *node);
+ void (*collection_settings_create)(struct RenderEngine *engine, struct CollectionEngineSettings *ces);
+
/* RNA integration */
ExtensionRNA ext;
} RenderEngineType;
@@ -165,6 +169,7 @@ void RE_engine_frame_set(struct RenderEngine *engine, int frame, float subframe)
void RE_engines_init(void);
void RE_engines_exit(void);
+void RE_engines_register(struct Main *bmain, RenderEngineType *render_type);
RenderEngineType *RE_engines_find(const char *idname);
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index f5a64550daa..eeb075c5722 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -45,6 +45,7 @@
#include "BKE_camera.h"
#include "BKE_global.h"
#include "BKE_colortools.h"
+#include "BKE_layer.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -70,7 +71,7 @@
static RenderEngineType internal_render_type = {
NULL, NULL,
"BLENDER_RENDER", N_("Blender Render"), RE_INTERNAL,
- NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
{NULL, NULL, NULL}
};
@@ -79,7 +80,7 @@ static RenderEngineType internal_render_type = {
static RenderEngineType internal_game_type = {
NULL, NULL,
"BLENDER_GAME", N_("Blender Game"), RE_INTERNAL | RE_GAME,
- NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
{NULL, NULL, NULL}
};
@@ -89,9 +90,9 @@ ListBase R_engines = {NULL, NULL};
void RE_engines_init(void)
{
- BLI_addtail(&R_engines, &internal_render_type);
+ RE_engines_register(NULL, &internal_render_type);
#ifdef WITH_GAMEENGINE
- BLI_addtail(&R_engines, &internal_game_type);
+ RE_engines_register(NULL, &internal_render_type);
#endif
DRW_engines_init();
}
@@ -102,6 +103,8 @@ void RE_engines_exit(void)
DRW_engines_free();
+ BKE_layer_collection_engine_settings_callback_free();
+
for (type = R_engines.first; type; type = next) {
next = type->next;
@@ -116,6 +119,14 @@ void RE_engines_exit(void)
}
}
+void RE_engines_register(Main *bmain, RenderEngineType *render_type)
+{
+ if (render_type->collection_settings_create) {
+ BKE_layer_collection_engine_settings_callback_register(bmain, render_type->idname, render_type->collection_settings_create);
+ }
+ BLI_addtail(&R_engines, render_type);
+}
+
RenderEngineType *RE_engines_find(const char *idname)
{
RenderEngineType *type;