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-05-05 17:27:31 +0300
committerDalai Felinto <dfelinto@gmail.com>2017-05-05 19:08:24 +0300
commit8d9c48415257eca370dad5c163f0fec06e31dd6b (patch)
tree1ddaf42a0c8d82bd99bbc8897592efd173b5cfc8
parent741d848cf8ee2d6f682150fc965036f6185655a3 (diff)
Implement overridable scene render settings
This add a new set of (possible) render settings that can be defined at the scene level and overridable at the scene layer level. Once we get workspaces we can either add workspace inbetween scene and scene layer evaluation. Or to replace layer settings, to avoid extra confusion to users. An example of this setting is "samples", as implemented now for the clay engine.
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py13
-rw-r--r--release/scripts/startup/bl_ui/properties_render_layer.py21
-rw-r--r--source/blender/blenkernel/BKE_layer.h20
-rw-r--r--source/blender/blenkernel/intern/layer.c324
-rw-r--r--source/blender/blenkernel/intern/scene.c26
-rw-r--r--source/blender/blenloader/intern/readfile.c14
-rw-r--r--source/blender/blenloader/intern/versioning_280.c10
-rw-r--r--source/blender/blenloader/intern/writefile.c7
-rw-r--r--source/blender/draw/engines/basic/basic_engine.c2
-rw-r--r--source/blender/draw/engines/clay/clay_engine.c25
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c17
-rw-r--r--source/blender/draw/engines/external/external_engine.c2
-rw-r--r--source/blender/draw/intern/draw_manager.c2
-rw-r--r--source/blender/draw/modes/edit_mesh_mode.c2
-rw-r--r--source/blender/draw/modes/object_mode.c2
-rw-r--r--source/blender/draw/modes/paint_vertex_mode.c2
-rw-r--r--source/blender/draw/modes/paint_weight_mode.c2
-rw-r--r--source/blender/makesdna/DNA_layer_types.h2
-rw-r--r--source/blender/makesdna/DNA_scene_types.h2
-rw-r--r--source/blender/makesrna/intern/rna_scene.c240
-rw-r--r--source/blender/render/extern/include/RE_engine.h1
-rw-r--r--source/blender/render/intern/source/external_engine.c9
22 files changed, 600 insertions, 145 deletions
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index be7104163fd..51968860754 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -584,6 +584,18 @@ class RENDER_PT_bake(RenderButtonsPanel, Panel):
sub.prop(rd, "bake_user_scale", text="User Scale")
+class RENDER_PT_clay_layer_settings(RenderButtonsPanel, Panel):
+ bl_label = "Clay Layer Settings"
+ COMPAT_ENGINES = {'BLENDER_CLAY'}
+
+ def draw(self, context):
+ layout = self.layout
+ props = context.scene.layer_properties['BLENDER_CLAY']
+
+ col = layout.column()
+ col.prop(props, "ssao_samples")
+
+
class RENDER_PT_clay_collection_settings(RenderButtonsPanel, Panel):
bl_label = "Clay Collection Settings"
COMPAT_ENGINES = {'BLENDER_CLAY'}
@@ -619,6 +631,7 @@ classes = (
RENDER_PT_output,
RENDER_PT_encoding,
RENDER_PT_bake,
+ RENDER_PT_clay_layer_settings,
RENDER_PT_clay_collection_settings,
)
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index d6905cd1975..73b87ae96a1 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -130,11 +130,32 @@ class RENDERLAYER_PT_views(RenderLayerButtonsPanel, Panel):
row.prop(rv, "camera_suffix", text="")
+class RENDERLAYER_PT_clay_settings(RenderLayerButtonsPanel, Panel):
+ bl_label = "Render Settings"
+ COMPAT_ENGINES = {'BLENDER_CLAY'}
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ return scene and (scene.render.engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+ scene = context.scene
+ scene_props = scene.layer_properties['BLENDER_CLAY']
+ layer = bpy.context.render_layer
+ layer_props = layer.engine_overrides['BLENDER_CLAY']
+
+ col = layout.column()
+ col.template_override_property(layer_props, scene_props, "ssao_samples")
+
+
classes = (
RENDERLAYER_UL_renderlayers,
RENDERLAYER_PT_layers,
RENDERLAYER_UL_renderviews,
RENDERLAYER_PT_views,
+ RENDERLAYER_PT_clay_settings,
)
if __name__ == "__main__": # only for live edit.
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index c5a2eb8351d..b6a8cb04ec8 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -108,16 +108,26 @@ void BKE_layer_sync_object_unlink(const struct Scene *scene, struct SceneCollect
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 IDProperty *props);
-struct IDProperty *BKE_layer_collection_engine_get(struct LayerCollection *lc, const int type, const char *engine_name);
-struct IDProperty *BKE_object_collection_engine_get(struct Object *ob, const int type, const char *engine_name);
-struct IDProperty *BKE_scene_collection_engine_get(struct Scene *scene, const int type, const char *engine_name);
-void BKE_layer_collection_engine_settings_callback_register(struct Main *bmain, const char *engine_name, CollectionEngineSettingsCB func);
+typedef void (*EngineSettingsCB)(struct RenderEngine *engine, struct IDProperty *props);
+
+struct IDProperty *BKE_layer_collection_engine_evaluated_get(struct Object *ob, const int type, const char *engine_name);
+struct IDProperty *BKE_layer_collection_engine_collection_get(struct LayerCollection *lc, const int type, const char *engine_name);
+struct IDProperty *BKE_layer_collection_engine_scene_get(struct Scene *scene, const int type, const char *engine_name);
+void BKE_layer_collection_engine_settings_callback_register(struct Main *bmain, const char *engine_name, EngineSettingsCB func);
void BKE_layer_collection_engine_settings_callback_free(void);
void BKE_layer_collection_engine_settings_create(struct IDProperty *root);
void BKE_layer_collection_engine_settings_validate_scene(struct Scene *scene);
void BKE_layer_collection_engine_settings_validate_collection(struct LayerCollection *lc);
+struct IDProperty *BKE_scene_layer_engine_evaluated_get(struct SceneLayer *sl, const int type, const char *engine_name);
+struct IDProperty *BKE_scene_layer_engine_layer_get(struct SceneLayer *sl, const int type, const char *engine_name);
+struct IDProperty *BKE_scene_layer_engine_scene_get(struct Scene *scene, const int type, const char *engine_name);
+void BKE_scene_layer_engine_settings_callback_register(struct Main *bmain, const char *engine_name, EngineSettingsCB func);
+void BKE_scene_layer_engine_settings_callback_free(void);
+void BKE_scene_layer_engine_settings_validate_scene(struct Scene *scene);
+void BKE_scene_layer_engine_settings_validate_layer(struct SceneLayer *sl);
+void BKE_scene_layer_engine_settings_create(struct IDProperty *root);
+
void BKE_collection_engine_property_add_float(struct IDProperty *props, const char *name, float value);
void BKE_collection_engine_property_add_int(struct IDProperty *props, const char *name, int value);
void BKE_collection_engine_property_add_bool(struct IDProperty *props, const char *name, bool value);
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index a136728ecc4..13ec6ccbe75 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -52,13 +52,14 @@
#define DEBUG_PRINT if (G.debug & G_DEBUG_DEPSGRAPH) printf
/* prototype */
-struct CollectionEngineSettingsCB_Type;
+struct EngineSettingsCB_Type;
static void layer_collection_free(SceneLayer *sl, LayerCollection *lc);
static LayerCollection *layer_collection_add(SceneLayer *sl, LayerCollection *parent, SceneCollection *sc);
static LayerCollection *find_layer_collection_by_scene_collection(LayerCollection *lc, const SceneCollection *sc);
-static IDProperty *collection_engine_settings_create(struct CollectionEngineSettingsCB_Type *ces_type, const bool populate);
+static IDProperty *collection_engine_settings_create(struct EngineSettingsCB_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 layer_engine_settings_init(IDProperty *root, const bool populate);
static void object_bases_Iterator_next(Iterator *iter, const int flag);
/* RenderLayer */
@@ -95,9 +96,13 @@ SceneLayer *BKE_scene_layer_add(Scene *scene, const char *name)
name = DATA_("Render Layer");
}
+ IDPropertyTemplate val = {0};
SceneLayer *sl = MEM_callocN(sizeof(SceneLayer), "Scene Layer");
sl->flag |= SCENE_LAYER_RENDER;
+ sl->properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ layer_engine_settings_init(sl->properties, false);
+
BLI_addtail(&scene->render_layers, sl);
/* unique name */
@@ -160,6 +165,16 @@ void BKE_scene_layer_free(SceneLayer *sl)
layer_collection_free(NULL, lc);
}
BLI_freelistN(&sl->layer_collections);
+
+ if (sl->properties) {
+ IDP_FreeProperty(sl->properties);
+ MEM_freeN(sl->properties);
+ }
+
+ if (sl->properties_evaluated) {
+ IDP_FreeProperty(sl->properties_evaluated);
+ MEM_freeN(sl->properties_evaluated);
+ }
}
/**
@@ -957,83 +972,140 @@ void BKE_collection_override_datablock_add(LayerCollection *UNUSED(lc), const ch
/* ---------------------------------------------------------------------- */
/* Engine Settings */
-ListBase R_engines_settings_callbacks = {NULL, NULL};
+ListBase R_layer_collection_engines_settings_callbacks = {NULL, NULL};
+ListBase R_scene_layer_engines_settings_callbacks = {NULL, NULL};
-typedef struct CollectionEngineSettingsCB_Type {
- struct CollectionEngineSettingsCB_Type *next, *prev;
+typedef struct EngineSettingsCB_Type {
+ struct EngineSettingsCB_Type *next, *prev;
char name[MAX_NAME]; /* engine name */
- CollectionEngineSettingsCB callback;
+ EngineSettingsCB callback;
-} CollectionEngineSettingsCB_Type;
+} EngineSettingsCB_Type;
-static void create_engine_settings_scene(Scene *scene, CollectionEngineSettingsCB_Type *ces_type)
+static void create_engine_settings_scene(IDProperty *root, EngineSettingsCB_Type *es_type)
{
- if (collection_engine_get(scene->collection_properties, COLLECTION_MODE_NONE, ces_type->name)) {
+ if (collection_engine_get(root, COLLECTION_MODE_NONE, es_type->name)) {
return;
}
- IDProperty *props = collection_engine_settings_create(ces_type, true);
- IDP_AddToGroup(scene->collection_properties, props);
+ IDProperty *props = collection_engine_settings_create(es_type, true);
+ IDP_AddToGroup(root, props);
+}
+
+static void create_layer_collection_engine_settings_scene(Scene *scene, EngineSettingsCB_Type *es_type)
+{
+ create_engine_settings_scene(scene->collection_properties, es_type);
}
-static void create_engine_settings_layer_collection(LayerCollection *lc, CollectionEngineSettingsCB_Type *ces_type)
+static void create_scene_layer_engine_settings_scene(Scene *scene, EngineSettingsCB_Type *es_type)
{
- if (BKE_layer_collection_engine_get(lc, COLLECTION_MODE_NONE, ces_type->name)) {
+ create_engine_settings_scene(scene->layer_properties, es_type);
+}
+
+static void create_layer_collection_engine_settings_collection(LayerCollection *lc, EngineSettingsCB_Type *es_type)
+{
+ if (BKE_layer_collection_engine_collection_get(lc, COLLECTION_MODE_NONE, es_type->name)) {
return;
}
- IDProperty *props = collection_engine_settings_create(ces_type, false);
+ IDProperty *props = collection_engine_settings_create(es_type, false);
IDP_AddToGroup(lc->properties, props);
for (LayerCollection *lcn = lc->layer_collections.first; lcn; lcn = lcn->next) {
- create_engine_settings_layer_collection(lcn, ces_type);
+ create_layer_collection_engine_settings_collection(lcn, es_type);
}
}
-static void create_engines_settings_scene(Scene *scene, CollectionEngineSettingsCB_Type *ces_type)
+static void create_layer_collection_engines_settings_scene(Scene *scene, EngineSettingsCB_Type *es_type)
{
- /* populate the scene with the new settings */
- create_engine_settings_scene(scene, ces_type);
+ /* Populate the scene with the new settings. */
+ create_layer_collection_engine_settings_scene(scene, es_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);
+ create_layer_collection_engine_settings_collection(lc, es_type);
}
}
}
-void BKE_layer_collection_engine_settings_callback_register(
- Main *bmain, const char *engine_name, CollectionEngineSettingsCB func)
+static void create_scene_layer_engines_settings_scene(Scene *scene, EngineSettingsCB_Type *es_type)
{
- CollectionEngineSettingsCB_Type *ces_type;
+ /* Populate the scene with the new settings. */
+ create_scene_layer_engine_settings_scene(scene, es_type);
+}
+
+static void create_scene_layer_engines_settings_layer(SceneLayer *sl, EngineSettingsCB_Type *es_type)
+{
+ if (BKE_scene_layer_engine_layer_get(sl, COLLECTION_MODE_NONE, es_type->name)) {
+ return;
+ }
+
+ IDProperty *props = collection_engine_settings_create(es_type, false);
+ IDP_AddToGroup(sl->properties, props);
+}
+
+static EngineSettingsCB_Type *engine_settings_callback_register(const char *engine_name, EngineSettingsCB func, ListBase *lb)
+{
+ EngineSettingsCB_Type *es_type;
+
+ /* Cleanup in case it existed. */
+ es_type = BLI_findstring(lb, engine_name, offsetof(EngineSettingsCB_Type, name));
+
+ if (es_type) {
+ BLI_remlink(lb, es_type);
+ MEM_freeN(es_type);
+ }
+
+ es_type = MEM_callocN(sizeof(EngineSettingsCB_Type), __func__);
+ BLI_strncpy_utf8(es_type->name, engine_name, sizeof(es_type->name));
+ es_type->callback = func;
+ BLI_addtail(lb, es_type);
- /* cleanup in case it existed */
- ces_type = BLI_findstring(&R_engines_settings_callbacks, engine_name,
- offsetof(CollectionEngineSettingsCB_Type, name));
+ return es_type;
+}
+
+void BKE_layer_collection_engine_settings_callback_register(
+ Main *bmain, const char *engine_name, EngineSettingsCB func)
+{
+ EngineSettingsCB_Type *es_type =
+ engine_settings_callback_register(engine_name, func, &R_layer_collection_engines_settings_callbacks);
- if (ces_type) {
- BLI_remlink(&R_engines_settings_callbacks, ces_type);
- MEM_freeN(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_layer_collection_engines_settings_scene(scene, es_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);
+void BKE_scene_layer_engine_settings_callback_register(
+ Main *bmain, const char *engine_name, EngineSettingsCB func)
+{
+ EngineSettingsCB_Type *es_type =
+ engine_settings_callback_register(engine_name, func, &R_scene_layer_engines_settings_callbacks);
if (bmain) {
- /* populate all of the collections of the scene with those settings */
+ /* 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);
+ create_scene_layer_engines_settings_scene(scene, es_type);
+
+ for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
+ create_scene_layer_engines_settings_layer(sl, es_type);
+ }
}
}
}
void BKE_layer_collection_engine_settings_callback_free(void)
{
- BLI_freelistN(&R_engines_settings_callbacks);
+ BLI_freelistN(&R_layer_collection_engines_settings_callbacks);
+}
+
+void BKE_scene_layer_engine_settings_callback_free(void)
+{
+ BLI_freelistN(&R_scene_layer_engines_settings_callbacks);
}
/**
@@ -1041,17 +1113,17 @@ void BKE_layer_collection_engine_settings_callback_free(void)
*
* \param populate whether we want to pre-fill the collection with the default properties
*/
-static IDProperty *collection_engine_settings_create(CollectionEngineSettingsCB_Type *ces_type, const bool populate)
+static IDProperty *collection_engine_settings_create(EngineSettingsCB_Type *es_type, const bool populate)
{
IDProperty *props;
IDPropertyTemplate val = {0};
- props = IDP_New(IDP_GROUP, &val, ces_type->name);
+ props = IDP_New(IDP_GROUP, &val, es_type->name);
props->subtype = IDP_GROUP_SUB_ENGINE_RENDER;
/* properties */
if (populate) {
- ces_type->callback(NULL, props);
+ es_type->callback(NULL, props);
}
return props;
@@ -1121,11 +1193,20 @@ static void layer_collection_create_mode_settings_paint_vertex(IDProperty *root,
IDP_AddToGroup(root, props);
}
-static void collection_create_render_settings(IDProperty *root, const bool populate)
+static void layer_collection_create_render_settings(IDProperty *root, const bool populate)
{
- CollectionEngineSettingsCB_Type *ces_type;
- for (ces_type = R_engines_settings_callbacks.first; ces_type; ces_type = ces_type->next) {
- IDProperty *props = collection_engine_settings_create(ces_type, populate);
+ EngineSettingsCB_Type *es_type;
+ for (es_type = R_layer_collection_engines_settings_callbacks.first; es_type; es_type = es_type->next) {
+ IDProperty *props = collection_engine_settings_create(es_type, populate);
+ IDP_AddToGroup(root, props);
+ }
+}
+
+static void scene_layer_create_render_settings(IDProperty *root, const bool populate)
+{
+ EngineSettingsCB_Type *es_type;
+ for (es_type = R_scene_layer_engines_settings_callbacks.first; es_type; es_type = es_type->next) {
+ IDProperty *props = collection_engine_settings_create(es_type, populate);
IDP_AddToGroup(root, props);
}
}
@@ -1140,6 +1221,12 @@ static void collection_create_mode_settings(IDProperty *root, const bool populat
layer_collection_create_mode_settings_paint_vertex(root, populate);
}
+static void layer_create_mode_settings(IDProperty *root, const bool populate)
+{
+ TODO_LAYER; /* XXX like collection_create_mode_settings */
+ UNUSED_VARS(root, populate);
+}
+
static int idproperty_group_subtype(const int mode_type)
{
int idgroup_type;
@@ -1193,26 +1280,50 @@ static IDProperty *collection_engine_get(
/**
* Return collection engine settings from Object for specified engine of mode
*/
-IDProperty *BKE_object_collection_engine_get(Object *ob, const int type, const char *engine_name)
+IDProperty *BKE_layer_collection_engine_evaluated_get(Object *ob, const int type, const char *engine_name)
{
return collection_engine_get(ob->base_collection_properties, type, engine_name);
}
/**
* Return layer collection engine settings for specified engine
*/
-IDProperty *BKE_layer_collection_engine_get(LayerCollection *lc, const int type, const char *engine_name)
+IDProperty *BKE_layer_collection_engine_collection_get(LayerCollection *lc, const int type, const char *engine_name)
{
return collection_engine_get(lc->properties, type, engine_name);
}
/**
- * Return scene engine settings for specified engine
+ * Return layer collection engine settings for specified engine in the scene
*/
-IDProperty *BKE_scene_collection_engine_get(Scene *scene, const int type, const char *engine_name)
+IDProperty *BKE_layer_collection_engine_scene_get(Scene *scene, const int type, const char *engine_name)
{
return collection_engine_get(scene->collection_properties, type, engine_name);
}
+/**
+ * Return scene layer engine settings for specified engine in the scene
+ */
+IDProperty *BKE_scene_layer_engine_scene_get(Scene *scene, const int type, const char *engine_name)
+{
+ return collection_engine_get(scene->layer_properties, type, engine_name);
+}
+
+/**
+ * Return scene layer engine settings for specified engine
+ */
+IDProperty *BKE_scene_layer_engine_layer_get(SceneLayer *sl, const int type, const char *engine_name)
+{
+ return collection_engine_get(sl->properties, type, engine_name);
+}
+
+/**
+ * Return scene layer evaluated engine settings for specified engine
+ */
+IDProperty *BKE_scene_layer_engine_evaluated_get(SceneLayer *sl, const int type, const char *engine_name)
+{
+ return collection_engine_get(sl->properties_evaluated, type, engine_name);
+}
+
/* ---------------------------------------------------------------------- */
/* Engine Settings Properties */
@@ -1279,14 +1390,24 @@ void BKE_collection_engine_property_value_set_bool(IDProperty *props, const char
static void collection_engine_settings_init(IDProperty *root, const bool populate)
{
/* render engines */
- collection_create_render_settings(root, populate);
+ layer_collection_create_render_settings(root, populate);
/* mode engines */
collection_create_mode_settings(root, populate);
}
+/* get all the default settings defined in scene and merge them here */
+static void layer_engine_settings_init(IDProperty *root, const bool populate)
+{
+ /* render engines */
+ scene_layer_create_render_settings(root, populate);
+
+ /* mode engines */
+ layer_create_mode_settings(root, populate);
+}
+
/**
- * Initialize the render setings
+ * Initialize the layer collection render setings
* It's used mainly for scenes
*/
void BKE_layer_collection_engine_settings_create(IDProperty *root)
@@ -1295,33 +1416,59 @@ void BKE_layer_collection_engine_settings_create(IDProperty *root)
}
/**
+ * Initialize the render setings
+ * It's used mainly for scenes
+ */
+void BKE_scene_layer_engine_settings_create(IDProperty *root)
+{
+ layer_engine_settings_init(root, true);
+}
+
+/**
* Reference of IDProperty group scene collection settings
* Used when reading blendfiles, to see if there is any missing settings.
*/
static struct {
- IDProperty *scene;
+ struct {
+ IDProperty *collection_properties;
+ IDProperty *render_settings;
+ } scene;
+ IDProperty *scene_layer;
IDProperty *layer_collection;
} root_reference = {
- .scene = NULL,
+ .scene = {NULL, NULL},
+ .scene_layer = NULL,
.layer_collection = NULL,
};
/**
* Free the reference scene collection settings IDProperty group.
*/
-static void layer_collection_engine_settings_validate_init(void)
+static void engine_settings_validate_init(void)
{
IDPropertyTemplate val = {0};
- if (root_reference.scene == NULL) {
- root_reference.scene = IDP_New(IDP_GROUP, &val, ROOT_PROP);
- collection_engine_settings_init(root_reference.scene, true);
+ /* LayerCollection engine settings. */
+ if (root_reference.scene.collection_properties == NULL) {
+ root_reference.scene.collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ collection_engine_settings_init(root_reference.scene.collection_properties, true);
}
if (root_reference.layer_collection == NULL) {
root_reference.layer_collection = IDP_New(IDP_GROUP, &val, ROOT_PROP);
collection_engine_settings_init(root_reference.layer_collection, false);
}
+
+ /* Render engine setting. */
+ if (root_reference.scene.render_settings == NULL) {
+ root_reference.scene.render_settings = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ layer_engine_settings_init(root_reference.scene.render_settings, true);
+ }
+
+ if (root_reference.scene_layer == NULL) {
+ root_reference.scene_layer = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ layer_engine_settings_init(root_reference.scene_layer, false);
+ }
}
/**
@@ -1329,16 +1476,22 @@ static void layer_collection_engine_settings_validate_init(void)
*/
static void layer_collection_engine_settings_validate_free(void)
{
- if (root_reference.scene != NULL) {
- IDP_FreeProperty(root_reference.scene);
- MEM_freeN(root_reference.scene);
- root_reference.scene = NULL;
- }
-
- if (root_reference.layer_collection != NULL) {
- IDP_FreeProperty(root_reference.layer_collection);
- MEM_freeN(root_reference.layer_collection);
- root_reference.layer_collection = NULL;
+ IDProperty *idprops[] = {
+ root_reference.scene.render_settings,
+ root_reference.scene.collection_properties,
+ root_reference.scene_layer,
+ root_reference.layer_collection,
+ NULL,
+ };
+
+ IDProperty **idprop = &idprops[0];
+ while (*idprop) {
+ if (*idprop) {
+ IDP_FreeProperty(*idprop);
+ MEM_freeN(*idprop);
+ *idprop = NULL;
+ idprop++;
+ }
}
}
@@ -1347,8 +1500,8 @@ static void layer_collection_engine_settings_validate_free(void)
*/
void BKE_layer_collection_engine_settings_validate_scene(Scene *scene)
{
- if (root_reference.scene == NULL) {
- layer_collection_engine_settings_validate_init();
+ if (root_reference.scene.collection_properties == NULL) {
+ engine_settings_validate_init();
}
if (scene->collection_properties == NULL) {
@@ -1357,7 +1510,7 @@ void BKE_layer_collection_engine_settings_validate_scene(Scene *scene)
BKE_layer_collection_engine_settings_create(scene->collection_properties);
}
else {
- IDP_MergeGroup(scene->collection_properties, root_reference.scene, false);
+ IDP_MergeGroup(scene->collection_properties, root_reference.scene.collection_properties, false);
}
}
@@ -1367,13 +1520,44 @@ void BKE_layer_collection_engine_settings_validate_scene(Scene *scene)
void BKE_layer_collection_engine_settings_validate_collection(LayerCollection *lc)
{
if (root_reference.layer_collection == NULL) {
- layer_collection_engine_settings_validate_init();
+ engine_settings_validate_init();
}
BLI_assert(lc->properties != NULL);
IDP_MergeGroup(lc->properties, root_reference.layer_collection, false);
}
+/**
+ * Make sure Scene has all required collection settings.
+ */
+void BKE_scene_layer_engine_settings_validate_scene(Scene *scene)
+{
+ if (root_reference.scene.render_settings == NULL) {
+ engine_settings_validate_init();
+ }
+
+ if (scene->layer_properties == NULL) {
+ IDPropertyTemplate val = {0};
+ scene->layer_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ BKE_scene_layer_engine_settings_create(scene->layer_properties);
+ }
+ else {
+ IDP_MergeGroup(scene->layer_properties, root_reference.scene.render_settings, false);
+ }
+}
+
+/**
+ * Make sure Scene has all required collection settings.
+ */
+void BKE_scene_layer_engine_settings_validate_layer(SceneLayer *sl)
+{
+ if (root_reference.scene_layer == NULL) {
+ engine_settings_validate_init();
+ }
+
+ IDP_MergeGroup(sl->properties, root_reference.scene_layer, false);
+}
+
/* ---------------------------------------------------------------------- */
/* Iterators */
@@ -1525,6 +1709,10 @@ void BKE_layer_eval_layer_collection_pre(struct EvaluationContext *UNUSED(eval_c
idproperty_reset(&base->collection_properties, scene->collection_properties);
}
+ /* Sync properties from scene to scene layer. */
+ idproperty_reset(&scene_layer->properties_evaluated, scene->layer_properties);
+ IDP_MergeGroup(scene_layer->properties_evaluated, scene_layer->properties, true);
+
/* TODO(sergey): Is it always required? */
scene_layer->flag |= SCENE_LAYER_ENGINE_DIRTY;
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 420c1a3ebab..e7db5f868f9 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -317,6 +317,8 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
BLI_duplicatelist(&scen->render_layers, &sce->render_layers);
SceneLayer *new_sl = scen->render_layers.first;
for (SceneLayer *sl = sce->render_layers.first; sl; sl = sl->next) {
+ new_sl->properties = IDP_New(IDP_GROUP, (const IDPropertyTemplate *){0}, ROOT_PROP);
+ new_sl->properties_evaluated = NULL;
/* we start fresh with no overrides and no visibility flags set
* instead of syncing both trees we simply unlink and relink the scene collection */
@@ -324,6 +326,7 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
BLI_listbase_clear(&new_sl->object_bases);
layer_collections_recreate(new_sl, &sl->layer_collections, mcn, mc);
+
if (sl->basact) {
Object *active_ob = sl->basact->object;
for (Base *base = new_sl->object_bases.first; base; base = base->next) {
@@ -336,8 +339,8 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
new_sl = new_sl->next;
}
- IDPropertyTemplate val = {0};
- scen->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ scen->collection_properties = IDP_New(IDP_GROUP, (const IDPropertyTemplate *){0}, ROOT_PROP);
+ scen->layer_properties = IDP_New(IDP_GROUP, (const IDPropertyTemplate *){0}, ROOT_PROP);
}
/* copy color management settings */
@@ -455,6 +458,9 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
if (sce->collection_properties) {
IDP_MergeGroup(scen->collection_properties, sce->collection_properties, true);
}
+ if (sce->layer_properties) {
+ IDP_MergeGroup(scen->layer_properties, sce->layer_properties, true);
+ }
}
return scen;
@@ -586,12 +592,19 @@ void BKE_scene_free(Scene *sce)
MEM_freeN(sce->collection);
sce->collection = NULL;
- /* Runtime Engine Data */
+ /* LayerCollection engine settings. */
if (sce->collection_properties) {
IDP_FreeProperty(sce->collection_properties);
MEM_freeN(sce->collection_properties);
sce->collection_properties = NULL;
}
+
+ /* Render engine setting. */
+ if (sce->layer_properties) {
+ IDP_FreeProperty(sce->layer_properties);
+ MEM_freeN(sce->layer_properties);
+ sce->layer_properties = NULL;
+ }
}
void BKE_scene_init(Scene *sce)
@@ -946,10 +959,13 @@ void BKE_scene_init(Scene *sce)
sce->collection = MEM_callocN(sizeof(SceneCollection), "Master Collection");
BLI_strncpy(sce->collection->name, "Master Collection", sizeof(sce->collection->name));
- IDPropertyTemplate val = {0};
- sce->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ /* Engine settings */
+ sce->collection_properties = IDP_New(IDP_GROUP, (const IDPropertyTemplate *){0}, ROOT_PROP);
BKE_layer_collection_engine_settings_create(sce->collection_properties);
+ sce->layer_properties = IDP_New(IDP_GROUP, (const IDPropertyTemplate *){0}, ROOT_PROP);
+ BKE_scene_layer_engine_settings_create(sce->layer_properties);
+
BKE_scene_layer_add(sce, "Render Layer");
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 9a85587e2e0..bd2180c28a2 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6310,11 +6310,25 @@ static void direct_link_scene(FileData *fd, Scene *sce)
link_list(fd, &sl->object_bases);
sl->basact = newdataadr(fd, sl->basact);
direct_link_layer_collections(fd, &sl->layer_collections);
+
+ if (sl->properties != NULL) {
+ sl->properties = newdataadr(fd, sl->properties);
+ BLI_assert(sl->properties != NULL);
+ IDP_DirectLinkGroup_OrFree(&sl->properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+ BKE_scene_layer_engine_settings_validate_layer(sl);
+ }
+
+ sl->properties_evaluated = NULL;
}
sce->collection_properties = newdataadr(fd, sce->collection_properties);
IDP_DirectLinkGroup_OrFree(&sce->collection_properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+
+ sce->layer_properties = newdataadr(fd, sce->layer_properties);
+ IDP_DirectLinkGroup_OrFree(&sce->layer_properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+
BKE_layer_collection_engine_settings_validate_scene(sce);
+ BKE_scene_layer_engine_settings_validate_scene(sce);
}
/* ************ READ WM ***************** */
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 70c35788527..0c872c8a081 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -254,4 +254,14 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
}
}
}
+
+ if (!DNA_struct_elem_find(fd->filesdna, "SceneLayer", "IDProperty", "properties")) {
+ for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+ for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
+ IDPropertyTemplate val = {0};
+ sl->properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+ BKE_scene_layer_engine_settings_create(sl->properties);
+ }
+ }
+ }
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index c82877063fd..79413bc0384 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2775,9 +2775,16 @@ static void write_scene(WriteData *wd, Scene *sce)
for (SceneLayer *sl = sce->render_layers.first; sl; sl = sl->next) {
writestruct(wd, DATA, SceneLayer, 1, sl);
writelist(wd, DATA, Base, &sl->object_bases);
+ if (sl->properties) {
+ IDP_WriteProperty(sl->properties, wd);
+ }
write_layer_collections(wd, &sl->layer_collections);
}
+ if (sce->layer_properties) {
+ IDP_WriteProperty(sce->layer_properties, wd);
+ }
+
if (sce->collection_properties) {
IDP_WriteProperty(sce->collection_properties, wd);
}
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index 169c67f9702..16d9ca3ef0d 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -248,7 +248,7 @@ DrawEngineType draw_engine_basic_type = {
RenderEngineType DRW_engine_viewport_basic_type = {
NULL, NULL,
BASIC_ENGINE, N_("Basic"), RE_INTERNAL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&draw_engine_basic_type,
{NULL, NULL, NULL}
};
diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index 8ac8ed50cdc..f7ca64e6288 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -344,7 +344,11 @@ static void CLAY_engine_init(void *vedata)
/* SSAO setup */
{
- int ssao_samples = 32; /* XXX get from render settings */
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ SceneLayer *scene_layer = draw_ctx->sl;
+ IDProperty *props = BKE_scene_layer_engine_evaluated_get(scene_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_CLAY);
+ int ssao_samples = BKE_collection_engine_property_value_get_int(props, "ssao_samples");
+
float invproj[4][4];
float dfdyfacs[2];
const bool is_persp = DRW_viewport_is_persp_get();
@@ -505,7 +509,7 @@ static int mat_in_ubo(CLAY_Storage *storage, float matcap_rot, float matcap_hue,
static DRWShadingGroup *CLAY_object_shgrp_get(CLAY_Data *vedata, Object *ob, CLAY_StorageList *stl, CLAY_PassList *psl)
{
DRWShadingGroup **shgrps = stl->storage->shgrps;
- IDProperty *props = BKE_object_collection_engine_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_CLAY);
+ IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_CLAY);
/* Default Settings */
float matcap_rot = BKE_collection_engine_property_value_get_float(props, "matcap_rotation");
@@ -574,7 +578,7 @@ static void CLAY_cache_populate(void *vedata, Object *ob)
struct Batch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
- IDProperty *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
+ IDProperty *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, "");
bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
/* Depth Prepass */
@@ -614,7 +618,7 @@ static void CLAY_draw_scene(void *vedata)
DRW_draw_pass(psl->clay_pass);
}
-static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
+static void CLAY_layer_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
{
BLI_assert(props &&
props->type == IDP_GROUP &&
@@ -632,6 +636,15 @@ static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), IDProp
BKE_collection_engine_property_add_float(props, "ssao_factor_edge", 1.0f);
}
+static void CLAY_scene_layer_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
+{
+ BLI_assert(props &&
+ props->type == IDP_GROUP &&
+ props->subtype == IDP_GROUP_SUB_ENGINE_RENDER);
+
+ BKE_collection_engine_property_add_int(props, "ssao_samples", 32);
+}
+
static void CLAY_engine_free(void)
{
DRW_SHADER_FREE_SAFE(e_data.clay_sh);
@@ -658,7 +671,9 @@ DrawEngineType draw_engine_clay_type = {
RenderEngineType DRW_engine_viewport_clay_type = {
NULL, NULL,
CLAY_ENGINE, N_("Clay"), RE_INTERNAL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, &CLAY_collection_settings_create,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ &CLAY_layer_collection_settings_create,
+ &CLAY_scene_layer_settings_create,
&draw_engine_clay_type,
{NULL, NULL, NULL}
};
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index f5c07d55c20..ad4e1897b00 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -555,7 +555,7 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
struct Batch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
- IDProperty *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
+ IDProperty *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, "");
const bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
/* Depth Prepass */
@@ -717,12 +717,22 @@ static void EEVEE_engine_free(void)
DRW_TEXTURE_FREE_SAFE(e_data.jitter);
}
-static void EEVEE_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
+static void EEVEE_layer_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
{
BLI_assert(props &&
props->type == IDP_GROUP &&
props->subtype == IDP_GROUP_SUB_ENGINE_RENDER);
// BKE_collection_engine_property_add_int(props, "high_quality_sphere_lamps", false);
+ UNUSED_VARS_NDEBUG(props);
+}
+
+
+static void EEVEE_scene_layer_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
+{
+ BLI_assert(props &&
+ props->type == IDP_GROUP &&
+ props->subtype == IDP_GROUP_SUB_ENGINE_RENDER);
+ UNUSED_VARS_NDEBUG(props);
}
static const DrawEngineDataSize EEVEE_data_size = DRW_VIEWPORT_DATA_SIZE(EEVEE_Data);
@@ -743,7 +753,8 @@ DrawEngineType draw_engine_eevee_type = {
RenderEngineType DRW_engine_viewport_eevee_type = {
NULL, NULL,
EEVEE_ENGINE, N_("Eevee"), RE_INTERNAL | RE_USE_SHADING_NODES,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, &EEVEE_collection_settings_create,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ &EEVEE_layer_collection_settings_create, &EEVEE_scene_layer_settings_create,
&draw_engine_eevee_type,
{NULL, NULL, NULL}
};
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index 6a530cccb6e..3b7595d18d1 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -224,7 +224,7 @@ DrawEngineType draw_engine_external_type = {
RenderEngineType DRW_engine_viewport_external_type = {
NULL, NULL,
EXTERNAL_ENGINE, N_("External"), RE_INTERNAL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&draw_engine_external_type,
{NULL, NULL, NULL}
};
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 3aa3eb20b90..04bf7eea0bd 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1607,7 +1607,7 @@ bool DRW_is_object_renderable(Object *ob)
if (ob->type == OB_MESH) {
if (ob == obedit) {
- IDProperty *props = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
+ IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, "");
bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(props, "show_occlude_wire");
if (do_occlude_wire)
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index 4b5c9009b72..120d977c222 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -400,7 +400,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
if (ob->type == OB_MESH) {
if (ob == obedit) {
- IDProperty *ces_mode_ed = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
+ IDProperty *ces_mode_ed = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, "");
bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");
/* Updating uniform */
backwire_opacity = BKE_collection_engine_property_value_get_float(ces_mode_ed, "backwire_opacity");
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index c4add618e10..72221d0820f 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -1182,7 +1182,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
SceneLayer *sl = draw_ctx->sl;
int theme_id = TH_UNDEFINED;
- //CollectionEngineSettings *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
+ //CollectionEngineSettings *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, "");
//bool do_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_wire");
bool do_outlines = ((ob->base_flag & BASE_SELECTED) != 0);
diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c
index ff2f475713a..6098b37b3db 100644
--- a/source/blender/draw/modes/paint_vertex_mode.c
+++ b/source/blender/draw/modes/paint_vertex_mode.c
@@ -144,7 +144,7 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob)
SceneLayer *sl = draw_ctx->sl;
if (ob->type == OB_MESH && ob == sl->basact->object) {
- IDProperty *ces_mode_pw = BKE_object_collection_engine_get(ob, COLLECTION_MODE_PAINT_VERTEX, "");
+ IDProperty *ces_mode_pw = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_PAINT_VERTEX, "");
bool use_wire = BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_wire");
char flag = ((Mesh *)ob->data)->editflag;
struct Batch *geom;
diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c
index eda65a5d5a5..10e798f1fc3 100644
--- a/source/blender/draw/modes/paint_weight_mode.c
+++ b/source/blender/draw/modes/paint_weight_mode.c
@@ -168,7 +168,7 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob)
SceneLayer *sl = draw_ctx->sl;
if (ob->type == OB_MESH && ob == sl->basact->object) {
- IDProperty *ces_mode_pw = BKE_object_collection_engine_get(ob, COLLECTION_MODE_PAINT_WEIGHT, "");
+ IDProperty *ces_mode_pw = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_PAINT_WEIGHT, "");
bool use_wire = BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_wire");
char flag = ((Mesh *)ob->data)->editflag;
struct Batch *geom;
diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h
index c8156fa8dc0..c97413915c6 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -76,6 +76,8 @@ typedef struct SceneLayer {
ListBase object_bases; /* ObjectBase */
struct Base *basact;
ListBase layer_collections; /* LayerCollection */
+ struct IDProperty *properties; /* overrides */
+ struct IDProperty *properties_evaluated;
} SceneLayer;
typedef struct SceneCollection {
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 6815375b918..23ea08da26c 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1753,6 +1753,8 @@ typedef struct Scene {
int pad4;
IDProperty *collection_properties; /* settings to be overriden by layer collections */
+ IDProperty *layer_properties; /* settings to be override by workspaces */
+
int pad5[2];
} Scene;
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 8adf3eda079..6d61e69cec3 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -1932,6 +1932,31 @@ static void rna_GameSettings_exit_key_set(PointerRNA *ptr, int value)
gm->exitkey = value;
}
+static StructRNA *rna_SceneLayerSettings_refine(PointerRNA *ptr)
+{
+ IDProperty *props = (IDProperty *)ptr->data;
+ BLI_assert(props && props->type == IDP_GROUP);
+
+ switch (props->subtype) {
+ case IDP_GROUP_SUB_ENGINE_RENDER:
+#ifdef WITH_CLAY_ENGINE
+ if (STREQ(props->name, RE_engine_id_BLENDER_CLAY)) {
+ return &RNA_SceneLayerEngineSettingsClay;
+ }
+#endif
+ break;
+ case IDP_GROUP_SUB_MODE_OBJECT:
+ case IDP_GROUP_SUB_MODE_EDIT:
+ case IDP_GROUP_SUB_MODE_PAINT_WEIGHT:
+ case IDP_GROUP_SUB_MODE_PAINT_VERTEX:
+ default:
+ BLI_assert(!"Mode not fully implemented");
+ break;
+ }
+
+ return &RNA_SceneLayerSettings;
+}
+
static StructRNA *rna_LayerCollectionSettings_refine(PointerRNA *ptr)
{
IDProperty *props = (IDProperty *)ptr->data;
@@ -2505,6 +2530,10 @@ static void rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_set(PointerRNA *ptr,
/* clay engine */
#ifdef WITH_CLAY_ENGINE
+/* SceneLayer settings. */
+RNA_LAYER_ENGINE_CLAY_GET_SET_INT(ssao_samples)
+
+/* LayerCollection settings. */
RNA_LAYER_ENGINE_CLAY_GET_SET_INT(matcap_icon)
RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(matcap_rotation)
RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(matcap_hue)
@@ -2538,6 +2567,13 @@ RNA_LAYER_MODE_PAINT_VERTEX_GET_SET_BOOL(use_wire)
#undef RNA_LAYER_ENGINE_GET_SET
+static void rna_SceneLayerEngineSettings_update(bContext *C, PointerRNA *UNUSED(ptr))
+{
+ Scene *scene = CTX_data_scene(C);
+ /* TODO(sergey): Use proper flag for tagging here. */
+ DAG_id_tag_update(&scene->id, 0);
+}
+
static void rna_LayerCollectionEngineSettings_update(bContext *C, PointerRNA *UNUSED(ptr))
{
Scene *scene = CTX_data_scene(C);
@@ -2561,52 +2597,33 @@ static void rna_LayerCollectionEngineSettings_wire_update(bContext *C, PointerRN
/***********************************/
-static void rna_LayerCollectionSettings_name_get(PointerRNA *ptr, char *value)
+static void engine_settings_use(IDProperty *root, IDProperty *props, PointerRNA *props_ptr, const char *identifier)
{
- IDProperty *props = (IDProperty *)ptr->data;
- strcpy(value, props->name);
-}
-
-static int rna_LayerCollectionSettings_name_length(PointerRNA *ptr)
-{
- IDProperty *props = (IDProperty *)ptr->data;
- return strnlen(props->name, sizeof(props->name));
-}
-
-static void rna_LayerCollectionSettings_use(ID *id, IDProperty *props, const char *identifier)
-{
- Scene *scene = (Scene *)id;
- PointerRNA scene_props_ptr;
- PropertyRNA *prop;
- IDProperty *scene_props;
-
- scene_props = BKE_scene_collection_engine_get(scene, COLLECTION_MODE_NONE, props->name);
- RNA_pointer_create(id, &RNA_LayerCollectionSettings, scene_props, &scene_props_ptr);
- prop = RNA_struct_find_property(&scene_props_ptr, identifier);
+ PropertyRNA *prop = RNA_struct_find_property(props_ptr, identifier);
switch (RNA_property_type(prop)) {
case PROP_FLOAT:
{
- float value = BKE_collection_engine_property_value_get_float(scene_props, identifier);
- BKE_collection_engine_property_add_float(props, identifier, value);
+ float value = BKE_collection_engine_property_value_get_float(props, identifier);
+ BKE_collection_engine_property_add_float(root, identifier, value);
break;
}
case PROP_ENUM:
{
- int value = BKE_collection_engine_property_value_get_int(scene_props, identifier);
- BKE_collection_engine_property_add_int(props, identifier, value);
+ int value = BKE_collection_engine_property_value_get_int(props, identifier);
+ BKE_collection_engine_property_add_int(root, identifier, value);
break;
}
case PROP_INT:
{
- int value = BKE_collection_engine_property_value_get_int(scene_props, identifier);
- BKE_collection_engine_property_add_int(props, identifier, value);
+ int value = BKE_collection_engine_property_value_get_int(props, identifier);
+ BKE_collection_engine_property_add_int(root, identifier, value);
break;
}
case PROP_BOOLEAN:
{
- int value = BKE_collection_engine_property_value_get_int(scene_props, identifier);
- BKE_collection_engine_property_add_bool(props, identifier, value);
+ int value = BKE_collection_engine_property_value_get_int(props, identifier);
+ BKE_collection_engine_property_add_bool(root, identifier, value);
break;
}
case PROP_STRING:
@@ -2615,6 +2632,65 @@ static void rna_LayerCollectionSettings_use(ID *id, IDProperty *props, const cha
default:
break;
}
+}
+
+static void rna_SceneLayerSettings_name_get(PointerRNA *ptr, char *value)
+{
+ IDProperty *props = (IDProperty *)ptr->data;
+ strcpy(value, props->name);
+}
+
+static int rna_SceneLayerSettings_name_length(PointerRNA *ptr)
+{
+ IDProperty *props = (IDProperty *)ptr->data;
+ return strnlen(props->name, sizeof(props->name));
+}
+
+static void rna_SceneLayerSettings_use(ID *id, IDProperty *props, const char *identifier)
+{
+ Scene *scene = (Scene *)id;
+ PointerRNA scene_props_ptr;
+ IDProperty *scene_props;
+
+ scene_props = BKE_scene_layer_engine_scene_get(scene, COLLECTION_MODE_NONE, props->name);
+ RNA_pointer_create(id, &RNA_SceneLayerSettings, scene_props, &scene_props_ptr);
+
+ engine_settings_use(props, scene_props, &scene_props_ptr, identifier);
+
+ /* TODO(sergey): Use proper flag for tagging here. */
+ DAG_id_tag_update(id, 0);
+}
+
+static void rna_SceneLayerSettings_unuse(ID *id, IDProperty *props, const char *identifier)
+{
+ IDProperty *prop_to_remove = IDP_GetPropertyFromGroup(props, identifier);
+ IDP_FreeFromGroup(props, prop_to_remove);
+
+ /* TODO(sergey): Use proper flag for tagging here. */
+ DAG_id_tag_update(id, 0);
+}
+
+static void rna_LayerCollectionSettings_name_get(PointerRNA *ptr, char *value)
+{
+ IDProperty *props = (IDProperty *)ptr->data;
+ strcpy(value, props->name);
+}
+
+static int rna_LayerCollectionSettings_name_length(PointerRNA *ptr)
+{
+ IDProperty *props = (IDProperty *)ptr->data;
+ return strnlen(props->name, sizeof(props->name));
+}
+
+static void rna_LayerCollectionSettings_use(ID *id, IDProperty *props, const char *identifier)
+{
+ Scene *scene = (Scene *)id;
+ PointerRNA scene_props_ptr;
+ IDProperty *scene_props;
+
+ scene_props = BKE_layer_collection_engine_scene_get(scene, COLLECTION_MODE_NONE, props->name);
+ RNA_pointer_create(id, &RNA_LayerCollectionSettings, scene_props, &scene_props_ptr);
+ engine_settings_use(props, scene_props, &scene_props_ptr, identifier);
/* TODO(sergey): Use proper flag for tagging here. */
DAG_id_tag_update(id, 0);
@@ -6003,6 +6079,31 @@ static void rna_def_layer_collection_override(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, NULL);
}
+
+#ifdef WITH_CLAY_ENGINE
+static void rna_def_scene_layer_engine_settings_clay(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "SceneLayerEngineSettingsClay", "SceneLayerSettings");
+ RNA_def_struct_ui_text(srna, "Clay Scene Layer Settings", "Clay Engine settings");
+
+ RNA_define_verify_sdna(0); /* not in sdna */
+
+ /* see RNA_LAYER_ENGINE_GET_SET macro */
+ prop = RNA_def_property(srna, "ssao_samples", PROP_INT, PROP_NONE);
+ RNA_def_property_int_funcs(prop, "rna_LayerEngineSettings_Clay_ssao_samples_get",
+ "rna_LayerEngineSettings_Clay_ssao_samples_set", NULL);
+ RNA_def_property_ui_text(prop, "Samples", "Number of samples");
+ RNA_def_property_range(prop, 1, 500);
+ RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
+ RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_SceneLayerEngineSettings_update");
+
+ RNA_define_verify_sdna(1); /* not in sdna */
+}
+#endif /* WITH_CLAY_ENGINE */
+
#ifdef WITH_CLAY_ENGINE
static void rna_def_layer_collection_engine_settings_clay(BlenderRNA *brna)
{
@@ -6243,6 +6344,53 @@ static void rna_def_layer_collection_mode_settings_paint_vertex(BlenderRNA *brna
RNA_define_verify_sdna(1); /* not in sdna */
}
+static void rna_def_scene_layer_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ srna = RNA_def_struct(brna, "SceneLayerSettings", NULL);
+ RNA_def_struct_sdna(srna, "IDProperty");
+ RNA_def_struct_ui_text(srna, "Scene Layer Settings",
+ "Engine specific settings that can be overriden by SceneLayer");
+ RNA_def_struct_refine_func(srna, "rna_SceneLayerSettings_refine");
+
+ RNA_define_verify_sdna(0);
+
+ prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop, "rna_SceneLayerSettings_name_get", "rna_SceneLayerSettings_name_length", NULL);
+ RNA_def_property_ui_text(prop, "Name", "Engine Name");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_struct_name_property(srna, prop);
+
+ func = RNA_def_function(srna, "use", "rna_SceneLayerSettings_use");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+ RNA_def_function_ui_description(func, "Initialize this property to use");
+ parm = RNA_def_string(func, "identifier", NULL, 0, "Property Name", "Name of the property to set");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+
+ func = RNA_def_function(srna, "unuse", "rna_SceneLayerSettings_unuse");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+ RNA_def_function_ui_description(func, "Remove the property");
+ parm = RNA_def_string(func, "identifier", NULL, 0, "Property Name", "Name of the property to unset");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+
+#ifdef WITH_CLAY_ENGINE
+ rna_def_scene_layer_engine_settings_clay(brna);
+#endif
+
+#if 0
+ rna_def_scene_layer_mode_settings_object(brna);
+ rna_def_scene_layer_mode_settings_edit(brna);
+ rna_def_scene_layer_mode_settings_paint_weight(brna);
+ rna_def_scene_layer_mode_settings_paint_vertex(brna);
+#endif
+
+ RNA_define_verify_sdna(1);
+}
+
static void rna_def_layer_collection_settings(BlenderRNA *brna)
{
StructRNA *srna;
@@ -6484,6 +6632,12 @@ static void rna_def_scene_layer(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Enabled", "Disable or enable the render layer");
RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL);
+ /* Override settings */
+ prop = RNA_def_property(srna, "engine_overrides", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "properties->data.group", NULL);
+ RNA_def_property_struct_type(prop, "SceneLayerSettings");
+ RNA_def_property_ui_text(prop, "Layer Settings", "Override of engine specific render settings");
+
/* engine */
prop = RNA_def_property(srna, "engine", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, engine_items);
@@ -7304,27 +7458,6 @@ static void rna_def_scene_quicktime_settings(BlenderRNA *brna)
}
#endif
-#ifdef WITH_CLAY_ENGINE
-static void UNUSED_FUNCTION(rna_def_scene_engine_settings_clay)(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "SceneEngineSettingsClay", "SceneEngineSettings");
- RNA_def_struct_ui_text(srna, "Clay Scene Settings", "Clay Engine settings");
-
- RNA_define_verify_sdna(0); /* not in sdna */
-
- /* Clay settings */
- prop = RNA_def_property(srna, "ssao_samples", PROP_INT, PROP_NONE);
- RNA_def_property_ui_text(prop, "Samples", "Number of samples");
- RNA_def_property_range(prop, 1, 500);
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
-
- RNA_define_verify_sdna(1); /* not in sdna */
-}
-#endif /* WITH_CLAY_ENGINE */
-
static void rna_def_scene_render_data(BlenderRNA *brna)
{
StructRNA *srna;
@@ -8833,6 +8966,12 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Render Data", "");
/* Render Engine Data */
+ prop = RNA_def_property(srna, "layer_properties", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "layer_properties->data.group", NULL);
+ RNA_def_property_struct_type(prop, "SceneLayerSettings");
+ RNA_def_property_ui_text(prop, "Layer Settings",
+ "Engine specific render settings to be overridden by layers");
+
prop = RNA_def_property(srna, "collection_properties", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "collection_properties->data.group", NULL);
RNA_def_property_struct_type(prop, "LayerCollectionSettings");
@@ -8989,6 +9128,7 @@ void RNA_def_scene(BlenderRNA *brna)
rna_def_object_base(brna);
RNA_define_animate_sdna(true);
/* *** Animated *** */
+ rna_def_scene_layer_settings(brna);
rna_def_layer_collection_settings(brna);
rna_def_scene_render_data(brna);
rna_def_scene_render_layer(brna);
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 13848093899..8091d4005fd 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -105,6 +105,7 @@ typedef struct RenderEngineType {
void (*update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct SceneRenderLayer *srl);
void (*collection_settings_create)(struct RenderEngine *engine, struct IDProperty *props);
+ void (*render_settings_create)(struct RenderEngine *engine, struct IDProperty *props);
struct DrawEngineType *draw_engine;
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index 8b9e4a3eff5..b34391d7d2d 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -74,7 +74,7 @@
static RenderEngineType internal_render_type = {
NULL, NULL,
"BLENDER_RENDER", N_("Blender Render"), RE_INTERNAL | RE_USE_LEGACY_PIPELINE,
- NULL, NULL, NULL, NULL, NULL, NULL, render_internal_update_passes, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, render_internal_update_passes, NULL, NULL, NULL,
{NULL, NULL, NULL}
};
@@ -83,7 +83,7 @@ static RenderEngineType internal_render_type = {
static RenderEngineType internal_game_type = {
NULL, NULL,
"BLENDER_GAME", N_("Blender Game"), RE_INTERNAL | RE_GAME | RE_USE_LEGACY_PIPELINE,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
{NULL, NULL, NULL}
};
@@ -107,6 +107,7 @@ void RE_engines_exit(void)
DRW_engines_free();
BKE_layer_collection_engine_settings_callback_free();
+ BKE_scene_layer_engine_settings_callback_free();
for (type = R_engines.first; type; type = next) {
next = type->next;
@@ -131,6 +132,10 @@ void RE_engines_register(Main *bmain, RenderEngineType *render_type)
BKE_layer_collection_engine_settings_callback_register(
bmain, render_type->idname, render_type->collection_settings_create);
}
+ if (render_type->render_settings_create) {
+ BKE_scene_layer_engine_settings_callback_register(
+ bmain, render_type->idname, render_type->render_settings_create);
+ }
BLI_addtail(&R_engines, render_type);
}