diff options
34 files changed, 658 insertions, 1477 deletions
diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py index ddfc656da08..c1e2b00966c 100644 --- a/release/scripts/startup/bl_ui/properties_collection.py +++ b/release/scripts/startup/bl_ui/properties_collection.py @@ -43,27 +43,6 @@ class COLLECTION_PT_context_collection(CollectionButtonsPanel, Panel): layout.prop(collection, "name", text="", icon='COLLAPSEMENU') -def template_engine_settings(col, settings, name, use_icon_view=False): - icons = { - False: 'ZOOMIN', - True: 'X', - } - - use_name = "{0}_use".format(name) - use = getattr(settings, use_name) - - row = col.row() - col = row.column() - col.active = use - - if use_icon_view: - col.template_icon_view(settings, name) - else: - col.prop(settings, name) - - row.prop(settings, "{}_use".format(name), text="", icon=icons[use], emboss=False) - - class COLLECTION_PT_clay_settings(CollectionButtonsPanel, Panel): bl_label = "Render Settings" COMPAT_ENGINES = {'BLENDER_CLAY'} @@ -75,21 +54,20 @@ class COLLECTION_PT_clay_settings(CollectionButtonsPanel, Panel): def draw(self, context): layout = self.layout - + scene_props = context.scene.collection_properties['BLENDER_CLAY'] collection = context.layer_collection - settings = collection.get_engine_settings() + collection_props = collection.engine_overrides['BLENDER_CLAY'] col = layout.column() - template_engine_settings(col, settings, "type") - template_engine_settings(col, settings, "matcap_icon", use_icon_view=True) - template_engine_settings(col, settings, "matcap_rotation") - template_engine_settings(col, settings, "matcap_hue") - template_engine_settings(col, settings, "matcap_saturation") - template_engine_settings(col, settings, "matcap_value") - template_engine_settings(col, settings, "ssao_factor_cavity") - template_engine_settings(col, settings, "ssao_factor_edge") - template_engine_settings(col, settings, "ssao_distance") - template_engine_settings(col, settings, "ssao_attenuation") + col.template_override_property(collection_props, scene_props, "matcap_icon", custom_template="icon_view") + col.template_override_property(collection_props, scene_props, "matcap_rotation") + col.template_override_property(collection_props, scene_props, "matcap_hue") + col.template_override_property(collection_props, scene_props, "matcap_saturation") + col.template_override_property(collection_props, scene_props, "matcap_value") + col.template_override_property(collection_props, scene_props, "ssao_factor_cavity") + col.template_override_property(collection_props, scene_props, "ssao_factor_edge") + col.template_override_property(collection_props, scene_props, "ssao_distance") + col.template_override_property(collection_props, scene_props, "ssao_attenuation") class COLLECTION_PT_object_mode_settings(CollectionButtonsPanel, Panel): @@ -102,13 +80,13 @@ class COLLECTION_PT_object_mode_settings(CollectionButtonsPanel, Panel): def draw(self, context): layout = self.layout - + scene_props = context.scene.collection_properties['ObjectMode'] collection = context.layer_collection - settings = collection.get_mode_settings('OBJECT') + collection_props = collection.engine_overrides['ObjectMode'] col = layout.column() - template_engine_settings(col, settings, "show_wire") - template_engine_settings(col, settings, "show_backface_culling") + col.template_override_property(collection_props, scene_props, "show_wire") + col.template_override_property(collection_props, scene_props, "show_backface_culling") class COLLECTION_PT_edit_mode_settings(CollectionButtonsPanel, Panel): @@ -121,17 +99,17 @@ class COLLECTION_PT_edit_mode_settings(CollectionButtonsPanel, Panel): def draw(self, context): layout = self.layout - + scene_props = context.scene.collection_properties['EditMode'] collection = context.layer_collection - settings = collection.get_mode_settings('EDIT') + collection_props = collection.engine_overrides['EditMode'] col = layout.column() - template_engine_settings(col, settings, "show_occlude_wire") - template_engine_settings(col, settings, "backwire_opacity") - template_engine_settings(col, settings, "face_normals_show") - template_engine_settings(col, settings, "vert_normals_show") - template_engine_settings(col, settings, "loop_normals_show") - template_engine_settings(col, settings, "normals_length") + col.template_override_property(collection_props, scene_props, "show_occlude_wire") + col.template_override_property(collection_props, scene_props, "backwire_opacity") + col.template_override_property(collection_props, scene_props, "face_normals_show") + col.template_override_property(collection_props, scene_props, "vert_normals_show") + col.template_override_property(collection_props, scene_props, "loop_normals_show") + col.template_override_property(collection_props, scene_props, "normals_length") classes = ( diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 43c89a32a52..be7104163fd 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -584,23 +584,24 @@ class RENDER_PT_bake(RenderButtonsPanel, Panel): sub.prop(rd, "bake_user_scale", text="User Scale") -class RENDER_PT_clay(RenderButtonsPanel, Panel): - bl_label = "Default Clay" +class RENDER_PT_clay_collection_settings(RenderButtonsPanel, Panel): + bl_label = "Clay Collection Settings" COMPAT_ENGINES = {'BLENDER_CLAY'} def draw(self, context): - layout = self.layout; - settings = context.scene.active_engine_settings - layout.template_icon_view(settings, "matcap_icon") - layout.prop(settings, "matcap_rotation") - layout.prop(settings, "matcap_hue") - layout.prop(settings, "matcap_saturation") - layout.prop(settings, "matcap_value") - layout.prop(settings, "ssao_factor_cavity") - layout.prop(settings, "ssao_factor_edge") - layout.prop(settings, "ssao_distance") - layout.prop(settings, "ssao_attenuation") - layout.prop(settings, "ssao_samples") + layout = self.layout + props = context.scene.collection_properties['BLENDER_CLAY'] + + col = layout.column() + col.template_icon_view(props, "matcap_icon") + col.prop(props, "matcap_rotation") + col.prop(props, "matcap_hue") + col.prop(props, "matcap_saturation") + col.prop(props, "matcap_value") + col.prop(props, "ssao_factor_cavity") + col.prop(props, "ssao_factor_edge") + col.prop(props, "ssao_distance") + col.prop(props, "ssao_attenuation") classes = ( @@ -618,7 +619,7 @@ classes = ( RENDER_PT_output, RENDER_PT_encoding, RENDER_PT_bake, - RENDER_PT_clay, + RENDER_PT_clay_collection_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 e1ae266aaa8..07d1c255188 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -42,9 +42,11 @@ extern "C" { #define TODO_LAYER_DEPSGRAPH /* placeholder for real Depsgraph fix */ #define TODO_LAYER /* generic todo */ -struct CollectionEngineSettings; +#define ROOT_PROP "root" + struct LayerCollection; struct ID; +struct IDProperty; struct ListBase; struct Main; struct Object; @@ -75,7 +77,7 @@ void BKE_scene_layer_base_flag_recalculate(struct SceneLayer *sl); void BKE_scene_layer_engine_settings_recalculate(struct SceneLayer *sl); void BKE_scene_layer_engine_settings_object_recalculate(struct SceneLayer *sl, struct Object *ob); void BKE_scene_layer_engine_settings_collection_recalculate(struct SceneLayer *sl, struct LayerCollection *lc); -void BKE_scene_layer_engine_settings_update(struct SceneLayer *sl); +void BKE_scene_layer_engine_settings_update(struct Scene *scene, struct SceneLayer *sl); void BKE_layer_collection_free(struct SceneLayer *sl, struct LayerCollection *lc); @@ -109,28 +111,23 @@ 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 CollectionEngineSettings *ces); -struct CollectionEngineSettings *BKE_layer_collection_engine_get(struct LayerCollection *lc, const int type, const char *engine_name); -struct CollectionEngineSettings *BKE_object_collection_engine_get(struct Object *ob, const int type, const char *engine_name); +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); void BKE_layer_collection_engine_settings_callback_register(struct Main *bmain, const char *engine_name, CollectionEngineSettingsCB func); void BKE_layer_collection_engine_settings_callback_free(void); +void BKE_layer_collection_engine_settings_create(struct 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); -struct CollectionEngineSettings *BKE_layer_collection_engine_settings_create(const char *engine_name); -void BKE_layer_collection_engine_settings_free(struct CollectionEngineSettings *ces); -void BKE_layer_collection_engine_settings_list_free(struct ListBase *lb); - -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); -void BKE_collection_engine_property_add_bool(struct CollectionEngineSettings *ces, const char *name, bool value); -struct CollectionEngineProperty *BKE_collection_engine_property_get(struct CollectionEngineSettings *ces, const char *name); -int BKE_collection_engine_property_value_get_int(struct CollectionEngineSettings *ces, const char *name); -float BKE_collection_engine_property_value_get_float(struct CollectionEngineSettings *ces, const char *name); -bool BKE_collection_engine_property_value_get_bool(struct CollectionEngineSettings *ces, const char *name); -void BKE_collection_engine_property_value_set_int(struct CollectionEngineSettings *ces, const char *name, int value); -void BKE_collection_engine_property_value_set_float(struct CollectionEngineSettings *ces, const char *name, float value); -void BKE_collection_engine_property_value_set_bool(struct CollectionEngineSettings *ces, const char *name, bool value); -bool BKE_collection_engine_property_use_get(struct CollectionEngineSettings *ces, const char *name); -void BKE_collection_engine_property_use_set(struct CollectionEngineSettings *ces, const char *name, bool value); +int BKE_collection_engine_property_value_get_int(struct IDProperty *props, const char *name); +float BKE_collection_engine_property_value_get_float(struct IDProperty *props, const char *name); +bool BKE_collection_engine_property_value_get_bool(struct IDProperty *props, const char *name); +void BKE_collection_engine_property_value_set_int(struct IDProperty *props, const char *name, int value); +void BKE_collection_engine_property_value_set_float(struct IDProperty *props, const char *name, float value); +void BKE_collection_engine_property_value_set_bool(struct IDProperty *props, const char *name, bool value); /* iterators */ @@ -212,11 +209,11 @@ void BKE_visible_bases_Iterator_end(Iterator *iter); } /* temporary hacky solution waiting for final depsgraph evaluation */ -#define DEG_OBJECT_ITER(sl_, instance_) \ +#define DEG_OBJECT_ITER(scene_, sl_, instance_) \ { \ Object *instance_; \ /* temporary solution, waiting for depsgraph update */ \ - BKE_scene_layer_engine_settings_update(sl_); \ + BKE_scene_layer_engine_settings_update(scene_, sl_); \ \ /* flush all the data to objects*/ \ Base *base_; \ @@ -232,9 +229,6 @@ void BKE_visible_bases_Iterator_end(Iterator *iter); } \ } -/* temporary doversion functions */ -void BKE_scene_layer_doversion_update(struct Main *bmain); - #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c index b2641b110f8..31d98a00610 100644 --- a/source/blender/blenkernel/intern/idprop.c +++ b/source/blender/blenkernel/intern/idprop.c @@ -468,6 +468,7 @@ static IDProperty *IDP_CopyGroup(const IDProperty *prop) BLI_assert(prop->type == IDP_GROUP); newp = idp_generic_copy(prop); newp->len = prop->len; + newp->subtype = prop->subtype; for (link = prop->data.group.first; link; link = link->next) { BLI_addtail(&newp->data.group, IDP_CopyProperty(link)); diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 6ab7e85cd0d..a593d400f56 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -33,6 +33,7 @@ #include "BLT_translation.h" #include "BKE_collection.h" +#include "BKE_idprop.h" #include "BKE_layer.h" #include "BKE_main.h" #include "BKE_node.h" @@ -52,11 +53,10 @@ struct CollectionEngineSettingsCB_Type; static void layer_collection_free(SceneLayer *sl, LayerCollection *lc); static LayerCollection *layer_collection_add(SceneLayer *sl, ListBase *lb, SceneCollection *sc); static LayerCollection *find_layer_collection_by_scene_collection(LayerCollection *lc, const SceneCollection *sc); -static CollectionEngineSettings *collection_engine_settings_create(struct CollectionEngineSettingsCB_Type *ces_type); -static void layer_collection_engine_settings_free(LayerCollection *lc); -static void layer_collection_create_engine_settings(LayerCollection *lc); -static void layer_collection_create_mode_settings(LayerCollection *lc); -static void scene_layer_engine_settings_update(SceneLayer *sl, Object *ob); +static IDProperty *collection_engine_settings_create(struct CollectionEngineSettingsCB_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 scene_layer_engine_settings_update(Scene *scene, SceneLayer *sl, Object *ob); static void object_bases_Iterator_next(Iterator *iter, const int flag); /* RenderLayer */ @@ -337,7 +337,7 @@ void BKE_scene_layer_engine_settings_collection_recalculate(SceneLayer *sl, Laye * * Temporary function, waiting for real depsgraph */ -void BKE_scene_layer_engine_settings_update(struct SceneLayer *sl) +void BKE_scene_layer_engine_settings_update(struct Scene *scene, struct SceneLayer *sl) { if ((sl->flag & SCENE_LAYER_ENGINE_DIRTY) == 0) { return; @@ -348,7 +348,7 @@ void BKE_scene_layer_engine_settings_update(struct SceneLayer *sl) if (((base->flag & BASE_DIRTY_ENGINE_SETTINGS) != 0) && \ (base->flag & BASE_VISIBLED) != 0) { - scene_layer_engine_settings_update(sl, base->object); + scene_layer_engine_settings_update(scene, sl, base->object); base->flag &= ~BASE_DIRTY_ENGINE_SETTINGS; } } @@ -392,7 +392,11 @@ static void layer_collection_free(SceneLayer *sl, LayerCollection *lc) BLI_freelistN(&lc->object_bases); BLI_freelistN(&lc->overrides); - layer_collection_engine_settings_free(lc); + + if (lc->properties) { + IDP_FreeProperty(lc->properties); + MEM_freeN(lc->properties); + } for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) { layer_collection_free(sl, nlc); @@ -910,14 +914,16 @@ static void layer_collection_populate(SceneLayer *sl, LayerCollection *lc, Scene static LayerCollection *layer_collection_add(SceneLayer *sl, ListBase *lb, SceneCollection *sc) { + IDPropertyTemplate val = {0}; LayerCollection *lc = MEM_callocN(sizeof(LayerCollection), "Collection Base"); BLI_addtail(lb, lc); lc->scene_collection = sc; lc->flag = COLLECTION_VISIBLE + COLLECTION_SELECTABLE + COLLECTION_FOLDED; - layer_collection_create_engine_settings(lc); - layer_collection_create_mode_settings(lc); + lc->properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); + collection_engine_settings_init(lc->properties, false); + layer_collection_populate(sl, lc, sc); return lc; @@ -1044,14 +1050,24 @@ typedef struct CollectionEngineSettingsCB_Type { } CollectionEngineSettingsCB_Type; +static void create_engine_settings_scene(Scene *scene, CollectionEngineSettingsCB_Type *ces_type) +{ + if (collection_engine_get(scene->collection_properties, COLLECTION_MODE_NONE, ces_type->name)) { + return; + } + + IDProperty *props = collection_engine_settings_create(ces_type, true); + IDP_AddToGroup(scene->collection_properties, props); +} + static void create_engine_settings_layer_collection(LayerCollection *lc, CollectionEngineSettingsCB_Type *ces_type) { if (BKE_layer_collection_engine_get(lc, COLLECTION_MODE_NONE, ces_type->name)) { return; } - CollectionEngineSettings *ces = collection_engine_settings_create(ces_type); - BLI_addtail(&lc->engine_settings, ces); + IDProperty *props = collection_engine_settings_create(ces_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); @@ -1060,6 +1076,9 @@ static void create_engine_settings_layer_collection(LayerCollection *lc, Collect static void create_engines_settings_scene(Scene *scene, CollectionEngineSettingsCB_Type *ces_type) { + /* populate the scene with the new settings */ + create_engine_settings_scene(scene, 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); @@ -1099,123 +1118,116 @@ void BKE_layer_collection_engine_settings_callback_free(void) BLI_freelistN(&R_engines_settings_callbacks); } -static CollectionEngineSettings *collection_engine_settings_create(CollectionEngineSettingsCB_Type *ces_type) -{ - /* create callback data */ - CollectionEngineSettings *ces = MEM_callocN(sizeof(CollectionEngineSettings), "Collection Engine Settings"); - BLI_strncpy_utf8(ces->name, ces_type->name, sizeof(ces->name)); - - /* call callback */ - ces_type->callback(NULL, ces); - - return ces; -} - /** - * Initialize a CollectionEngineSettings + * Create a root IDProperty for this engine * - * Usually we would pass LayerCollection->engine_settings - * But depsgraph uses this for Object->collection_settings - */ -CollectionEngineSettings *BKE_layer_collection_engine_settings_create(const char *engine_name) -{ - CollectionEngineSettingsCB_Type *ces_type; - ces_type = BLI_findstring(&R_engines_settings_callbacks, engine_name, - offsetof(CollectionEngineSettingsCB_Type, name)); - BLI_assert(ces_type); - - CollectionEngineSettings *ces = collection_engine_settings_create(ces_type); - return ces; -} - -/** - * Free the CollectionEngineSettings + * \param populate whether we want to pre-fill the collection with the default properties */ -void BKE_layer_collection_engine_settings_free(CollectionEngineSettings *ces) +static IDProperty *collection_engine_settings_create(CollectionEngineSettingsCB_Type *ces_type, const bool populate) { - BLI_freelistN(&ces->properties); -} + IDProperty *props; + IDPropertyTemplate val = {0}; -static void layer_collection_engine_settings_free(LayerCollection *lc) -{ - for (CollectionEngineSettings *ces = lc->engine_settings.first; ces; ces = ces->next) { - BKE_layer_collection_engine_settings_free(ces); - } - BLI_freelistN(&lc->engine_settings); + props = IDP_New(IDP_GROUP, &val, ces_type->name); + props->subtype = IDP_GROUP_SUB_ENGINE_RENDER; - for (CollectionEngineSettings *ces = lc->mode_settings.first; ces; ces = ces->next) { - BKE_layer_collection_engine_settings_free(ces); + /* properties */ + if (populate) { + ces_type->callback(NULL, props); } - BLI_freelistN(&lc->mode_settings); -} -/** - * 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 props; } -static void layer_collection_create_mode_settings_object(ListBase *lb) +static void layer_collection_create_mode_settings_object(IDProperty *root, const bool populate) { - CollectionEngineSettings *ces; + IDProperty *props; + IDPropertyTemplate val = {0}; - ces = MEM_callocN(sizeof(CollectionEngineSettings), "Object Mode Settings"); - BLI_strncpy_utf8(ces->name, "Object Mode", sizeof(ces->name)); - ces->type = COLLECTION_MODE_OBJECT; + props = IDP_New(IDP_GROUP, &val, "ObjectMode"); + props->subtype = IDP_GROUP_SUB_MODE_OBJECT; /* properties */ - OBJECT_collection_settings_create(ces); + if (populate) { + OBJECT_collection_settings_create(props); + } - BLI_addtail(lb, ces); + IDP_AddToGroup(root, props); } -static void layer_collection_create_mode_settings_edit(ListBase *lb) +static void layer_collection_create_mode_settings_edit(IDProperty *root, const bool populate) { - CollectionEngineSettings *ces; + IDProperty *props; + IDPropertyTemplate val = {0}; - ces = MEM_callocN(sizeof(CollectionEngineSettings), "Edit Mode Settings"); - BLI_strncpy_utf8(ces->name, "Edit Mode", sizeof(ces->name)); - ces->type = COLLECTION_MODE_EDIT; + props = IDP_New(IDP_GROUP, &val, "EditMode"); + props->subtype = IDP_GROUP_SUB_MODE_EDIT; /* properties */ - EDIT_MESH_collection_settings_create(ces); + if (populate) { + EDIT_MESH_collection_settings_create(props); + } + + IDP_AddToGroup(root, props); +} - BLI_addtail(lb, ces); +static void 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); + IDP_AddToGroup(root, props); + } } -static void collection_create_mode_settings(ListBase *lb) +static void collection_create_mode_settings(IDProperty *root, const bool populate) { - layer_collection_create_mode_settings_object(lb); - layer_collection_create_mode_settings_edit(lb); + /* XXX TODO: put all those engines in the R_engines_settings_callbacks + * and have IDP_AddToGroup outside the callbacks */ + layer_collection_create_mode_settings_object(root, populate); + layer_collection_create_mode_settings_edit(root, populate); } -static void layer_collection_create_mode_settings(LayerCollection *lc) +static int idproperty_group_subtype(const int mode_type) { - collection_create_mode_settings(&lc->mode_settings); + int idgroup_type; + + switch (mode_type) { + case COLLECTION_MODE_OBJECT: + idgroup_type = IDP_GROUP_SUB_MODE_OBJECT; + break; + case COLLECTION_MODE_EDIT: + idgroup_type = IDP_GROUP_SUB_MODE_EDIT; + break; + default: + case COLLECTION_MODE_NONE: + return IDP_GROUP_SUB_ENGINE_RENDER; + break; + } + + return idgroup_type; } /** * Return collection enginne settings for either Object s of LayerCollection s */ -static CollectionEngineSettings *collection_engine_get( - ListBase *lb_render, ListBase *lb_mode, const int type, const char *engine_name) +static IDProperty *collection_engine_get( + IDProperty *root, const int type, const char *engine_name) { - if (type == COLLECTION_MODE_NONE) { - return BLI_findstring(lb_render, engine_name, offsetof(CollectionEngineSettings, name)); + const int subtype = idproperty_group_subtype(type); + + if (subtype == IDP_GROUP_SUB_ENGINE_RENDER) { + return IDP_GetPropertyFromGroup(root, engine_name); } else { - CollectionEngineSettings *ces; - for (ces = lb_mode->first; ces; ces = ces->next) { - if (ces->type == type) { - return ces; + IDProperty *prop; + for (prop = root->data.group.first; prop; prop = prop->next) { + if (prop->subtype == subtype) { + return prop; } } } + BLI_assert(false); return NULL; } @@ -1223,255 +1235,163 @@ static CollectionEngineSettings *collection_engine_get( /** * Return collection engine settings from Object for specified engine of mode */ -CollectionEngineSettings *BKE_object_collection_engine_get(Object *ob, const int type, const char *engine_name) +IDProperty *BKE_object_collection_engine_get(Object *ob, const int type, const char *engine_name) { - return collection_engine_get(&ob->collection_settings, &ob->collection_settings, type, engine_name); + return collection_engine_get(ob->collection_properties, type, engine_name); } /** * Return layer collection engine settings for specified engine */ -CollectionEngineSettings *BKE_layer_collection_engine_get(LayerCollection *lc, const int type, const char *engine_name) +IDProperty *BKE_layer_collection_engine_get(LayerCollection *lc, const int type, const char *engine_name) { - return collection_engine_get(&lc->engine_settings, &lc->mode_settings, type, engine_name); + return collection_engine_get(lc->properties, type, engine_name); } /* ---------------------------------------------------------------------- */ /* Engine Settings Properties */ -void BKE_collection_engine_property_add_float(CollectionEngineSettings *ces, const char *name, float value) +void BKE_collection_engine_property_add_float(IDProperty *props, 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); + IDPropertyTemplate val = {0}; + val.f = value; + IDP_AddToGroup(props, IDP_New(IDP_FLOAT, &val, name)); } -void BKE_collection_engine_property_add_int(CollectionEngineSettings *ces, const char *name, int value) +void BKE_collection_engine_property_add_int(IDProperty *props, 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); + IDPropertyTemplate val = {0}; + val.i = value; + IDP_AddToGroup(props, IDP_New(IDP_INT, &val, name)); } -void BKE_collection_engine_property_add_bool(CollectionEngineSettings *ces, const char *name, bool value) +void BKE_collection_engine_property_add_bool(IDProperty *props, const char *name, bool value) { - CollectionEnginePropertyBool *prop; - prop = MEM_callocN(sizeof(CollectionEnginePropertyBool), "collection engine settings bool"); - prop->data.type = COLLECTION_PROP_TYPE_BOOL; - BLI_strncpy_utf8(prop->data.name, name, sizeof(prop->data.name)); - prop->value = value; - BLI_addtail(&ces->properties, prop); + IDPropertyTemplate val = {0}; + val.i = value; + IDP_AddToGroup(props, IDP_New(IDP_INT, &val, name)); } -CollectionEngineProperty *BKE_collection_engine_property_get(CollectionEngineSettings *ces, const char *name) +int BKE_collection_engine_property_value_get_int(IDProperty *props, const char *name) { - return BLI_findstring(&ces->properties, name, offsetof(CollectionEngineProperty, name)); + IDProperty *idprop = IDP_GetPropertyFromGroup(props, name); + return idprop ? idprop->data.val : 0; } -int BKE_collection_engine_property_value_get_int(CollectionEngineSettings *ces, const char *name) +float BKE_collection_engine_property_value_get_float(IDProperty *props, const char *name) { - CollectionEnginePropertyInt *prop; - prop = (CollectionEnginePropertyInt *)BLI_findstring(&ces->properties, name, - offsetof(CollectionEngineProperty, name)); - return prop->value; + IDProperty *idprop = IDP_GetPropertyFromGroup(props, name); + return idprop ? *((float *)&idprop->data.val) : 0.0f; } -float BKE_collection_engine_property_value_get_float(CollectionEngineSettings *ces, const char *name) +bool BKE_collection_engine_property_value_get_bool(IDProperty *props, const char *name) { - CollectionEnginePropertyFloat *prop; - prop = (CollectionEnginePropertyFloat *)BLI_findstring(&ces->properties, name, - offsetof(CollectionEngineProperty, name)); - return prop->value; + IDProperty *idprop = IDP_GetPropertyFromGroup(props, name); + return idprop ? idprop->data.val : 0; } -bool BKE_collection_engine_property_value_get_bool(CollectionEngineSettings *ces, const char *name) +void BKE_collection_engine_property_value_set_int(IDProperty *props, const char *name, int value) { - CollectionEnginePropertyBool *prop; - prop = (CollectionEnginePropertyBool *)BLI_findstring(&ces->properties, name, - offsetof(CollectionEngineProperty, name)); - return prop->value; + IDProperty *idprop = IDP_GetPropertyFromGroup(props, name); + idprop->data.val = value; } -void BKE_collection_engine_property_value_set_int(CollectionEngineSettings *ces, const char *name, int value) +void BKE_collection_engine_property_value_set_float(IDProperty *props, const char *name, float value) { - CollectionEnginePropertyInt *prop; - prop = (CollectionEnginePropertyInt *)BLI_findstring(&ces->properties, name, - offsetof(CollectionEngineProperty, name)); - prop->value = value; - prop->data.flag |= COLLECTION_PROP_USE; + IDProperty *idprop = IDP_GetPropertyFromGroup(props, name); + *(float *)&idprop->data.val = value; } -void BKE_collection_engine_property_value_set_float(CollectionEngineSettings *ces, const char *name, float value) +void BKE_collection_engine_property_value_set_bool(IDProperty *props, const char *name, bool value) { - CollectionEnginePropertyFloat *prop; - prop = (CollectionEnginePropertyFloat *)BLI_findstring(&ces->properties, name, - offsetof(CollectionEngineProperty, name)); - prop->value = value; - prop->data.flag |= COLLECTION_PROP_USE; -} - -void BKE_collection_engine_property_value_set_bool(CollectionEngineSettings *ces, const char *name, bool value) -{ - CollectionEnginePropertyBool *prop; - prop = (CollectionEnginePropertyBool *)BLI_findstring(&ces->properties, name, - offsetof(CollectionEngineProperty, name)); - prop->value = value; - prop->data.flag |= COLLECTION_PROP_USE; -} - -bool BKE_collection_engine_property_use_get(CollectionEngineSettings *ces, const char *name) -{ - CollectionEngineProperty *prop; - prop = (CollectionEngineProperty *)BLI_findstring(&ces->properties, name, offsetof(CollectionEngineProperty, name)); - return ((prop->flag & COLLECTION_PROP_USE) != 0); -} - -void BKE_collection_engine_property_use_set(CollectionEngineSettings *ces, const char *name, bool value) -{ - CollectionEngineProperty *prop; - prop = (CollectionEngineProperty *)BLI_findstring(&ces->properties, name, offsetof(CollectionEngineProperty, name)); - - if (value) { - prop->flag |= COLLECTION_PROP_USE; - } - else { - prop->flag &= ~COLLECTION_PROP_USE; - } + IDProperty *idprop = IDP_GetPropertyFromGroup(props, name); + idprop->data.val = value; } /* Engine Settings recalculate */ -static void collection_engine_settings_init(ListBase *lb) -{ - CollectionEngineSettingsCB_Type *ces_type; - for (ces_type = R_engines_settings_callbacks.first; ces_type; ces_type = ces_type->next) { - CollectionEngineSettings *ces = collection_engine_settings_create(ces_type); - BLI_strncpy_utf8(ces->name, ces_type->name, sizeof(ces->name)); - BLI_addtail(lb, ces); - } - - /* edit modes */ - collection_create_mode_settings(lb); -} - -static void collection_engine_settings_copy(ListBase *lb_dst, ListBase *lb_src) +/* get all the default settings defined in scene and merge them here */ +static void collection_engine_settings_init(IDProperty *root, const bool populate) { - for (CollectionEngineSettings *ces_src = lb_src->first; ces_src; ces_src = ces_src->next) { - CollectionEngineSettings *ces_dst = MEM_callocN(sizeof(*ces_dst), "CollectionEngineSettings copy"); - - BLI_strncpy_utf8(ces_dst->name, ces_src->name, sizeof(ces_dst->name)); - ces_dst->type = ces_src->type; - BLI_addtail(lb_dst, ces_dst); + /* render engines */ + collection_create_render_settings(root, populate); - for (CollectionEngineProperty *prop = ces_src->properties.first; prop; prop = prop->next) { - CollectionEngineProperty *prop_new = MEM_dupallocN(prop); - BLI_addtail(&ces_dst->properties, prop_new); - } - } + /* mode engines */ + collection_create_mode_settings(root, populate); } /** - * Set a value from a CollectionProperty to another + * Initialize the render setings + * It's used mainly for scenes */ -static void collection_engine_property_set (CollectionEngineProperty *prop_dst, CollectionEngineProperty *prop_src) -{ - if ((prop_src->flag & COLLECTION_PROP_USE) != 0) { - /* mark the property as used, so the engine knows if the value was ever set*/ - prop_dst->flag |= COLLECTION_PROP_USE; - switch (prop_src->type) { - case COLLECTION_PROP_TYPE_FLOAT: - ((CollectionEnginePropertyFloat *)prop_dst)->value = ((CollectionEnginePropertyFloat *)prop_src)->value; - break; - case COLLECTION_PROP_TYPE_INT: - ((CollectionEnginePropertyInt *)prop_dst)->value = ((CollectionEnginePropertyInt *)prop_src)->value; - break; - case COLLECTION_PROP_TYPE_BOOL: - ((CollectionEnginePropertyBool *)prop_dst)->value = ((CollectionEnginePropertyBool *)prop_src)->value; - break; - default: - BLI_assert(false); - break; - } - } +void BKE_layer_collection_engine_settings_create(IDProperty *root) +{ + collection_engine_settings_init(root, true); } -static void collection_engine_settings_merge(ListBase *lb_dst, ListBase *lb_src) +static void collection_engine_settings_copy(IDProperty *props_dst, IDProperty *props_src) { - for (CollectionEngineSettings *ces_src = lb_src->first; ces_src; ces_src = ces_src->next) { - CollectionEngineSettings *ces_dst = collection_engine_get(lb_dst, lb_dst, ces_src->type, ces_src->name); - BLI_assert(ces_dst); + IDP_MergeGroup(props_dst, props_src, true); +} - CollectionEngineProperty *prop_dst, *prop_src; - for (prop_dst = ces_dst->properties.first; prop_dst; prop_dst = prop_dst->next) { - prop_src = BLI_findstring(&ces_src->properties, prop_dst->name, offsetof(CollectionEngineProperty, name)); - BLI_assert(prop_src); - collection_engine_property_set(prop_dst, prop_src); - } - } +static void collection_engine_settings_merge(IDProperty *props_dst, IDProperty *props_src) +{ + IDP_SyncGroupValues(props_dst, props_src); } static void layer_collection_engine_settings_update( - LayerCollection *lc, ListBase *lb_parent, - Base *base, ListBase *lb_object) + LayerCollection *lc, IDProperty *props_parent, + Base *base, IDProperty *props_object) { if ((lc->flag & COLLECTION_VISIBLE) == 0) { return; } - ListBase lb_collection = {NULL}; - collection_engine_settings_copy(&lb_collection, lb_parent); + IDPropertyTemplate val = {0}; + IDProperty *props_collection = IDP_New(IDP_GROUP, &val, ROOT_PROP); + collection_engine_settings_copy(props_collection, props_parent); - collection_engine_settings_merge(&lb_collection, &lc->engine_settings); - collection_engine_settings_merge(&lb_collection, &lc->mode_settings); + collection_engine_settings_merge(props_collection, lc->properties); if (BLI_findptr(&lc->object_bases, base, offsetof(LinkData, data)) != NULL) { - collection_engine_settings_merge(lb_object, &lb_collection); + collection_engine_settings_merge(props_object, props_collection); } /* do it recursively */ for (LayerCollection *lcn = lc->layer_collections.first; lcn; lcn = lcn->next) { - layer_collection_engine_settings_update(lcn, &lb_collection, base, lb_object); + layer_collection_engine_settings_update(lcn, props_collection, base, props_object); } - BKE_layer_collection_engine_settings_list_free(&lb_collection); -} - -/** - * Empty all the CollectionEngineSettings in the list - */ -void BKE_layer_collection_engine_settings_list_free(struct ListBase *lb) -{ - for (CollectionEngineSettings *ces = lb->first; ces; ces = ces->next) { - BKE_layer_collection_engine_settings_free(ces); - } - BLI_freelistN(lb); + IDP_FreeProperty(props_collection); + MEM_freeN(props_collection); } /** * Update the collection settings pointer allocated in the object * This is to be flushed from the Depsgraph */ -static void scene_layer_engine_settings_update(SceneLayer *sl, Object *ob) +static void scene_layer_engine_settings_update(Scene *scene, SceneLayer *sl, Object *ob) { Base *base = BKE_scene_layer_base_find(sl, ob); - ListBase ces_layer = {NULL}; + IDPropertyTemplate val = {0}; - collection_engine_settings_init(&ces_layer); + IDProperty *layer_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); + collection_engine_settings_copy(layer_properties, scene->collection_properties); /* start fresh */ - BKE_layer_collection_engine_settings_list_free(&ob->collection_settings); - collection_engine_settings_init(&ob->collection_settings); + if (ob->collection_properties) { + IDP_FreeProperty(ob->collection_properties); + MEM_freeN(ob->collection_properties); + } + + ob->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); + collection_engine_settings_copy(ob->collection_properties, scene->collection_properties); for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) { - layer_collection_engine_settings_update(lc, &ces_layer, base, &ob->collection_settings); + layer_collection_engine_settings_update(lc, layer_properties, base, ob->collection_properties); } - BKE_layer_collection_engine_settings_list_free(&ces_layer); + IDP_FreeProperty(layer_properties); + MEM_freeN(layer_properties); } /* ---------------------------------------------------------------------- */ @@ -1578,204 +1498,3 @@ void BKE_visible_bases_Iterator_end(Iterator *UNUSED(iter)) { /* do nothing */ } - - -/* ---------------------------------------------------------------------- */ -/* Doversion routine */ - -/** - * Merge CollectionEngineSettings - * - * \param ces_ref CollectionEngineSettings to use as reference - * \param ces CollectionEngineSettings to merge into - */ -static void scene_layer_doversion_merge_setings(const CollectionEngineSettings *ces_ref, CollectionEngineSettings *ces) -{ - CollectionEngineProperty *cep = ces->properties.first, *cep_ref; - - for (cep_ref = ces_ref->properties.first; cep_ref; cep_ref = cep_ref->next) { - cep = BLI_findstring(&ces->properties, cep_ref->name, offsetof(CollectionEngineProperty, name)); - - if (cep == NULL) { - cep = MEM_dupallocN(cep_ref); - BLI_addtail(&ces->properties, cep); - } - else if (cep->type != cep_ref->type) { - CollectionEngineProperty *prev = cep->prev, *next = cep->next; - MEM_freeN(cep); - cep = MEM_dupallocN(cep_ref); - - cep->prev = prev; - cep->next = next; - } - else { - /* keep the property as it is */ - } - } -} - -/** - * Merge ListBases of LayerCollections - * - * \param lb_ref ListBase of CollectionEngineSettings to use as reference - * \param lb ListBase of CollectionEngineSettings - */ -static void scene_layer_doversion_merge_layer_collection(const ListBase *lb_ref, ListBase *lb) -{ - CollectionEngineSettings *ces = lb->first, *ces_ref; - - for (ces_ref = lb_ref->first; ces_ref; ces_ref = ces_ref->next) { - ces = BLI_findstring(lb, ces_ref->name, offsetof(CollectionEngineSettings, name)); - - if (ces == NULL) { - ces = MEM_dupallocN(ces_ref); - BLI_duplicatelist(&ces->properties, &ces_ref->properties); - BLI_addtail(lb, ces); - } - else { - scene_layer_doversion_merge_setings(ces_ref, ces); - } - } -} - -/** - * Create or remove CollectionEngineSettings and CollectionEngineProperty - * based on reference LayerCollection - * - * \param lc_ref reference LayerCollection to merge missing settings from - * \param lb ListBase of LayerCollection - */ -static void scene_layer_doversion_update_collections(const LayerCollection *lc_ref, ListBase *lb) -{ - for (LayerCollection *lc = lb->first; lc; lc = lc->next) { - - scene_layer_doversion_merge_layer_collection(&lc_ref->engine_settings, &lc->engine_settings); - scene_layer_doversion_merge_layer_collection(&lc_ref->mode_settings, &lc->mode_settings); - - /* continue recursively */ - scene_layer_doversion_update_collections(lc_ref, &lc->layer_collections); - } -} - -/** - * Updates all the CollectionEngineSettings of all - * LayerCollection elements in Scene - * - * \param lc_ref reference LayerCollection to merge missing settings from - */ -static void scene_layer_doversion_update(const LayerCollection *lc_ref, Scene *scene) -{ - for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) { - scene_layer_doversion_update_collections(lc_ref, &sl->layer_collections); - } -} - -/** - * Return true at the first indicative that the listbases don't match - * - * It's fine if the individual properties values are different, as long - * as we have the same properties across them - * - * \param lb_ces ListBase of CollectionEngineSettings - * \param lb_ces_ref ListBase of CollectionEngineSettings - */ -static bool scene_layer_doversion_is_outdated_engines(ListBase *lb_ces, ListBase *lb_ces_ref) -{ - if (BLI_listbase_count(lb_ces) != BLI_listbase_count(lb_ces_ref)) { - return true; - } - - CollectionEngineSettings *ces, *ces_ref; - for (ces = lb_ces->first, ces_ref = lb_ces_ref->first; ces; ces = ces->next, ces_ref = ces_ref->next) { - if (BLI_listbase_count(&ces->properties) != BLI_listbase_count(&ces_ref->properties)) { - return true; - } - - CollectionEngineProperty *cep, *cep_ref; - for (cep = ces->properties.first, cep_ref = ces_ref->properties.first; - cep != NULL; - cep = cep->next, cep_ref = cep_ref->next) - { - if (cep->type != cep_ref->type) { - return true; - } - - if (STREQ(cep->name, cep_ref->name) == false) { - return true; - } - } - } - - return false; -} - -/** - * Get the first available LayerCollection - */ -static LayerCollection *scene_layer_doversion_collection_get(Main *bmain) -{ - for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) { - for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) { - for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) { - return lc; - } - } - } - return NULL; -} - -/** - * See if a new LayerCollection have the same CollectionEngineSettings - * and properties of the saved LayerCollection - */ -static bool scene_layer_doversion_is_outdated(Main *bmain) -{ - LayerCollection *lc, lc_ref = {NULL}; - bool is_outdated = false; - - lc = scene_layer_doversion_collection_get(bmain); - - if (lc == NULL) { - return false; - } - - layer_collection_create_engine_settings(&lc_ref); - layer_collection_create_mode_settings(&lc_ref); - - if (scene_layer_doversion_is_outdated_engines(&lc->engine_settings, &lc_ref.engine_settings)) { - is_outdated = true; - } - - if (scene_layer_doversion_is_outdated_engines(&lc->mode_settings, &lc_ref.mode_settings)) { - is_outdated = true; - } - - layer_collection_engine_settings_free(&lc_ref); - return is_outdated; -} - -/** - * Handle doversion of files during the viewport development - * - * This is intended to prevent subversion bumping every time a new property - * is added to an engine, but it may be relevant in the future as a generic doversion - */ -void BKE_scene_layer_doversion_update(Main *bmain) -{ - /* if file not outdated, don't bother with the slow merging */ - if (scene_layer_doversion_is_outdated(bmain) == false) { - return; - } - - /* create a reference LayerCollection to merge missing settings from */ - LayerCollection lc_ref = {NULL}; - layer_collection_create_engine_settings(&lc_ref); - layer_collection_create_mode_settings(&lc_ref); - - /* bring all the missing properties for the LayerCollections */ - for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) { - scene_layer_doversion_update(&lc_ref, scene); - } - - layer_collection_engine_settings_free(&lc_ref); -} diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 435504859a4..6cab8945779 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -111,12 +111,6 @@ void BKE_material_free(Material *ma) BKE_icon_id_delete((ID *)ma); BKE_previewimg_free(&ma->preview); - - for (MaterialEngineSettings *mes = ma->engines_settings.first; mes; mes = mes->next) { - if (mes->data) - MEM_SAFE_FREE(mes->data); - } - BLI_freelistN(&ma->engines_settings); } void BKE_material_init(Material *ma) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index a84a0f31d91..0b427a3cf9d 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -460,7 +460,10 @@ void BKE_object_free(Object *ob) BKE_previewimg_free(&ob->preview); - BKE_layer_collection_engine_settings_list_free(&ob->collection_settings); + if (ob->collection_properties) { + IDP_FreeProperty(ob->collection_properties); + MEM_freeN(ob->collection_properties); + } } /* actual check for internal data, not context or flags */ @@ -1176,7 +1179,6 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches) BLI_listbase_clear(&obn->gpulamp); BLI_listbase_clear(&obn->pc_ids); - BLI_listbase_clear(&obn->collection_settings); obn->mpath = NULL; @@ -1190,6 +1192,12 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches) /* Do not copy object's preview (mostly due to the fact renderers create temp copy of objects). */ obn->preview = NULL; + if (ob->collection_properties) { + IDPropertyTemplate val = {0}; + obn->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); + IDP_MergeGroup(obn->collection_properties, ob->collection_properties, true); + } + return obn; } diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 4d01b1b2eb6..38ddd9ebda7 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -569,11 +569,11 @@ void BKE_scene_free(Scene *sce) sce->collection = NULL; /* Runtime Engine Data */ - for (RenderEngineSettings *res = sce->engines_settings.first; res; res = res->next) { - if (res->data) - MEM_freeN(res->data); + if (sce->collection_properties) { + IDP_FreeProperty(sce->collection_properties); + MEM_freeN(sce->collection_properties); + sce->collection_properties = NULL; } - BLI_freelistN(&sce->engines_settings); } void BKE_scene_init(Scene *sce) @@ -928,6 +928,10 @@ 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); + BKE_layer_collection_engine_settings_create(sce->collection_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 4309bc071b7..88d7424a278 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3949,7 +3949,6 @@ static void lib_link_material(FileData *fd, Main *main) static void direct_link_material(FileData *fd, Material *ma) { int a; - MaterialEngineSettings *mes; ma->adt = newdataadr(fd, ma->adt); direct_link_animdata(fd, ma->adt); @@ -3970,11 +3969,6 @@ static void direct_link_material(FileData *fd, Material *ma) ma->preview = direct_link_preview_image(fd, ma->preview); BLI_listbase_clear(&ma->gpumaterial); - - link_list(fd, &ma->engines_settings); - for (mes = ma->engines_settings.first; mes; mes = mes->next) { - mes->data = newdataadr(fd, mes->data); - } } /* ************ READ PARTICLE SETTINGS ***************** */ @@ -5592,7 +5586,6 @@ static void direct_link_object(FileData *fd, Object *ob) ob->bb = NULL; ob->derivedDeform = NULL; ob->derivedFinal = NULL; - BLI_listbase_clear(&ob->collection_settings); BLI_listbase_clear(&ob->gpulamp); link_list(fd, &ob->pc_ids); @@ -5610,6 +5603,9 @@ static void direct_link_object(FileData *fd, Object *ob) ob->currentlod = ob->lodlevels.first; ob->preview = direct_link_preview_image(fd, ob->preview); + + ob->collection_properties = newdataadr(fd, ob->collection_properties); + IDP_DirectLinkGroup_OrFree(&ob->collection_properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); } /* ************ READ SCENE ***************** */ @@ -5961,14 +5957,6 @@ 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); @@ -5983,9 +5971,10 @@ 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_engine_settings(fd, &lc->mode_settings); + if (lc->properties) { + lc->properties = newdataadr(fd, lc->properties); + IDP_DirectLinkGroup_OrFree(&lc->properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); + } direct_link_layer_collections(fd, &lc->layer_collections); } @@ -5999,7 +5988,6 @@ static void direct_link_scene(FileData *fd, Scene *sce) RigidBodyWorld *rbw; SceneLayer *sl; SceneRenderLayer *srl; - RenderEngineSettings *res; sce->theDag = NULL; sce->depsgraph = NULL; @@ -6266,10 +6254,8 @@ static void direct_link_scene(FileData *fd, Scene *sce) BKE_scene_layer_base_flag_recalculate(sl); } - link_list(fd, &sce->engines_settings); - for (res = sce->engines_settings.first; res; res = res->next) { - res->data = newdataadr(fd, res->data); - } + sce->collection_properties = newdataadr(fd, sce->collection_properties); + IDP_DirectLinkGroup_OrFree(&sce->collection_properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); } /* ************ READ WM ***************** */ diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 75628e59fa7..55d88240100 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -37,6 +37,7 @@ #include "BKE_blender.h" #include "BKE_collection.h" +#include "BKE_idprop.h" #include "BKE_layer.h" #include "BKE_main.h" #include "BKE_scene.h" @@ -211,11 +212,6 @@ void do_versions_after_linking_280(Main *main) } } -static void blo_do_version_temporary(Main *main) -{ - BKE_scene_layer_doversion_update(main); -} - void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) { if (!MAIN_VERSION_ATLEAST(main, 280, 0)) { @@ -227,7 +223,19 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) } } - /* temporary validation of 280 files for layers */ - blo_do_version_temporary(main); + if (!DNA_struct_elem_find(fd->filesdna, "Scene", "IDProperty", "collection_properties")) { + IDPropertyTemplate val = {0}; + for (Scene *scene = main->scene.first; scene; scene = scene->id.next) { + scene->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); + BKE_layer_collection_engine_settings_create(scene->collection_properties); + } + } + + if (!DNA_struct_elem_find(fd->filesdna, "Object", "IDProperty", "collection_properties")) { + IDPropertyTemplate val = {0}; + for (Object *ob = main->object.first; ob; ob = ob->id.next) { + ob->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); + } + } } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index f21003b66ac..d5fa4204602 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1921,6 +1921,10 @@ static void write_object(WriteData *wd, Object *ob) writelist(wd, DATA, LodLevel, &ob->lodlevels); write_previews(wd, ob->preview); + + if (ob->collection_properties) { + IDP_WriteProperty(ob->collection_properties, wd); + } } } @@ -2402,21 +2406,6 @@ static void write_texture(WriteData *wd, Tex *tex) } } -static void write_material_engines_settings(WriteData *wd, ListBase *lb) -{ - for (MaterialEngineSettings *res = lb->first; res; res = res->next) { - writestruct(wd, DATA, MaterialEngineSettings, 1, res); - - if (STREQ(res->name, RE_engine_id_BLENDER_CLAY)) { - writestruct(wd, DATA, MaterialEngineSettingsClay, 1, res->data); - } - else { - /* No engine matched */ - /* error: don't know how to write this file */ - } - } -} - static void write_material(WriteData *wd, Material *ma) { if (ma->id.us > 0 || wd->current) { @@ -2448,8 +2437,6 @@ static void write_material(WriteData *wd, Material *ma) } write_previews(wd, ma->preview); - - write_material_engines_settings(wd, &ma->engines_settings); } } @@ -2565,29 +2552,6 @@ 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; - case COLLECTION_PROP_TYPE_BOOL: - writestruct(wd, DATA, CollectionEnginePropertyBool, 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) { @@ -2596,29 +2560,14 @@ 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_collection_engine_settings(wd, &lc->mode_settings); + if (lc->properties) { + IDP_WriteProperty(lc->properties, wd); + } write_layer_collections(wd, &lc->layer_collections); } } -static void write_render_engines_settings(WriteData *wd, ListBase *lb) -{ - for (RenderEngineSettings *res = lb->first; res; res = res->next) { - writestruct(wd, DATA, RenderEngineSettings, 1, res); - - if (STREQ(res->name, RE_engine_id_BLENDER_CLAY)) { - writestruct(wd, DATA, RenderEngineSettingsClay, 1, res->data); - } - else { - /* No engine matched */ - /* error: don't know how to write this file */ - } - } -} - static void write_scene(WriteData *wd, Scene *sce) { /* write LibData */ @@ -2830,7 +2779,9 @@ static void write_scene(WriteData *wd, Scene *sce) write_layer_collections(wd, &sl->layer_collections); } - write_render_engines_settings(wd, &sce->engines_settings); + if (sce->collection_properties) { + IDP_WriteProperty(sce->collection_properties, wd); + } } static void write_gpencil(WriteData *wd, bGPdata *gpd) diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index e8dc47245e3..669f7a24908 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -31,6 +31,7 @@ struct DRWPass; struct Material; struct Scene; struct DrawEngineType; +struct IDProperty; struct bContext; struct Object; @@ -54,13 +55,9 @@ void DRW_draw_view(const struct bContext *C); /* This is here because GPUViewport needs it */ void DRW_pass_free(struct DRWPass *pass); -/* Settings */ -void *DRW_material_settings_get(struct Material *ma, const char *engine_name); -void *DRW_render_settings_get(struct Scene *scene, const char *engine_name); - /* Mode engines initialization */ -void OBJECT_collection_settings_create(struct CollectionEngineSettings *ces); -void EDIT_MESH_collection_settings_create(struct CollectionEngineSettings *ces); -void EDIT_ARMATURE_collection_settings_create(struct CollectionEngineSettings *ces); +void OBJECT_collection_settings_create(struct IDProperty *properties); +void EDIT_MESH_collection_settings_create(struct IDProperty *properties); +void EDIT_ARMATURE_collection_settings_create(struct IDProperty *properties); #endif /* __DRW_ENGINE_H__ */ diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c index 9f46556b7c2..6294715e01c 100644 --- a/source/blender/draw/engines/clay/clay.c +++ b/source/blender/draw/engines/clay/clay.c @@ -22,6 +22,7 @@ #include "DRW_render.h" #include "BKE_icons.h" +#include "BKE_idprop.h" #include "BKE_main.h" #include "BLI_dynstr.h" @@ -252,30 +253,6 @@ static struct GPUTexture *create_jitter_texture(void) return DRW_texture_create_2D(64, 64, DRW_TEX_RG_16, DRW_TEX_FILTER | DRW_TEX_WRAP, &jitter[0][0]); } -static void clay_material_settings_init(MaterialEngineSettingsClay *ma) -{ - ma->matcap_icon = ICON_MATCAP_01; - ma->matcap_rot = 0.0f; - ma->matcap_hue = 0.5f; - ma->matcap_sat = 0.5f; - ma->matcap_val = 0.5f; - ma->ssao_distance = 0.2; - ma->ssao_attenuation = 1.0f; - ma->ssao_factor_cavity = 1.0f; - ma->ssao_factor_edge = 1.0f; -} - -RenderEngineSettings *CLAY_render_settings_create(void) -{ - RenderEngineSettingsClay *settings = MEM_callocN(sizeof(RenderEngineSettingsClay), "RenderEngineSettingsClay"); - - clay_material_settings_init((MaterialEngineSettingsClay *)settings); - - settings->ssao_samples = 32; - - return (RenderEngineSettings *)settings; -} - static void CLAY_engine_init(void *vedata) { CLAY_StorageList *stl = ((CLAY_Data *)vedata)->stl; @@ -372,6 +349,7 @@ static void CLAY_engine_init(void *vedata) /* SSAO setup */ { + int ssao_samples = 32; /* XXX get from render settings */ float invproj[4][4]; float dfdyfacs[2]; bool is_persp = DRW_viewport_is_persp_get(); @@ -383,11 +361,10 @@ static void CLAY_engine_init(void *vedata) }; int i; float *size = DRW_viewport_size_get(); - RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY); DRW_get_dfdy_factors(dfdyfacs); - e_data.ssao_params[0] = settings->ssao_samples; + e_data.ssao_params[0] = ssao_samples; e_data.ssao_params[1] = size[0] / 64.0; e_data.ssao_params[2] = size[1] / 64.0; e_data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */ @@ -421,14 +398,14 @@ static void CLAY_engine_init(void *vedata) } /* AO Samples Tex */ - if (e_data.sampling_tx && (e_data.cached_sample_num != settings->ssao_samples)) { + if (e_data.sampling_tx && (e_data.cached_sample_num != ssao_samples)) { DRW_texture_free(e_data.sampling_tx); e_data.sampling_tx = NULL; } if (!e_data.sampling_tx) { - e_data.sampling_tx = create_spiral_sample_texture(settings->ssao_samples); - e_data.cached_sample_num = settings->ssao_samples; + e_data.sampling_tx = create_spiral_sample_texture(ssao_samples); + e_data.cached_sample_num = ssao_samples; } } } @@ -528,62 +505,21 @@ static int mat_in_ubo(CLAY_Storage *storage, float matcap_rot, float matcap_hue, return id; } -/* Safe way to get override values */ -static void override_setting(CollectionEngineSettings *ces, const char *name, void *ret) -{ - CollectionEngineProperty *cep = BKE_collection_engine_property_get(ces, name); - - if (cep == NULL) { - return; - } - - if ((cep->flag & COLLECTION_PROP_USE) == 0) { - return; - } - - if (cep->type == COLLECTION_PROP_TYPE_INT) { - CollectionEnginePropertyInt *prop = (CollectionEnginePropertyInt *)cep; - *((int *)ret) = prop->value; - } - else if (cep->type == COLLECTION_PROP_TYPE_FLOAT) { - CollectionEnginePropertyFloat *prop = (CollectionEnginePropertyFloat *)cep; - *((float *)ret) = prop->value; - } - else if (cep->type == COLLECTION_PROP_TYPE_BOOL) { - CollectionEnginePropertyBool *prop = (CollectionEnginePropertyBool *)cep; - *((bool *)ret) = prop->value; - } -} - static DRWShadingGroup *CLAY_object_shgrp_get(CLAY_Data *vedata, Object *ob, CLAY_StorageList *stl, CLAY_PassList *psl) { DRWShadingGroup **shgrps = stl->storage->shgrps; - MaterialEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY); - CollectionEngineSettings *ces = BKE_object_collection_engine_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_CLAY); + IDProperty *props = BKE_object_collection_engine_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_CLAY); /* Default Settings */ - float matcap_rot = settings->matcap_rot; - float matcap_hue = settings->matcap_hue; - float matcap_sat = settings->matcap_sat; - float matcap_val = settings->matcap_val; - float ssao_distance = settings->ssao_distance; - float ssao_factor_cavity = settings->ssao_factor_cavity; - float ssao_factor_edge = settings->ssao_factor_edge; - float ssao_attenuation = settings->ssao_attenuation; - int matcap_icon = settings->matcap_icon; - - /* Override settings */ - if (ces) { - override_setting(ces, "matcap_rotation", &matcap_rot); - override_setting(ces, "matcap_hue", &matcap_hue); - override_setting(ces, "matcap_saturation", &matcap_sat); - override_setting(ces, "matcap_value", &matcap_val); - override_setting(ces, "ssao_distance", &ssao_distance); - override_setting(ces, "ssao_factor_cavity", &ssao_factor_cavity); - override_setting(ces, "ssao_factor_edge", &ssao_factor_edge); - override_setting(ces, "ssao_attenuation", &ssao_attenuation); - override_setting(ces, "matcap_icon", &matcap_icon); - } + float matcap_rot = BKE_collection_engine_property_value_get_float(props, "matcap_rotation"); + float matcap_hue = BKE_collection_engine_property_value_get_float(props, "matcap_hue"); + float matcap_sat = BKE_collection_engine_property_value_get_float(props, "matcap_saturation"); + float matcap_val = BKE_collection_engine_property_value_get_float(props, "matcap_value"); + float ssao_distance = BKE_collection_engine_property_value_get_float(props, "ssao_distance"); + float ssao_factor_cavity = BKE_collection_engine_property_value_get_float(props, "ssao_factor_cavity"); + float ssao_factor_edge = BKE_collection_engine_property_value_get_float(props, "ssao_factor_edge"); + float ssao_attenuation = BKE_collection_engine_property_value_get_float(props, "ssao_attenuation"); + int matcap_icon = BKE_collection_engine_property_value_get_int(props, "matcap_icon"); int id = mat_in_ubo(stl->storage, matcap_rot, matcap_hue, matcap_sat, matcap_val, ssao_distance, ssao_factor_cavity, ssao_factor_edge, @@ -638,7 +574,7 @@ static void CLAY_cache_populate(void *vedata, Object *ob) if (!DRW_is_object_renderable(ob)) return; - CollectionEngineSettings *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, ""); + IDProperty *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, ""); bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling"); /* TODO all renderable */ @@ -680,19 +616,22 @@ static void CLAY_draw_scene(void *vedata) DRW_draw_pass(psl->clay_pass); } -static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), CollectionEngineSettings *ces) +static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props) { - BLI_assert(ces); - BKE_collection_engine_property_add_int(ces, "matcap_icon", ICON_MATCAP_01); - BKE_collection_engine_property_add_int(ces, "type", CLAY_MATCAP_NONE); - BKE_collection_engine_property_add_float(ces, "matcap_rotation", 0.0f); - BKE_collection_engine_property_add_float(ces, "matcap_hue", 0.5f); - BKE_collection_engine_property_add_float(ces, "matcap_saturation", 0.5f); - BKE_collection_engine_property_add_float(ces, "matcap_value", 0.5f); - BKE_collection_engine_property_add_float(ces, "ssao_distance", 0.2f); - BKE_collection_engine_property_add_float(ces, "ssao_attenuation", 1.0f); - BKE_collection_engine_property_add_float(ces, "ssao_factor_cavity", 1.0f); - BKE_collection_engine_property_add_float(ces, "ssao_factor_edge", 1.0f); + BLI_assert(props && + props->type == IDP_GROUP && + props->subtype == IDP_GROUP_SUB_ENGINE_RENDER); + + BKE_collection_engine_property_add_int(props, "matcap_icon", ICON_MATCAP_01); + BKE_collection_engine_property_add_int(props, "type", CLAY_MATCAP_NONE); + BKE_collection_engine_property_add_float(props, "matcap_rotation", 0.0f); + BKE_collection_engine_property_add_float(props, "matcap_hue", 0.5f); + BKE_collection_engine_property_add_float(props, "matcap_saturation", 0.5f); + BKE_collection_engine_property_add_float(props, "matcap_value", 0.5f); + BKE_collection_engine_property_add_float(props, "ssao_distance", 0.2f); + BKE_collection_engine_property_add_float(props, "ssao_attenuation", 1.0f); + BKE_collection_engine_property_add_float(props, "ssao_factor_cavity", 1.0f); + BKE_collection_engine_property_add_float(props, "ssao_factor_edge", 1.0f); } static void CLAY_engine_free(void) diff --git a/source/blender/draw/engines/clay/clay.h b/source/blender/draw/engines/clay/clay.h index 1afe1ac5ea8..660ad70ab48 100644 --- a/source/blender/draw/engines/clay/clay.h +++ b/source/blender/draw/engines/clay/clay.h @@ -28,7 +28,8 @@ extern RenderEngineType viewport_clay_type; -struct RenderEngineSettings *CLAY_render_settings_create(void); -struct MaterialEngineSettings *CLAY_material_settings_create(void); +struct IDProperty; + +struct IDProperty *CLAY_render_settings_create(void); #endif /* __CLAY_H__ */ diff --git a/source/blender/draw/engines/eevee/eevee.c b/source/blender/draw/engines/eevee/eevee.c index f5c4f2385af..d40ce0baa38 100644 --- a/source/blender/draw/engines/eevee/eevee.c +++ b/source/blender/draw/engines/eevee/eevee.c @@ -156,7 +156,7 @@ static void EEVEE_cache_populate(void *vedata, Object *ob) EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; if (ob->type == OB_MESH) { - CollectionEngineSettings *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, ""); + IDProperty *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, ""); bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling"); struct Batch *geom = DRW_cache_surface_get(ob); @@ -222,10 +222,12 @@ static void EEVEE_engine_free(void) DRW_shader_free(e_data.tonemap); } -static void EEVEE_collection_settings_create(RenderEngine *UNUSED(engine), CollectionEngineSettings *ces) +static void EEVEE_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props) { - BLI_assert(ces); - // BKE_collection_engine_property_add_int(ces, "high_quality_sphere_lamps", false); + 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); } DrawEngineType draw_engine_eevee_type = { diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 1f74ca5981a..13b10011dec 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -249,10 +249,6 @@ struct DefaultTextureList *DRW_viewport_texture_list_get(void); /* Settings */ bool DRW_is_object_renderable(struct Object *ob); -#ifndef __DRW_ENGINE_H__ -void *DRW_material_settings_get(Material *ma, const char *engine_name); -void *DRW_render_settings_get(Scene *scene, const char *engine_name); -#endif /* __DRW_ENGINE_H__ */ /* Draw commands */ void DRW_draw_pass(DRWPass *pass); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index efa677240dd..65fd77a5155 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -923,7 +923,7 @@ static void draw_geometry(DRWShadingGroup *shgroup, Batch *geom, const float (*o { RegionView3D *rv3d = CTX_wm_region_view3d(DST.context); DRWInterface *interface = shgroup->interface; - + float mvp[4][4], mv[4][4], n[3][3], wn[3][3]; float eye[3] = { 0.0f, 0.0f, 1.0f }; /* looking into the screen */ @@ -1050,7 +1050,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup) GPU_texture_bind(tex, uni->bindloc); GPU_texture_compare_mode(tex, false); GPU_texture_filter_mode(tex, false); - + bound_tex = MEM_callocN(sizeof(DRWBoundTexture), "DRWBoundTexture"); bound_tex->tex = tex; BLI_addtail(&DST.bound_texs, bound_tex); @@ -1186,8 +1186,8 @@ bool DRW_is_object_renderable(Object *ob) if (ob->type == OB_MESH) { if (ob == obedit) { - CollectionEngineSettings *ces_mode_ed = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, ""); - bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire"); + IDProperty *props = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, ""); + bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(props, "show_occlude_wire"); if (do_occlude_wire) return false; @@ -1197,72 +1197,6 @@ bool DRW_is_object_renderable(Object *ob) return true; } -void *DRW_material_settings_get(Material *ma, const char *engine_name) -{ - MaterialEngineSettings *ms = NULL; - - ms = BLI_findstring(&ma->engines_settings, engine_name, offsetof(MaterialEngineSettings, name)); - -#ifdef WITH_CLAY_ENGINE - /* If the settings does not exists yet, create it */ - if (ms == NULL) { - ms = MEM_callocN(sizeof(RenderEngineSettings), "RenderEngineSettings"); - - BLI_strncpy(ms->name, engine_name, 32); - - /* TODO make render_settings_create a polymorphic function */ - if (STREQ(engine_name, RE_engine_id_BLENDER_CLAY)) { - /* No material support */ - BLI_assert(false); - } - else { - /* No engine matched */ - BLI_assert(false); - } - - BLI_addtail(&ma->engines_settings, ms); - } -#else - return NULL; -#endif - - return ms->data; -} - -/* If scene is NULL, use context scene */ -void *DRW_render_settings_get(Scene *scene, const char *engine_name) -{ - RenderEngineSettings *rs = NULL; - - if (scene == NULL) - scene = CTX_data_scene(DST.context); - - rs = BLI_findstring(&scene->engines_settings, engine_name, offsetof(RenderEngineSettings, name)); - -#ifdef WITH_CLAY_ENGINE - /* If the settings does not exists yet, create it */ - if (rs == NULL) { - rs = MEM_callocN(sizeof(RenderEngineSettings), "RenderEngineSettings"); - - BLI_strncpy(rs->name, engine_name, 32); - - /* TODO make render_settings_create a polymorphic function */ - if (STREQ(engine_name, RE_engine_id_BLENDER_CLAY)) { - rs->data = CLAY_render_settings_create(); - } - else { - /* No engine matched */ - BLI_assert(false); - } - - BLI_addtail(&scene->engines_settings, rs); - } -#else - return NULL; -#endif - - return rs->data; -} /* ****************************************** Framebuffers ******************************************/ static GPUTextureFormat convert_tex_format(int fbo_format, int *channels) @@ -1289,7 +1223,7 @@ void DRW_framebuffer_init(struct GPUFrameBuffer **fb, int width, int height, DRW for (int i = 0; i < texnbr; ++i) { DRWFboTexture fbotex = textures[i]; - + if (!*fbotex.tex) { int channels; GPUTextureFormat gpu_format = convert_tex_format(fbotex.format, &channels); @@ -1307,7 +1241,7 @@ void DRW_framebuffer_init(struct GPUFrameBuffer **fb, int width, int height, DRW ++color_attachment; } } - + GPU_framebuffer_texture_attach(*fb, *fbotex.tex, color_attachment); } @@ -1787,10 +1721,11 @@ void DRW_draw_view(const bContext *C) /* ideally only refresh when objects are added/removed */ /* or render properties / materials change */ if (cache_is_dirty) { + Scene *scene = CTX_data_scene(C); SceneLayer *sl = CTX_data_scene_layer(C); DRW_engines_cache_init(); - DEG_OBJECT_ITER(sl, ob); + DEG_OBJECT_ITER(scene, sl, ob); { DRW_engines_cache_populate(ob); } diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index 084e0eb89b7..713ae607ef4 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -367,7 +367,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) if (ob->type == OB_MESH) { if (ob == obedit) { - CollectionEngineSettings *ces_mode_ed = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, ""); + IDProperty *ces_mode_ed = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, ""); bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire"); backwire_opacity = BKE_collection_engine_property_value_get_float(ces_mode_ed, "backwire_opacity"); /* Updating uniform */ @@ -446,15 +446,17 @@ static void EDIT_MESH_draw_scene(void *vedata) } } -void EDIT_MESH_collection_settings_create(CollectionEngineSettings *ces) +void EDIT_MESH_collection_settings_create(IDProperty *properties) { - BLI_assert(ces); - BKE_collection_engine_property_add_int(ces, "show_occlude_wire", false); - BKE_collection_engine_property_add_int(ces, "face_normals_show", false); - BKE_collection_engine_property_add_int(ces, "vert_normals_show", false); - BKE_collection_engine_property_add_int(ces, "loop_normals_show", false); - BKE_collection_engine_property_add_float(ces, "normals_length", 0.1); - BKE_collection_engine_property_add_float(ces, "backwire_opacity", 0.5); + BLI_assert(properties && + properties->type == IDP_GROUP && + properties->subtype == IDP_GROUP_SUB_MODE_EDIT); + BKE_collection_engine_property_add_int(properties, "show_occlude_wire", false); + BKE_collection_engine_property_add_int(properties, "face_normals_show", false); + BKE_collection_engine_property_add_int(properties, "vert_normals_show", false); + BKE_collection_engine_property_add_int(properties, "loop_normals_show", false); + BKE_collection_engine_property_add_float(properties, "normals_length", 0.1); + BKE_collection_engine_property_add_float(properties, "backwire_opacity", 0.5); } static void EDIT_MESH_engine_free(void) diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 046fcc0a837..e301c3e4e8a 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -1028,11 +1028,13 @@ static void OBJECT_draw_scene(void *vedata) DRW_draw_pass(psl->outlines_resolve); } -void OBJECT_collection_settings_create(CollectionEngineSettings *ces) +void OBJECT_collection_settings_create(IDProperty *props) { - BLI_assert(ces); - BKE_collection_engine_property_add_int(ces, "show_wire", false); - BKE_collection_engine_property_add_int(ces, "show_backface_culling", false); + BLI_assert(props && + props->type == IDP_GROUP && + props->subtype == IDP_GROUP_SUB_MODE_OBJECT); + BKE_collection_engine_property_add_int(props, "show_wire", false); + BKE_collection_engine_property_add_int(props, "show_backface_culling", false); } DrawEngineType draw_engine_object_type = { diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 625a5887bef..bd3e56b39a0 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -948,6 +948,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C); void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C); void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C); void uiTemplateKeymapItemProperties(uiLayout *layout, struct PointerRNA *ptr); +void uiTemplateOverrideProperty(uiLayout *layout, struct PointerRNA *collection_props_ptr, struct PointerRNA *scene_props_ptr, const char *name, const char *custom_template); void uiTemplateComponentMenu(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name); void uiTemplateNodeSocket(uiLayout *layout, struct bContext *C, float *color); void uiTemplateCacheFile(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname); diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index fb95cdf389b..de226e74c65 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -42,6 +42,8 @@ #include "BLT_lang.h" #include "BKE_context.h" +#include "BKE_idprop.h" +#include "BKE_layer.h" #include "BKE_screen.h" #include "BKE_global.h" #include "BKE_node.h" @@ -50,6 +52,7 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "RNA_types.h" #include "UI_interface.h" @@ -328,6 +331,109 @@ static void UI_OT_unset_property_button(wmOperatorType *ot) ot->flag = OPTYPE_UNDO; } +/* Use/Unuse Property Button Operator ------------------------ */ + +static int use_property_button_exec(bContext *C, wmOperator *UNUSED(op)) +{ + PointerRNA ptr, scene_props_ptr; + PropertyRNA *prop; + IDProperty *props; + + uiBut *but = UI_context_active_but_get(C); + + prop = but->rnaprop; + ptr = but->rnapoin; + props = (IDProperty *)ptr.data; + /* XXX Using existing data struct to pass another RNAPointer */ + scene_props_ptr = but->rnasearchpoin; + + const char *identifier = RNA_property_identifier(prop); + if (IDP_GetPropertyFromGroup(props, identifier)) { + return OPERATOR_CANCELLED; + } + + switch (RNA_property_type(prop)) { + case PROP_FLOAT: + { + float value = RNA_property_float_get(&scene_props_ptr, prop); + BKE_collection_engine_property_add_float(props, identifier, value); + break; + } + case PROP_ENUM: + { + int value = RNA_enum_get(&scene_props_ptr, identifier); + BKE_collection_engine_property_add_int(props, identifier, value); + break; + } + case PROP_INT: + { + int value = RNA_int_get(&scene_props_ptr, identifier); + BKE_collection_engine_property_add_int(props, identifier, value); + break; + } + case PROP_BOOLEAN: + { + int value = RNA_boolean_get(&scene_props_ptr, identifier); + BKE_collection_engine_property_add_bool(props, identifier, value); + break; + } + case PROP_STRING: + case PROP_POINTER: + case PROP_COLLECTION: + default: + break; + } + + return OPERATOR_FINISHED; +} + +static void UI_OT_use_property_button(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Use property"; + ot->idname = "UI_OT_use_property_button"; + ot->description = "Create a property"; + + /* callbacks */ + ot->poll = ED_operator_regionactive; + ot->exec = use_property_button_exec; + + /* flags */ + ot->flag = OPTYPE_UNDO; +} + +static int unuse_property_button_exec(bContext *C, wmOperator *UNUSED(op)) +{ + PointerRNA ptr; + PropertyRNA *prop; + int index; + + /* try to unset the nominated property */ + UI_context_active_but_prop_get(C, &ptr, &prop, &index); + const char *identifier = RNA_property_identifier(prop); + + IDProperty *props = (IDProperty *)ptr.data; + IDProperty *prop_to_remove = IDP_GetPropertyFromGroup(props, identifier); + IDP_FreeFromGroup(props, prop_to_remove); + + return OPERATOR_FINISHED; +} + +static void UI_OT_unuse_property_button(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Unuse property"; + ot->idname = "UI_OT_unuse_property_button"; + ot->description = "Remove a property"; + + /* callbacks */ + ot->poll = ED_operator_regionactive; + ot->exec = unuse_property_button_exec; + + /* flags */ + ot->flag = OPTYPE_UNDO; +} + /* Copy To Selected Operator ------------------------ */ bool UI_context_copy_to_selected_list( @@ -1114,6 +1220,8 @@ void ED_operatortypes_ui(void) WM_operatortype_append(UI_OT_copy_python_command_button); WM_operatortype_append(UI_OT_reset_default_button); WM_operatortype_append(UI_OT_unset_property_button); + WM_operatortype_append(UI_OT_use_property_button); + WM_operatortype_append(UI_OT_unuse_property_button); WM_operatortype_append(UI_OT_copy_to_selected_button); WM_operatortype_append(UI_OT_reports_to_textblock); /* XXX: temp? */ WM_operatortype_append(UI_OT_drop_color); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index a31ce55ca5f..e3a71feb1a9 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -58,6 +58,8 @@ #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_idcode.h" +#include "BKE_idprop.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_linestyle.h" #include "BKE_main.h" @@ -3751,6 +3753,60 @@ void uiTemplateKeymapItemProperties(uiLayout *layout, PointerRNA *ptr) } } +/********************************* Overrides *************************************/ + +void uiTemplateOverrideProperty(uiLayout *layout, struct PointerRNA *collection_props_ptr, struct PointerRNA *scene_props_ptr, const char *name, const char *custom_template) +{ + bool is_set = false; + uiLayout *row, *col; + + PointerRNA *ptr; + PropertyRNA *prop; + + IDProperty *collection_props = collection_props_ptr->data; + + if (IDP_GetPropertyFromGroup(collection_props, name)) { + prop = RNA_struct_find_property(collection_props_ptr, name); + ptr = collection_props_ptr; + is_set = RNA_property_is_set(ptr, prop); + } + else { + /* property doesn't exist yet */ + prop = RNA_struct_find_property(scene_props_ptr, name); + ptr = scene_props_ptr; + } + + row = uiLayoutRow(layout, false); + col = uiLayoutColumn(row, false); + + uiLayoutSetEnabled(col, is_set); + + if (custom_template && STREQ(custom_template, "icon_view")) { + uiTemplateIconView(col, ptr, name, false, 5.0f); + } + else { + uiItemFullR(col, ptr, prop, -1, 0, 0, NULL, ICON_NONE); + } + + col = uiLayoutColumn(row, false); + uiBut *but; + uiBlock *block = uiLayoutGetBlock(col); + UI_block_emboss_set(block, UI_EMBOSS_NONE); + + if (is_set) { + but = uiDefIconButO(block, UI_BTYPE_BUT, "UI_OT_unuse_property_button", WM_OP_EXEC_DEFAULT, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL); + } + else { + but = uiDefIconButO(block, UI_BTYPE_BUT, "UI_OT_use_property_button", WM_OP_EXEC_DEFAULT, ICON_ZOOMIN, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL); + /* XXX - Using existing data struct to pass another RNAPointer */ + but->rnasearchpoin = *scene_props_ptr; + } + + but->rnapoin = *collection_props_ptr; + but->rnaprop = prop; + UI_block_emboss_set(block, UI_EMBOSS); +} + /********************************* Color management *************************************/ void uiTemplateColorspaceSettings(uiLayout *layout, PointerRNA *ptr, const char *propname) diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 2c6f3d2fc66..9c3e194b78c 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -98,6 +98,15 @@ enum { IDP_STRING_SUB_BYTE = 1, /* arbitrary byte array, _not_ null terminated */ }; +/* IDP_GROUP */ +enum { + IDP_GROUP_SUB_NONE = 0, /* default */ + IDP_GROUP_SUB_MODE_OBJECT = 1, /* object mode settings */ + IDP_GROUP_SUB_MODE_EDIT = 2, /* mesh edit mode settings */ + IDP_GROUP_SUB_ENGINE_RENDER = 3, /* render engine settings */ + IDP_GROUP_SUB_OVERRIDE = 4, /* data override */ +}; + /*->flag*/ enum { IDP_FLAG_GHOST = 1 << 7, /* this means the property is set but RNA will return false when checking diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h index de2bd51f647..2ea0638acfb 100644 --- a/source/blender/makesdna/DNA_layer_types.h +++ b/source/blender/makesdna/DNA_layer_types.h @@ -61,6 +61,7 @@ typedef struct LayerCollection { ListBase layer_collections; /* synced with collection->collections */ ListBase engine_settings; /* CollectionEngineSettings */ ListBase mode_settings; /* CollectionModeSettings */ + struct IDProperty *properties; /* overrides */ } LayerCollection; typedef struct SceneLayer { @@ -112,53 +113,6 @@ enum { /* *************************************************************** */ /* 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 CollectionEnginePropertyBool { - struct CollectionEngineProperty data; - int value; - int pad; -} CollectionEnginePropertyBool; - -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 */ - int type; /* CollectionEngineSettingsType */ - int pad; -} CollectionEngineSettings; - -/* CollectionEngineProperty->flag */ -enum { - COLLECTION_PROP_USE = (1 << 0), -}; - -/* CollectionEngineProperty.type */ -typedef enum CollectionEnginePropertyType { - COLLECTION_PROP_TYPE_FLOAT = 0, - COLLECTION_PROP_TYPE_INT = 1, - COLLECTION_PROP_TYPE_BOOL = 2, -} CollectionEnginePropertyType; - /* CollectionEngineSettings->type */ typedef enum CollectionEngineSettingsType { COLLECTION_MODE_NONE = 0, diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index bd8278f897a..67bc49032d5 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -90,38 +90,11 @@ typedef struct TexPaintSlot { int pad; } TexPaintSlot; -/* Material Engine Settings */ -typedef struct MaterialEngineSettings { - struct MaterialEngineSettings *next, *prev; - char name[32]; /* engine name - MAX_NAME */ - void *data; -} MaterialEngineSettings; - /* Clay engine */ /* MaterialRuntimeClay.flag */ #define CLAY_OUTDATED 1 -typedef struct MaterialEngineSettingsClay { - short type; - short matcap_icon; /* Icon ID */ - - float matcap_rot; - float matcap_hue; - float matcap_sat; - float matcap_val; - - float ssao_distance; - float ssao_attenuation; - float ssao_factor_cavity; - float ssao_factor_edge; - - /* Runtime */ - short flag; - short pad; - int ubo_index; -} MaterialEngineSettingsClay; - /* MaterialEngineSettingsClay.type */ #define CLAY_MATCAP_NONE 0 #define CLAY_MATCAP_SIMPLE 1 @@ -240,9 +213,6 @@ typedef struct Material { struct TexPaintSlot *texpaintslot; /* cached slot for painting. Make sure to recalculate before use * with refresh_texpaint_image_cache */ - /* Engine Settings */ - ListBase engines_settings; /* MaterialEngineSettings */ - ListBase gpumaterial; /* runtime */ } Material; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index fb0a02e92ae..59ed6f1222f 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -46,7 +46,6 @@ struct Object; struct AnimData; struct Ipo; struct BoundBox; -struct CollectionEngineSettings; struct Path; struct Material; struct PartDeflect; @@ -304,7 +303,7 @@ typedef struct Object { struct PreviewImage *preview; - ListBase collection_settings; /* used by depsgraph, flushed from collection-tree */ + struct IDProperty *collection_properties; /* used by depsgraph, flushed from collection-tree */ } Object; /* Warning, this is not used anymore because hooks are now modifiers */ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index eac599eefc4..e3e97b94304 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -539,44 +539,6 @@ typedef enum BakePassFilter { #define R_BAKE_PASS_FILTER_ALL (~0) -/* *************************************************************** */ -/* Engine Settings */ - -typedef struct RenderEngineSettings { - struct RenderEngineSettings *next, *prev; - char name[32]; /* engine name */ - void *data; -} RenderEngineSettings; - -/* Render Data */ -typedef struct RenderEngineSettingsClay { - /* Use same layout as MaterialEngineSettingsClay so this struct - * can be used as Material Settings. */ - short type; - short matcap_icon; /* Icon ID */ - - float matcap_rot; - float matcap_hue; - float matcap_sat; - float matcap_val; - - float ssao_distance; - float ssao_attenuation; - float ssao_factor_cavity; - float ssao_factor_edge; - - short flag; - short pad; - int ubo_index; - /* end of MaterialEngineSettingsClay */ - - /* Global Settings */ - short options; - short pad1; - int ssao_samples; - int pad2[2]; -} RenderEngineSettingsClay; - /* RenderEngineSettingsClay.options */ typedef enum ClayFlagSettings { CLAY_USE_AO = (1 << 0), @@ -1754,7 +1716,7 @@ typedef struct Scene { int active_layer; int pad4; - ListBase engines_settings; /* RenderEngineSettings */ + IDProperty *collection_properties; /* settings to be overriden by layer collections */ int pad5[2]; } Scene; diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index f4df95cf873..e8cb54448de 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -386,8 +386,6 @@ extern StructRNA RNA_MaterialStrand; extern StructRNA RNA_MaterialSubsurfaceScattering; extern StructRNA RNA_MaterialTextureSlot; extern StructRNA RNA_MaterialVolume; -extern StructRNA RNA_MaterialEngineSettings; -extern StructRNA RNA_MaterialEngineSettingsClay; extern StructRNA RNA_Mask; extern StructRNA RNA_MaskLayer; extern StructRNA RNA_Menu; diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 4d3e3ffca26..b293f20dd95 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -313,31 +313,6 @@ static void rna_MaterialTextureSlot_use_set(PointerRNA *ptr, int value) } } -static StructRNA *rna_MaterialEngineSettings_refine(PointerRNA *ptr) -{ -#ifdef WITH_CLAY_ENGINE - MaterialEngineSettings *mes = (MaterialEngineSettings *)ptr->data; - if (STREQ(mes->name, RE_engine_id_BLENDER_CLAY)) { - return &RNA_MaterialEngineSettingsClay; - } -#endif - return &RNA_MaterialEngineSettings; -} - -static void rna_Material_update_engine_data(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr)) -{ -#if 0 - Material *ma = (Material *)ptr->data; - RenderEngineSettings *ed = DRW_material_settings_get(ma, sce->r.engine, NULL); - - if (ed->runtime) { - MEM_freeN(ed->runtime); - ed->runtime = NULL; - } -#endif - WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, NULL); -} - static void rna_Material_use_diffuse_ramp_set(PointerRNA *ptr, int value) { Material *ma = (Material *)ptr->data; @@ -849,118 +824,6 @@ static void rna_def_material_mtex(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Material_update"); } -static void rna_def_material_settings_clay(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static EnumPropertyItem clay_matcap_items[] = { - {ICON_MATCAP_01, "01", ICON_MATCAP_01, "", ""}, - {ICON_MATCAP_02, "02", ICON_MATCAP_02, "", ""}, - {ICON_MATCAP_03, "03", ICON_MATCAP_03, "", ""}, - {ICON_MATCAP_04, "04", ICON_MATCAP_04, "", ""}, - {ICON_MATCAP_05, "05", ICON_MATCAP_05, "", ""}, - {ICON_MATCAP_06, "06", ICON_MATCAP_06, "", ""}, - {ICON_MATCAP_07, "07", ICON_MATCAP_07, "", ""}, - {ICON_MATCAP_08, "08", ICON_MATCAP_08, "", ""}, - {ICON_MATCAP_09, "09", ICON_MATCAP_09, "", ""}, - {ICON_MATCAP_10, "10", ICON_MATCAP_10, "", ""}, - {ICON_MATCAP_11, "11", ICON_MATCAP_11, "", ""}, - {ICON_MATCAP_12, "12", ICON_MATCAP_12, "", ""}, - {ICON_MATCAP_13, "13", ICON_MATCAP_13, "", ""}, - {ICON_MATCAP_14, "14", ICON_MATCAP_14, "", ""}, - {ICON_MATCAP_15, "15", ICON_MATCAP_15, "", ""}, - {ICON_MATCAP_16, "16", ICON_MATCAP_16, "", ""}, - {ICON_MATCAP_17, "17", ICON_MATCAP_17, "", ""}, - {ICON_MATCAP_18, "18", ICON_MATCAP_18, "", ""}, - {ICON_MATCAP_19, "19", ICON_MATCAP_19, "", ""}, - {ICON_MATCAP_20, "20", ICON_MATCAP_20, "", ""}, - {ICON_MATCAP_21, "21", ICON_MATCAP_21, "", ""}, - {ICON_MATCAP_22, "22", ICON_MATCAP_22, "", ""}, - {ICON_MATCAP_23, "23", ICON_MATCAP_23, "", ""}, - {ICON_MATCAP_24, "24", ICON_MATCAP_24, "", ""}, - {0, NULL, 0, NULL, NULL} - }; - - static EnumPropertyItem clay_matcap_type[] = { - {CLAY_MATCAP_NONE, "NONE", 0, "Scene", "Use default scene matcap"}, - {CLAY_MATCAP_SIMPLE, "SIMPLE", 0, "Simple", "Let you choose the texture to use with the default settings"}, - {CLAY_MATCAP_COMPLETE, "COMPLETE", 0, "Complete", "Expose all settings"}, - {0, NULL, 0, NULL, NULL} - }; - - srna = RNA_def_struct(brna, "MaterialEngineSettingsClay", "MaterialEngineSettings"); - RNA_def_struct_ui_text(srna, "Material Clay Settings", "Clay Engine settings for a Material data-block"); - RNA_def_struct_sdna_from(srna, "MaterialEngineSettingsClay", "data"); - - prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, clay_matcap_type); - RNA_def_property_ui_text(prop, "Settings Type", "What settings to use for this material"); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "matcap_icon", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, clay_matcap_items); - RNA_def_property_ui_text(prop, "Matcap", "Image to use for Material Capture by this material"); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "matcap_rotation", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "matcap_rot"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Rotation", "Orientation of the matcap on the model"); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "matcap_hue", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Hue shift", "Hue correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "matcap_saturation", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "matcap_sat"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Saturation", "Saturation correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "matcap_value", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "matcap_val"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Value", "Value correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "ssao_factor_cavity", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Cavity Strength", "Strength of the Cavity effect"); - RNA_def_property_range(prop, 0.0f, 250.0f); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "ssao_factor_edge", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Edge Strength", "Strength of the Edge effect"); - RNA_def_property_range(prop, 0.0f, 250.0f); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "ssao_distance", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Distance", "Distance of object that contribute to the Cavity/Edge effect"); - RNA_def_property_range(prop, 0.0f, 100000.0f); - RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); - - prop = RNA_def_property(srna, "ssao_attenuation", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Attenuation", "Attenuation constant"); - RNA_def_property_range(prop, 1.0f, 100000.0f); - RNA_def_property_ui_range(prop, 1.0f, 100.0f, 1, 3); - RNA_def_property_update(prop, 0, "rna_Material_update_engine_data"); -} - -static void rna_def_material_engine_settings(BlenderRNA *brna) -{ - StructRNA *srna; - - srna = RNA_def_struct(brna, "MaterialEngineSettings", NULL); - RNA_def_struct_ui_text(srna, "Engine Settings", "Engine specific settings"); - RNA_def_struct_sdna(srna, "MaterialEngineSettings"); - RNA_def_struct_refine_func(srna, "rna_MaterialEngineSettings_refine"); - - rna_def_material_settings_clay(brna); -} - static void rna_def_material_gamesettings(BlenderRNA *brna) { StructRNA *srna; @@ -2224,11 +2087,6 @@ void RNA_def_material(BlenderRNA *brna) RNA_def_property_struct_type(prop, "MaterialGameSettings"); RNA_def_property_ui_text(prop, "Game Settings", "Game material settings"); - /* Engine settings */ - prop = RNA_def_property(srna, "engines_settings", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "MaterialEngineSettings"); - RNA_def_property_ui_text(prop, "Material Engine Settings", "Engine specific settings"); - /* nodetree */ prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "nodetree"); @@ -2278,7 +2136,6 @@ void RNA_def_material(BlenderRNA *brna) rna_def_material_strand(brna); rna_def_material_physics(brna); rna_def_material_gamesettings(brna); - rna_def_material_engine_settings(brna); RNA_api_material(srna); } diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 5f796261c73..36de2b85619 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -261,19 +261,18 @@ 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) +static void engine_collection_settings_create(RenderEngine *engine, struct IDProperty *props) { extern FunctionRNA rna_RenderEngine_collection_settings_create_func; - PointerRNA ptr,cesptr; + PointerRNA ptr; 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); + RNA_parameter_set_lookup(&list, "props", &props); engine->type->ext.call(NULL, &ptr, func, &list); RNA_parameter_list_free(&list); @@ -512,7 +511,7 @@ static void rna_def_render_engine(BlenderRNA *brna) 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", "", ""); + parm = RNA_def_pointer(func, "collection_settings", "LayerCollectionSettings", "", ""); RNA_def_parameter_flags(parm, 0, PARM_RNAPTR); /* tag for redraw */ diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 1108f2b7cb5..46bfc58f2ad 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1903,41 +1903,30 @@ static void rna_GameSettings_exit_key_set(PointerRNA *ptr, int value) gm->exitkey = value; } -static StructRNA *rna_RenderEngineSettings_refine(PointerRNA *ptr) +static StructRNA *rna_LayerCollectionSettings_refine(PointerRNA *ptr) { -#ifdef WITH_CLAY_ENGINE - RenderEngineSettings *res = (RenderEngineSettings *)ptr->data; + IDProperty *props = (IDProperty *)ptr->data; + BLI_assert(props && props->type == IDP_GROUP); - if (STREQ(res->name, RE_engine_id_BLENDER_CLAY)) { - return &RNA_RenderEngineSettingsClay; - } + switch (props->subtype) { + case IDP_GROUP_SUB_ENGINE_RENDER: +#ifdef WITH_CLAY_ENGINE + if (STREQ(props->name, RE_engine_id_BLENDER_CLAY)) { + return &RNA_LayerCollectionEngineSettingsClay; + } #endif - return &RNA_RenderEngineSettings; -} - -static PointerRNA rna_RenderEngineSettings_active_get(PointerRNA *ptr) -{ - Scene *scene = (Scene *)ptr->data; - RenderEngineSettings *res; - - /* Ensure settings exists */ - DRW_render_settings_get(scene, scene->r.engine); - - res = BLI_findstring(&scene->engines_settings, scene->r.engine, offsetof(RenderEngineSettings, name)); - - return rna_pointer_inherit_refine(ptr, &RNA_RenderEngineSettings, res); -} - -static void rna_RenderEngineSettings_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) -{ - Scene *sce = (Scene *)ptr->id.data; - MaterialEngineSettingsClay *res; - - res = (MaterialEngineSettingsClay *)DRW_render_settings_get(sce, sce->r.engine); - - res->flag = CLAY_OUTDATED; + break; + case IDP_GROUP_SUB_MODE_OBJECT: + return &RNA_LayerCollectionModeSettingsObject; + break; + case IDP_GROUP_SUB_MODE_EDIT: + return &RNA_LayerCollectionModeSettingsEdit; + break; + default: + break; + } - WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, NULL); + return &RNA_LayerCollectionSettings; } static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[], int frame) @@ -2397,65 +2386,18 @@ static void rna_SceneCollection_object_unlink( /****** layer collection engine settings *******/ -static StructRNA *rna_CollectionEngineSettings_refine(struct PointerRNA *ptr) -{ - CollectionEngineSettings *ces = (CollectionEngineSettings *)ptr->data; - - if (STREQ(ces->name, "BLENDER_CLAY")) { - return &RNA_CollectionEngineSettingsClay; - } - - /* TODO - handle other engines */ - TODO_LAYER; - (void) ces; - - return &RNA_CollectionEngineSettings; -} - -static StructRNA *rna_CollectionModeSettings_refine(struct PointerRNA *ptr) -{ - CollectionEngineSettings *ces = (CollectionEngineSettings *)ptr->data; - - switch(ces->type) { - case COLLECTION_MODE_OBJECT: - return &RNA_CollectionModeSettingsObject; - break; - case COLLECTION_MODE_EDIT: - return &RNA_CollectionModeSettingsEdit; - break; - } - - return &RNA_CollectionModeSettings; -} - -/****** clay engine settings *******/ - -#define RNA_LAYER_ENGINE_USE_GET_SET(_ENGINE_, _NAME_) \ - static int rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_use_get(PointerRNA *ptr) \ - { \ - CollectionEngineSettings *ces = (CollectionEngineSettings *)ptr->data; \ - return BKE_collection_engine_property_use_get(ces, #_NAME_) ? 1 : 0; \ - } \ - \ - static void rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_use_set(PointerRNA *ptr, int value) \ - { \ - CollectionEngineSettings *ces = (CollectionEngineSettings *)ptr->data; \ - BKE_collection_engine_property_use_set(ces, #_NAME_, value? true : false); \ - } - #define RNA_LAYER_ENGINE_GET_SET(_TYPE_, _ENGINE_, _MODE_, _NAME_) \ -static _TYPE_ rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_get(PointerRNA *ptr) \ +static _TYPE_ rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_get(PointerRNA *ptr) \ { \ - CollectionEngineSettings *ces = (CollectionEngineSettings *)ptr->data; \ - return BKE_collection_engine_property_value_get_##_TYPE_(ces, #_NAME_); \ + IDProperty *props = (IDProperty *)ptr->data; \ + return BKE_collection_engine_property_value_get_##_TYPE_(props, #_NAME_); \ } \ \ static void rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_set(PointerRNA *ptr, _TYPE_ value) \ { \ - CollectionEngineSettings *ces = (CollectionEngineSettings *)ptr->data; \ - BKE_collection_engine_property_value_set_##_TYPE_(ces, #_NAME_, value); \ + IDProperty *props = (IDProperty *)ptr->data; \ + BKE_collection_engine_property_value_set_##_TYPE_(props, #_NAME_, value); \ } \ - RNA_LAYER_ENGINE_USE_GET_SET(_ENGINE_, _NAME_) #define RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(_NAME_) \ RNA_LAYER_ENGINE_GET_SET(float, Clay, COLLECTION_MODE_NONE, _NAME_) @@ -2487,7 +2429,6 @@ static void rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_set(PointerRNA *ptr, RNA_LAYER_ENGINE_GET_SET(bool, EditMode, COLLECTION_MODE_EDIT, _NAME_) /* clay engine */ -RNA_LAYER_ENGINE_CLAY_GET_SET_INT(type) 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) @@ -2511,9 +2452,8 @@ RNA_LAYER_MODE_EDIT_GET_SET_FLOAT(normals_length) RNA_LAYER_MODE_EDIT_GET_SET_FLOAT(backwire_opacity) #undef RNA_LAYER_ENGINE_GET_SET -#undef RNA_LAYER_ENGINE_USE_GET_SET -static void rna_CollectionEngineSettings_update(bContext *C, PointerRNA *UNUSED(ptr)) +static void rna_LayerCollectionEngineSettings_update(bContext *C, PointerRNA *UNUSED(ptr)) { SceneLayer *sl = CTX_data_scene_layer(C); LayerCollection *lc = CTX_data_layer_collection(C); @@ -2522,6 +2462,18 @@ static void rna_CollectionEngineSettings_update(bContext *C, PointerRNA *UNUSED( /***********************************/ +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_LayerCollection_name_get(PointerRNA *ptr, char *value) { SceneCollection *sc = ((LayerCollection *)ptr->data)->scene_collection; @@ -2548,49 +2500,6 @@ 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, COLLECTION_MODE_NONE, engine_name); - RNA_pointer_create(NULL, &RNA_CollectionEngineSettings, ces, &ptr); - return rna_pointer_inherit_refine(&ptr, &RNA_CollectionEngineSettings, ces); -} - -static PointerRNA rna_LayerCollection_mode_settings_get(ID *UNUSED(id), LayerCollection *lc, bContext *C, int type) -{ - if (type == COLLECTION_MODE_NONE) { - /* temporarily get mode from active object */ - Object *ob = CTX_data_active_object(C); - - if (ob) { - switch (ob->mode) { - case OB_MODE_OBJECT: - type = COLLECTION_MODE_OBJECT; - break; - case OB_MODE_EDIT: - type = COLLECTION_MODE_EDIT; - break; - } - } - } - - PointerRNA ptr; - CollectionEngineSettings *ces = BKE_layer_collection_engine_get(lc, type, ""); - RNA_pointer_create(NULL, &RNA_CollectionEngineSettings, ces, &ptr); - return rna_pointer_inherit_refine(&ptr, &RNA_CollectionModeSettings, ces); -} - static int rna_LayerCollection_move_above(ID *id, LayerCollection *lc_src, LayerCollection *lc_dst) { Scene *scene = (Scene *)id; @@ -2895,7 +2804,6 @@ static void rna_ObjectBase_select_update(Main *UNUSED(bmain), Scene *UNUSED(scen short mode = (base->flag & BASE_SELECTED) ? BA_SELECT : BA_DESELECT; ED_object_base_select(base, mode); } - #else /* Grease Pencil Interpolation tool settings */ @@ -5903,23 +5811,7 @@ static void rna_def_layer_collection_override(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, NULL); } -#define RNA_LAYER_ENGINE_USE(_ENGINE_, _NAME_) \ - prop = RNA_def_property(srna, #_NAME_"_use", PROP_BOOLEAN, PROP_NONE); \ - RNA_def_property_boolean_funcs(prop, \ - "rna_LayerEngineSettings_"#_ENGINE_"_"#_NAME_"_use_get", \ - "rna_LayerEngineSettings_"#_ENGINE_"_"#_NAME_"_use_set"); \ - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); \ - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - -#define RNA_LAYER_ENGINE_CLAY_USE(_NAME_) \ - RNA_LAYER_ENGINE_USE(Clay, _NAME_) - -#define RNA_LAYER_MODE_OBJECT_USE(_NAME_) \ - RNA_LAYER_ENGINE_USE(ObjectMode, _NAME_) - -#define RNA_LAYER_MODE_EDIT_USE(_NAME_) \ - RNA_LAYER_ENGINE_USE(EditMode, _NAME_) - +#ifdef WITH_CLAY_ENGINE static void rna_def_layer_collection_engine_settings_clay(BlenderRNA *brna) { StructRNA *srna; @@ -5953,87 +5845,60 @@ static void rna_def_layer_collection_engine_settings_clay(BlenderRNA *brna) {0, NULL, 0, NULL, NULL} }; - static EnumPropertyItem clay_matcap_type[] = { - {CLAY_MATCAP_NONE, "NONE", 0, "Scene", "Use default scene matcap"}, - {CLAY_MATCAP_SIMPLE, "SIMPLE", 0, "Simple", "Let you choose the texture to use with the default settings"}, - {CLAY_MATCAP_COMPLETE, "COMPLETE", 0, "Complete", "Expose all settings"}, - {0, NULL, 0, NULL, NULL} - }; - - srna = RNA_def_struct(brna, "CollectionEngineSettingsClay", NULL); - RNA_def_struct_sdna(srna, "CollectionEngineSettings"); + srna = RNA_def_struct(brna, "LayerCollectionEngineSettingsClay", NULL); RNA_def_struct_ui_text(srna, "Collections Clay Engine Settings", "Engine specific settings for this collection"); - 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); + RNA_define_verify_sdna(0); /* not in sdna */ /* see RNA_LAYER_ENGINE_GET_SET macro */ - - prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_funcs(prop, "rna_LayerEngineSettings_Clay_type_get", "rna_LayerEngineSettings_Clay_type_set", NULL); - RNA_def_property_enum_items(prop, clay_matcap_type); - RNA_def_property_ui_text(prop, "Settings Type", "What settings to use for this material"); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(type) - prop = RNA_def_property(srna, "matcap_icon", PROP_ENUM, PROP_NONE); RNA_def_property_enum_funcs(prop, "rna_LayerEngineSettings_Clay_matcap_icon_get", "rna_LayerEngineSettings_Clay_matcap_icon_set", NULL); RNA_def_property_enum_items(prop, clay_matcap_items); RNA_def_property_ui_text(prop, "Matcap", "Image to use for Material Capture by this material"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(matcap_icon) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "matcap_rotation", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_matcap_rotation_get", "rna_LayerEngineSettings_Clay_matcap_rotation_set", NULL); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Rotation", "Orientation of the matcap on the model"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(matcap_rotation) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "matcap_hue", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_matcap_hue_get", "rna_LayerEngineSettings_Clay_matcap_hue_set", NULL); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Hue shift", "Hue correction of the matcap"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(matcap_hue) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "matcap_saturation", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_matcap_saturation_get", "rna_LayerEngineSettings_Clay_matcap_saturation_set", NULL); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Saturation", "Saturation correction of the matcap"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(matcap_saturation) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "matcap_value", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_matcap_value_get", "rna_LayerEngineSettings_Clay_matcap_value_set", NULL); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Value", "Value correction of the matcap"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(matcap_value) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "ssao_factor_cavity", PROP_FLOAT, PROP_NONE); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_ssao_factor_cavity_get", "rna_LayerEngineSettings_Clay_ssao_factor_cavity_set", NULL); RNA_def_property_ui_text(prop, "Cavity Strength", "Strength of the Cavity effect"); RNA_def_property_range(prop, 0.0f, 250.0f); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(ssao_factor_cavity) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "ssao_factor_edge", PROP_FLOAT, PROP_NONE); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_ssao_factor_edge_get", "rna_LayerEngineSettings_Clay_ssao_factor_edge_set", NULL); RNA_def_property_ui_text(prop, "Edge Strength", "Strength of the Edge effect"); RNA_def_property_range(prop, 0.0f, 250.0f); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(ssao_factor_edge) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "ssao_distance", PROP_FLOAT, PROP_NONE); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_ssao_distance_get", "rna_LayerEngineSettings_Clay_ssao_distance_set", NULL); @@ -6041,8 +5906,7 @@ static void rna_def_layer_collection_engine_settings_clay(BlenderRNA *brna) RNA_def_property_range(prop, 0.0f, 100000.0f); RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(ssao_distance) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "ssao_attenuation", PROP_FLOAT, PROP_NONE); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_ssao_attenuation_get", "rna_LayerEngineSettings_Clay_ssao_attenuation_set", NULL); @@ -6050,36 +5914,20 @@ static void rna_def_layer_collection_engine_settings_clay(BlenderRNA *brna) RNA_def_property_range(prop, 1.0f, 100000.0f); RNA_def_property_ui_range(prop, 1.0f, 100.0f, 1, 3); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_ENGINE_CLAY_USE(ssao_attenuation) -} - -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); + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); - /* the engine specific structs */ - rna_def_layer_collection_engine_settings_clay(brna); + RNA_define_verify_sdna(1); /* not in sdna */ } +#endif /* WITH_CLAY_ENGINE */ static void rna_def_layer_collection_mode_settings_object(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - srna = RNA_def_struct(brna, "CollectionModeSettingsObject", NULL); - RNA_def_struct_sdna(srna, "CollectionEngineSettings"); + srna = RNA_def_struct(brna, "LayerCollectionModeSettingsObject", "LayerCollectionSettings"); RNA_def_struct_ui_text(srna, "Collections Object Mode Settings", "Object Mode specific settings for this collection"); + RNA_define_verify_sdna(0); /* not in sdna */ /* see RNA_LAYER_ENGINE_GET_SET macro */ @@ -6087,15 +5935,15 @@ static void rna_def_layer_collection_mode_settings_object(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Wire", "Add the object's wireframe over solid drawing"); RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_ObjectMode_show_wire_get", "rna_LayerEngineSettings_ObjectMode_show_wire_set"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_OBJECT_USE(show_wire) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "show_backface_culling", PROP_BOOLEAN, PROP_NONE); RNA_def_property_ui_text(prop, "Backface Culling", ""); RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_ObjectMode_show_backface_culling_get", "rna_LayerEngineSettings_ObjectMode_show_backface_culling_set"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_OBJECT_USE(show_backface_culling) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); + + RNA_define_verify_sdna(1); /* not in sdna */ } static void rna_def_layer_collection_mode_settings_edit(BlenderRNA *brna) @@ -6103,9 +5951,9 @@ static void rna_def_layer_collection_mode_settings_edit(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna = RNA_def_struct(brna, "CollectionModeSettingsEdit", NULL); - RNA_def_struct_sdna(srna, "CollectionEngineSettings"); - RNA_def_struct_ui_text(srna, "Collections Edit Mode Settings", "Edit Mode specific settings for this collection"); + srna = RNA_def_struct(brna, "LayerCollectionModeSettingsEdit", "LayerCollectionSettings"); + RNA_def_struct_ui_text(srna, "Collections Edit Mode Settings", "Edit Mode specific settings to be overridden per collection"); + RNA_define_verify_sdna(0); /* not in sdna */ /* see RNA_LAYER_ENGINE_GET_SET macro */ @@ -6113,29 +5961,25 @@ static void rna_def_layer_collection_mode_settings_edit(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display"); RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_EditMode_show_occlude_wire_get", "rna_LayerEngineSettings_EditMode_show_occlude_wire_set"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_EDIT_USE(show_occlude_wire) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "face_normals_show", PROP_BOOLEAN, PROP_NONE); RNA_def_property_ui_text(prop, "Draw Normals", "Display face normals as lines"); RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_EditMode_face_normals_show_get", "rna_LayerEngineSettings_EditMode_face_normals_show_set"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_EDIT_USE(face_normals_show) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "vert_normals_show", PROP_BOOLEAN, PROP_NONE); RNA_def_property_ui_text(prop, "Draw Vertex Normals", "Display vertex normals as lines"); RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_EditMode_vert_normals_show_get", "rna_LayerEngineSettings_EditMode_vert_normals_show_set"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_EDIT_USE(vert_normals_show) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "loop_normals_show", PROP_BOOLEAN, PROP_NONE); RNA_def_property_ui_text(prop, "Draw Split Normals", "Display vertex-per-face normals as lines"); RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_EditMode_loop_normals_show_get", "rna_LayerEngineSettings_EditMode_loop_normals_show_set"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_EDIT_USE(loop_normals_show) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "normals_length", PROP_FLOAT, PROP_FACTOR); RNA_def_property_ui_text(prop, "Normal Size", "Display size for normals in the 3D view"); @@ -6143,43 +5987,45 @@ static void rna_def_layer_collection_mode_settings_edit(BlenderRNA *brna) RNA_def_property_range(prop, 0.00001, 1000.0); RNA_def_property_ui_range(prop, 0.01, 10.0, 10.0, 2); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_EDIT_USE(normals_length) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); prop = RNA_def_property(srna, "backwire_opacity", PROP_FLOAT, PROP_FACTOR); RNA_def_property_ui_text(prop, "Backwire Opacity", "Opacity when rendering transparent wires"); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_EditMode_backwire_opacity_get", "rna_LayerEngineSettings_EditMode_backwire_opacity_set", NULL); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_CollectionEngineSettings_update"); - RNA_LAYER_MODE_EDIT_USE(backwire_opacity) + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); + + RNA_define_verify_sdna(1); /* not in sdna */ } -static void rna_def_layer_collection_mode_settings(BlenderRNA *brna) +static void rna_def_layer_collection_settings(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - srna = RNA_def_struct(brna, "CollectionModeSettings", NULL); - RNA_def_struct_sdna(srna, "CollectionEngineSettings"); - RNA_def_struct_ui_text(srna, "Collections Mode Settings", "Mode specific settings for this collection"); - RNA_def_struct_refine_func(srna, "rna_CollectionModeSettings_refine"); + srna = RNA_def_struct(brna, "LayerCollectionSettings", NULL); + RNA_def_struct_ui_text(srna, "Layer Collection Settings", + "Engine specific settings that can be overriden by LayerCollection"); + RNA_def_struct_refine_func(srna, "rna_LayerCollectionSettings_refine"); - prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "type"); - RNA_def_property_enum_items(prop, rna_enum_layer_collection_mode_settings_type_items); - RNA_def_property_ui_text(prop, "Type", ""); + RNA_define_verify_sdna(0); + + prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); + RNA_def_property_string_funcs(prop, "rna_LayerCollectionSettings_name_get", "rna_LayerCollectionSettings_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); + +#ifdef WITH_CLAY_ENGINE + rna_def_layer_collection_engine_settings_clay(brna); +#endif - /* the modes specific structs */ rna_def_layer_collection_mode_settings_object(brna); rna_def_layer_collection_mode_settings_edit(brna); -} -#undef RNA_LAYER_MODE_EDIT_USE -#undef RNA_LAYER_MODE_OBJECT_USE -#undef RNA_LAYER_ENGINE_CLAY_USE -#undef RNA_LAYER_ENGINE_USE + RNA_define_verify_sdna(1); +} static void rna_def_layer_collection(BlenderRNA *brna) { @@ -6220,25 +6066,13 @@ static void rna_def_layer_collection(BlenderRNA *brna) RNA_def_property_struct_type(prop, "LayerCollectionOverride"); RNA_def_property_ui_text(prop, "Collection Overrides", ""); - /* Functions */ - 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); - - func = RNA_def_function(srna, "get_mode_settings", "rna_LayerCollection_mode_settings_get"); - RNA_def_function_ui_description(func, "Return the mode settings for this collection"); - RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_CONTEXT); - parm = RNA_def_enum(func, "type", rna_enum_layer_collection_mode_settings_type_items, COLLECTION_MODE_NONE, "Mode", "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); + /* 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, "LayerCollectionSettings"); + RNA_def_property_ui_text(prop, "Collection Settings", "Override of engine specific render settings"); + /* Functions */ func = RNA_def_function(srna, "move_above", "rna_LayerCollection_move_above"); RNA_def_function_ui_description(func, "Move collection after another"); RNA_def_function_flag(func, FUNC_USE_SELF_ID); @@ -7203,113 +7037,25 @@ static void rna_def_scene_quicktime_settings(BlenderRNA *brna) #endif #ifdef WITH_CLAY_ENGINE -static void rna_def_render_engine_settings_clay(BlenderRNA *brna) +static void UNUSED_FUNCTION(rna_def_scene_engine_settings_clay)(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem clay_matcap_items[] = { - {ICON_MATCAP_01, "01", ICON_MATCAP_01, "", ""}, - {ICON_MATCAP_02, "02", ICON_MATCAP_02, "", ""}, - {ICON_MATCAP_03, "03", ICON_MATCAP_03, "", ""}, - {ICON_MATCAP_04, "04", ICON_MATCAP_04, "", ""}, - {ICON_MATCAP_05, "05", ICON_MATCAP_05, "", ""}, - {ICON_MATCAP_06, "06", ICON_MATCAP_06, "", ""}, - {ICON_MATCAP_07, "07", ICON_MATCAP_07, "", ""}, - {ICON_MATCAP_08, "08", ICON_MATCAP_08, "", ""}, - {ICON_MATCAP_09, "09", ICON_MATCAP_09, "", ""}, - {ICON_MATCAP_10, "10", ICON_MATCAP_10, "", ""}, - {ICON_MATCAP_11, "11", ICON_MATCAP_11, "", ""}, - {ICON_MATCAP_12, "12", ICON_MATCAP_12, "", ""}, - {ICON_MATCAP_13, "13", ICON_MATCAP_13, "", ""}, - {ICON_MATCAP_14, "14", ICON_MATCAP_14, "", ""}, - {ICON_MATCAP_15, "15", ICON_MATCAP_15, "", ""}, - {ICON_MATCAP_16, "16", ICON_MATCAP_16, "", ""}, - {ICON_MATCAP_17, "17", ICON_MATCAP_17, "", ""}, - {ICON_MATCAP_18, "18", ICON_MATCAP_18, "", ""}, - {ICON_MATCAP_19, "19", ICON_MATCAP_19, "", ""}, - {ICON_MATCAP_20, "20", ICON_MATCAP_20, "", ""}, - {ICON_MATCAP_21, "21", ICON_MATCAP_21, "", ""}, - {ICON_MATCAP_22, "22", ICON_MATCAP_22, "", ""}, - {ICON_MATCAP_23, "23", ICON_MATCAP_23, "", ""}, - {ICON_MATCAP_24, "24", ICON_MATCAP_24, "", ""}, - {0, NULL, 0, NULL, NULL} - }; - - srna = RNA_def_struct(brna, "RenderEngineSettingsClay", "RenderEngineSettings"); - RNA_def_struct_ui_text(srna, "Material Clay Settings", "Clay Engine settings for a Material data-block"); - RNA_def_struct_sdna_from(srna, "RenderEngineSettingsClay", "data"); - - prop = RNA_def_property(srna, "matcap_icon", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, clay_matcap_items); - RNA_def_property_ui_text(prop, "Matcap", "Image to use for Material Capture by this material"); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); - - prop = RNA_def_property(srna, "matcap_rotation", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "matcap_rot"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Rotation", "Orientation of the matcap on the model"); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); - - prop = RNA_def_property(srna, "matcap_hue", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Hue shift", "Hue correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); - - prop = RNA_def_property(srna, "matcap_saturation", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "matcap_sat"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Saturation", "Saturation correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); - - prop = RNA_def_property(srna, "matcap_value", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "matcap_val"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Matcap Value", "Value correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); - - prop = RNA_def_property(srna, "ssao_factor_cavity", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Cavity Strength", "Strength of the Cavity effect"); - RNA_def_property_range(prop, 0.0f, 250.0f); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); - - prop = RNA_def_property(srna, "ssao_factor_edge", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Edge Strength", "Strength of the Edge effect"); - RNA_def_property_range(prop, 0.0f, 250.0f); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); - prop = RNA_def_property(srna, "ssao_distance", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Distance", "Distance of object that contribute to the Cavity/Edge effect"); - RNA_def_property_range(prop, 0.0f, 100000.0f); - RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); + srna = RNA_def_struct(brna, "SceneEngineSettingsClay", "SceneEngineSettings"); + RNA_def_struct_ui_text(srna, "Clay Scene Settings", "Clay Engine settings"); - prop = RNA_def_property(srna, "ssao_attenuation", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_text(prop, "Attenuation", "Attenuation constant"); - RNA_def_property_range(prop, 1.0f, 100000.0f); - RNA_def_property_ui_range(prop, 1.0f, 100.0f, 1, 3); - RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); + 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); -} -#endif - -static void rna_def_scene_render_engine(BlenderRNA *brna) -{ - StructRNA *srna; - - srna = RNA_def_struct(brna, "RenderEngineSettings", NULL); - RNA_def_struct_ui_text(srna, "Render Engine Settings", "Engine specific render settings"); - RNA_def_struct_sdna(srna, "RenderEngineSettings"); - RNA_def_struct_refine_func(srna, "rna_RenderEngineSettings_refine"); -#ifdef WITH_CLAY_ENGINE - rna_def_render_engine_settings_clay(brna); -#endif + RNA_define_verify_sdna(1); /* not in sdna */ } +#endif /* WITH_CLAY_ENGINE */ static void rna_def_scene_render_data(BlenderRNA *brna) { @@ -8827,14 +8573,11 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Render Data", ""); /* Render Engine Data */ - prop = RNA_def_property(srna, "engines_settings", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "RenderEngineSettings"); - RNA_def_property_ui_text(prop, "Render Engine Settings", "Engine specific render settings"); - - prop = RNA_def_property(srna, "active_engine_settings", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "RenderEngineSettings"); - RNA_def_property_pointer_funcs(prop, "rna_RenderEngineSettings_active_get", NULL, NULL, NULL); - RNA_def_property_ui_text(prop, "Active Render Engine Settings", "Active Engine specific render settings for this scene"); + 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"); + RNA_def_property_ui_text(prop, "Collection Settings", + "Engine specific render settings to be overridden by collections"); /* Safe Areas */ prop = RNA_def_property(srna, "safe_areas", PROP_POINTER, PROP_NONE); @@ -8982,14 +8725,12 @@ 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_layer_collection_mode_settings(brna); rna_def_scene_layer(brna); rna_def_object_base(brna); RNA_define_animate_sdna(true); /* *** Animated *** */ + rna_def_layer_collection_settings(brna); rna_def_scene_render_data(brna); - rna_def_scene_render_engine(brna); rna_def_scene_render_layer(brna); rna_def_gpu_fx(brna); rna_def_scene_render_view(brna); diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 46775af21db..6ef4bc6a371 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -888,6 +888,15 @@ void RNA_api_ui_layout(StructRNA *srna) parm = RNA_def_pointer(func, "item", "KeyMapItem", "", ""); RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + func = RNA_def_function(srna, "template_override_property", "uiTemplateOverrideProperty"); + parm = RNA_def_pointer(func, "collection_render_overrides", "AnyType", "", ""); + RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + parm = RNA_def_pointer(func, "scene_collection_properties", "AnyType", "", ""); + RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + parm = RNA_def_string(func, "property", NULL, 0, "", "Identifier of property in collection_properties"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_string(func, "custom_template", NULL, 0, "", "Optional template to use for property"); + func = RNA_def_function(srna, "template_component_menu", "uiTemplateComponentMenu"); RNA_def_function_ui_description(func, "Item. Display expanded property in a popup menu"); parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property"); diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index 74d96ce69d1..bac3b5982c4 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -39,7 +39,7 @@ struct bNode; struct bNodeTree; -struct CollectionEngineSettings; +struct IDProperty; struct Main; struct Object; struct Render; @@ -100,7 +100,7 @@ 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); + void (*collection_settings_create)(struct RenderEngine *engine, struct IDProperty *props); struct DrawEngineType *draw_engine; diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 41c3c3aef1a..854ae8ad137 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -691,9 +691,9 @@ float RE_fresnel_dielectric(float incoming[3], float normal[3], float eta) RET_Z /* Draw */ void *DRW_render_settings_get(struct Scene *scene, const char *engine_name) RET_NULL -void OBJECT_collection_settings_create(struct CollectionEngineSettings *ces) RET_NONE -void EDIT_MESH_collection_settings_create(struct CollectionEngineSettings *ces) RET_NONE -void EDIT_ARMATURE_collection_settings_create(struct CollectionEngineSettings *ces) RET_NONE +void OBJECT_collection_settings_create(struct IDProperty *properties) RET_NONE +void EDIT_MESH_collection_settings_create(struct IDProperty *properties) RET_NONE +void EDIT_ARMATURE_collection_settings_create(struct IDProperty *properties) RET_NONE /* python */ struct wmOperatorType *WM_operatortype_find(const char *idname, bool quiet) RET_NULL |