[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