[Bf-blender-cvs] [189b31c9376] temp-dynamic-overrides: View Layer overrides
Dalai Felinto
noreply at git.blender.org
Tue May 8 20:11:40 CEST 2018
Commit: 189b31c93768290479c5efe65a98f0cc2f824aff
Author: Dalai Felinto
Date: Mon May 7 14:35:59 2018 +0200
Branches: temp-dynamic-overrides
https://developer.blender.org/rB189b31c93768290479c5efe65a98f0cc2f824aff
View Layer overrides
TODO:
* Properties (all)
Notes:
* UI settings, stored per scene so it does not change based on view layer
* Link collection menu can leak memory (like Move to Collection).
The design for this task is: T54792
===================================================================
M release/scripts/startup/bl_ui/properties_view_layer.py
M source/blender/blenkernel/BKE_layer.h
M source/blender/blenkernel/intern/collection.c
M source/blender/blenkernel/intern/layer.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/editors/scene/CMakeLists.txt
M source/blender/editors/scene/scene_edit.c
M source/blender/makesdna/DNA_layer_types.h
M source/blender/makesdna/DNA_scene_types.h
M source/blender/makesrna/RNA_access.h
M source/blender/makesrna/intern/rna_layer.c
M source/blender/makesrna/intern/rna_scene.c
M source/blender/windowmanager/WM_types.h
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py
index 3c8552c3407..8cfeacfaf13 100644
--- a/release/scripts/startup/bl_ui/properties_view_layer.py
+++ b/release/scripts/startup/bl_ui/properties_view_layer.py
@@ -76,9 +76,79 @@ class VIEWLAYER_PT_eevee_layer_passes(ViewLayerButtonsPanel, Panel):
row.prop(view_layer, "use_pass_subsurface_color", text="Color", toggle=True)
+class VIEWLAYER_UL_override_set_collections(UIList):
+ def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
+ layout.row().label(text=item.name, icon_value=icon)
+
+
+class VIEWLAYER_UL_override_sets(UIList):
+ def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
+ row = layout.row(align=True)
+ row.prop(item, "use", text="", index=index)
+ row.prop(item, "name", text="", index=index, icon_value=icon, emboss=False)
+
+
+class VIEWLAYER_OT_overrides(ViewLayerButtonsPanel, Panel):
+ bl_label = "Overrides"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_CLAY', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+ view_layer = context.view_layer
+
+ row = layout.row(align=True)
+ row.label(text="Override Sets")
+
+ row = layout.row()
+ col = row.column()
+
+ col.template_list("VIEWLAYER_UL_override_sets", "name", view_layer, "override_sets", view_layer.override_sets, "active_index", rows=2)
+
+ col = row.column(align=True)
+ col.operator("scene.view_layer_override_set_add", icon='ZOOMIN', text="")
+ col.operator("scene.view_layer_override_set_remove", icon='ZOOMOUT', text="")
+
+ override_set = view_layer.override_sets.active
+ if not override_set:
+ return
+
+ row = layout.row(align=True)
+ row.prop(scene, "show_view_layer_overrides_scene_property", emboss=False, text="")
+ row.label(text="Scene Properties")
+
+ if scene.show_view_layer_overrides_scene_property:
+ layout.label(text="Work in progress...")
+
+ row = layout.row(align=True)
+ row.prop(scene, "show_view_layer_overrides_affected_collections", emboss=False, text="")
+ row.label(text="Affected Collections")
+
+ if scene.show_view_layer_overrides_affected_collections:
+ row = layout.row()
+ col = row.column()
+
+ col.template_list("VIEWLAYER_UL_override_set_collections", "", override_set, "affected_collections", override_set.affected_collections, "active_index", rows=1)
+
+ col = row.column(align=True)
+ col.operator("scene.override_set_collection_link", icon='ZOOMIN', text="")
+ col.operator("scene.override_set_collection_unlink", icon='ZOOMOUT', text="")
+
+ row = layout.row(align=True)
+ row.prop(scene, "show_view_layer_overrides_collections_property", emboss=False, text="")
+ row.label(text="Collection Properties")
+
+ if scene.show_view_layer_overrides_collections_property:
+ layout.label(text="Work in progress...")
+
+
classes = (
VIEWLAYER_PT_layer,
VIEWLAYER_PT_eevee_layer_passes,
+ VIEWLAYER_UL_override_set_collections,
+ VIEWLAYER_UL_override_sets,
+ VIEWLAYER_OT_overrides,
)
if __name__ == "__main__": # only for live edit.
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 3205392a795..77359b033c1 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -50,6 +50,7 @@ struct LayerCollection;
struct ListBase;
struct Main;
struct Object;
+struct OverrideSet;
struct RenderEngine;
struct Scene;
struct SceneCollection;
@@ -75,6 +76,7 @@ void BKE_view_layer_selected_objects_tag(struct ViewLayer *view_layer, const int
struct Object *BKE_view_layer_camera_find(struct ViewLayer *view_layer);
struct ViewLayer *BKE_view_layer_first_from_id(const struct ID *owner_id);
struct ViewLayer *BKE_view_layer_find_from_collection(const struct ID *owner_id, struct LayerCollection *lc);
+struct ViewLayer *BKE_view_layer_find_from_override_set(const struct ID *owner_id, struct OverrideSet *override_set);
struct Base *BKE_view_layer_base_find(struct ViewLayer *view_layer, struct Object *ob);
void BKE_view_layer_base_deselect_all(struct ViewLayer *view_layer);
void BKE_view_layer_base_select(struct ViewLayer *view_layer, struct Base *selbase);
@@ -163,6 +165,13 @@ void BKE_collection_engine_property_value_set_float(struct IDProperty *props, co
void BKE_collection_engine_property_value_set_float_array(struct IDProperty *props, const char *name, const float *values);
void BKE_collection_engine_property_value_set_bool(struct IDProperty *props, const char *name, bool value);
+/* Dynamic override. */
+
+struct OverrideSet *BKE_view_layer_override_set_add(struct ViewLayer *view_layer, const char *name);
+bool BKE_view_layer_override_set_remove(struct ViewLayer *view_layer, struct OverrideSet *override_set);
+bool BKE_view_layer_override_set_collection_link(struct OverrideSet *override_set, struct SceneCollection *collection);
+bool BKE_view_layer_override_set_collection_unlink(struct OverrideSet *override_set, struct SceneCollection *collection);
+
/* evaluation */
void BKE_layer_eval_view_layer(
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 4303f7d9150..0be2c05d4ec 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -264,6 +264,13 @@ bool BKE_collection_remove(ID *owner_id, SceneCollection *sc)
for (ViewLayer *view_layer = BKE_view_layer_first_from_id(owner_id); view_layer; view_layer = view_layer->next) {
layer_collection_remove(view_layer, &view_layer->layer_collections, sc);
view_layer->active_collection = 0;
+
+ for (OverrideSet *override_set = view_layer->override_sets.first;
+ override_set != NULL;
+ override_set = override_set->next)
+ {
+ BKE_view_layer_override_set_collection_unlink(override_set, sc);
+ }
}
MEM_freeN(sc);
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index bdc1ceda46d..c1d3832eddb 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -72,6 +72,8 @@ static IDProperty *collection_engine_settings_create(struct EngineSettingsCB_Typ
static IDProperty *collection_engine_get(IDProperty *root, const char *engine_name);
static void collection_engine_settings_init(IDProperty *root, const bool populate);
static void layer_engine_settings_init(IDProperty *root, const bool populate);
+static void override_set_copy_data(struct OverrideSet *override_set_dst, const struct OverrideSet *override_set_src);
+static void override_set_free(struct OverrideSet *override_set);
static void object_bases_iterator_next(BLI_Iterator *iter, const int flag);
/* RenderLayer */
@@ -226,6 +228,11 @@ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user)
MEM_SAFE_FREE(view_layer->object_bases_array);
+ for (OverrideSet *override_set = view_layer->override_sets.first; override_set; override_set = override_set->next) {
+ override_set_free(override_set);
+ }
+ BLI_freelistN(&view_layer->override_sets);
+
MEM_freeN(view_layer);
}
@@ -315,6 +322,28 @@ ViewLayer *BKE_view_layer_find_from_collection(const ID *owner_id, LayerCollecti
}
}
+/**
+ * Return the view layer that owns the override set
+ */
+ViewLayer *BKE_view_layer_find_from_override_set(const ID *owner_id, OverrideSet *override_set)
+{
+ switch (GS(owner_id->name)) {
+ case ID_SCE:
+ {
+ Scene *scene = (Scene *)owner_id;
+ for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
+ if (BLI_findindex(&view_layer->override_sets, override_set) != -1) {
+ return view_layer;
+ }
+ }
+ return NULL;
+ }
+ default:
+ BLI_assert(!"ID doesn't support override sets");
+ return NULL;
+ }
+}
+
/* Base */
Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
@@ -501,6 +530,16 @@ void BKE_view_layer_copy_data(
}
}
+ BLI_duplicatelist(&view_layer_dst->override_sets, &view_layer_src->override_sets);
+ OverrideSet *override_set_dst, *override_set_src;
+ for (override_set_dst = view_layer_dst->override_sets.first,
+ override_set_src = view_layer_src->override_sets.first;
+ override_set_dst != NULL;
+ override_set_dst = override_set_dst->next, override_set_src = override_set_src->next)
+ {
+ override_set_copy_data(override_set_dst, override_set_src);
+ }
+
view_layer_dst->object_bases_array = NULL;
}
@@ -1798,6 +1837,107 @@ void BKE_view_layer_engine_settings_validate_scene(Scene *scene)
/* Iterators */
+/* -------------------------------------------------------------------- */
+/** \name Public Dynamic Overrides
+ * \{ */
+
+static void override_set_copy_data(OverrideSet *override_set_dst, const OverrideSet *override_set_src)
+{
+ BLI_strncpy(override_set_dst->name, override_set_src->name, sizeof(override_set_dst->name));
+ override_set_dst->flag = override_set_src->flag;
+ BLI_duplicatelist(&override_set_dst->affected_collections, &override_set_src->affected_collections);
+}
+
+static void override_set_free(OverrideSet *override_set)
+{
+ BLI_freelistN(&override_set->affected_collections);
+}
+
+struct OverrideSet *BKE_view_layer_override_set_add(struct ViewLayer *view_layer, const char *name)
+{
+ OverrideSet *override_set = MEM_callocN(sizeof(OverrideSet), __func__);
+ override_set->flag = DYN_OVERRIDE_SET_USE;
+
+ BLI_strncpy_utf8(override_set->name, name, sizeof(override_set->name));
+ BLI_uniquename(&view_layer->override_sets,
+ override_set,
+ DATA_("OverrideSet"),
+ '.',
+ offsetof(OverrideSet, name),
+ sizeof(override_set->name));
+
+ BLI_addtail(&view_layer->override_sets, override_set);
+ return override_set;
+}
+
+bool BKE_view_layer_override_set_rem
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list