[Bf-blender-cvs] [33c3e293be2] temp-dynamic-overrides: Dynamic Override Properties

Dalai Felinto noreply at git.blender.org
Wed May 9 18:55:32 CEST 2018


Commit: 33c3e293be257c2c2680544ec5232fcd3cb2aca5
Author: Dalai Felinto
Date:   Wed May 9 17:03:04 2018 +0200
Branches: temp-dynamic-overrides
https://developer.blender.org/rB33c3e293be257c2c2680544ec5232fcd3cb2aca5

Dynamic Override Properties

TODO:
 * Final UI
 * Operator to delete them.
 * Depsgraph.
 * Copy properties (copy data).
 * Handle arrays (e.g., ob.color).
 * Data path.
 * Create default override set or let user pick existent one.
 * Get name from data path (rna).
 * Get icon.
 * Set different override_modes based on property type.

Done together with Bastien Montagne.

===================================================================

M	release/scripts/startup/bl_ui/properties_view_layer.py
M	source/blender/blenkernel/BKE_layer.h
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/interface/interface_handlers.c
M	source/blender/editors/scene/scene_edit.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_access.c
M	source/blender/makesrna/intern/rna_layer.c
M	source/blender/makesrna/intern/rna_object.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py
index 8cfeacfaf13..b3a49e50b73 100644
--- a/release/scripts/startup/bl_ui/properties_view_layer.py
+++ b/release/scripts/startup/bl_ui/properties_view_layer.py
@@ -119,7 +119,16 @@ class VIEWLAYER_OT_overrides(ViewLayerButtonsPanel, Panel):
         row.label(text="Scene Properties")
 
         if scene.show_view_layer_overrides_scene_property:
-            layout.label(text="Work in progress...")
+            for dyn_prop in override_set.scene_properties:
+                box = layout.box()
+                row = box.row()
+                row.prop(dyn_prop, "use", text="")
+                subrow = row.row()
+                subrow.active = dyn_prop.use
+                subrow.label(text=dyn_prop.name, icon='NONE')
+                #subrow.prop(dyn_prop, "override_mode", text="")
+                subrow.prop(dyn_prop, "value_int", text="")
+                row.label(icon='ZOOMOUT')
 
         row = layout.row(align=True)
         row.prop(scene, "show_view_layer_overrides_affected_collections", emboss=False, text="")
@@ -140,7 +149,16 @@ class VIEWLAYER_OT_overrides(ViewLayerButtonsPanel, Panel):
         row.label(text="Collection Properties")
 
         if scene.show_view_layer_overrides_collections_property:
-            layout.label(text="Work in progress...")
+            for dyn_prop in override_set.collection_properties:
+                box = layout.box()
+                row = box.row()
+                row.prop(dyn_prop, "use", text="")
+                subrow = row.row()
+                subrow.active = dyn_prop.use
+                subrow.label(text=dyn_prop.name, icon='NONE')
+                #subrow.prop(dyn_prop, "override_mode", text="")
+                subrow.prop(dyn_prop, "value_int", text="")
+                row.label(icon='ZOOMOUT')
 
 
 classes = (
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 77359b033c1..10d1543f3d0 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -43,6 +43,7 @@ extern "C" {
 
 struct Base;
 struct Depsgraph;
+struct DynamicOverrideProperty;
 struct Group;
 struct ID;
 struct IDProperty;
@@ -51,6 +52,8 @@ struct ListBase;
 struct Main;
 struct Object;
 struct OverrideSet;
+struct PointerRNA;
+struct PropertyRNA;
 struct RenderEngine;
 struct Scene;
 struct SceneCollection;
@@ -172,6 +175,12 @@ bool BKE_view_layer_override_set_remove(struct ViewLayer *view_layer, struct Ove
 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);
 
+struct DynamicOverrideProperty *BKE_view_layer_override_property_add(
+        struct OverrideSet *override_set,
+        struct PointerRNA *ptr,
+        struct PropertyRNA *prop,
+        const int index);
+
 /* evaluation */
 
 void BKE_layer_eval_view_layer(
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index c1d3832eddb..9fe3f2ea552 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -59,6 +59,8 @@
 
 #include "DRW_engine.h"
 
+#include "RNA_access.h"
+
 #include "MEM_guardedalloc.h"
 
 /* prototype */
@@ -1846,11 +1848,25 @@ static void override_set_copy_data(OverrideSet *override_set_dst, const Override
 	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);
+	/* TODO copy properties. */
+}
+
+static void override_set_properties_free(ListBase *properties)
+{
+	for (DynamicOverrideProperty *dyn_prop = properties->first; dyn_prop; dyn_prop = dyn_prop->next) {
+		MEM_SAFE_FREE(dyn_prop->rna_path);
+		MEM_SAFE_FREE(dyn_prop->data.str);
+		BLI_freelistN(&dyn_prop->data_path);
+	}
 }
 
 static void override_set_free(OverrideSet *override_set)
 {
 	BLI_freelistN(&override_set->affected_collections);
+	override_set_properties_free(&override_set->scene_properties);
+	BLI_freelistN(&override_set->scene_properties);
+	override_set_properties_free(&override_set->collection_properties);
+	BLI_freelistN(&override_set->collection_properties);
 }
 
 struct OverrideSet *BKE_view_layer_override_set_add(struct ViewLayer *view_layer, const char *name)
@@ -1936,6 +1952,78 @@ bool BKE_view_layer_override_set_collection_unlink(struct OverrideSet *override_
 	return true;
 }
 
+DynamicOverrideProperty *BKE_view_layer_override_property_add(
+        OverrideSet *override_set,
+        PointerRNA *ptr,
+        PropertyRNA *prop,
+        const int index)
+{
+	ID *owner_id = ptr->id.data;
+	eDynamicOverridePropertyType property_type;
+
+	switch (GS(owner_id->name)) {
+		case ID_OB:
+		case ID_ME:
+		case ID_MA:
+			property_type = DYN_OVERRIDE_PROP_TYPE_COLLECTION;
+			break;
+		case ID_SCE:
+		case ID_WO:
+			property_type = DYN_OVERRIDE_PROP_TYPE_SCENE;
+			break;
+		default:
+			BLI_assert("!undefined dynamic assert type");
+			return NULL;
+	}
+
+	DynamicOverrideProperty *dyn_prop = MEM_callocN(sizeof(DynamicOverrideProperty), __func__);
+	dyn_prop->flag = DYN_OVERRIDE_PROP_USE;
+	dyn_prop->override_mode = DYN_OVERRIDE_MODE_REPLACE;
+	dyn_prop->root = owner_id;
+	dyn_prop->property_type = property_type;
+	dyn_prop->rna_path = RNA_path_from_ID_to_property_index(ptr, prop, 0, index);
+
+	/* TODO handle array. */
+	switch (RNA_property_type(prop)) {
+		case PROP_BOOLEAN:
+			dyn_prop->data.i = RNA_property_boolean_get(ptr, prop);
+			break;
+		case PROP_INT:
+			dyn_prop->data.i = RNA_property_int_get(ptr, prop);
+			break;
+		case PROP_FLOAT:
+			dyn_prop->data.f = RNA_property_float_get(ptr, prop);
+			break;
+		case PROP_STRING:
+			dyn_prop->data.str = RNA_property_string_get_alloc(ptr, prop, NULL, 0, NULL);
+			break;
+		case PROP_ENUM:
+			dyn_prop->data.i = RNA_property_enum_get(ptr, prop);
+			break;
+		case PROP_POINTER:
+		{
+			PointerRNA poin = RNA_property_pointer_get(ptr, prop);
+			BLI_assert(RNA_struct_is_ID(poin.type));
+			dyn_prop->data.id = poin.id.data;
+			break;
+		}
+		case PROP_COLLECTION:
+			BLI_assert(!"Should never happen - dyn");
+			break;
+	}
+
+	/* TODO - data_path for depsgraph. */
+
+	if (property_type == DYN_OVERRIDE_PROP_TYPE_SCENE) {
+		BLI_addtail(&override_set->scene_properties, dyn_prop);
+	}
+	else {
+		BLI_addtail(&override_set->collection_properties, dyn_prop);
+	}
+
+	return dyn_prop;
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index cd8227c8725..e49d17cbf23 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5611,6 +5611,13 @@ static void lib_link_scene_collection(FileData *fd, Library *lib, SceneCollectio
 	}
 }
 
+static void lib_link_dynamic_properties(FileData *fd, Library *lib, ListBase *properties) {
+	for (DynamicOverrideProperty *dyn_prop = properties->first; dyn_prop; dyn_prop = dyn_prop->next) {
+		dyn_prop->data.id = newlibadr(fd, lib, dyn_prop->data.id);
+		dyn_prop->root = newlibadr(fd, lib, dyn_prop->root);
+	}
+}
+
 static void lib_link_view_layer(FileData *fd, Library *lib, ViewLayer *view_layer)
 {
 	/* tag scene layer to update for collection tree evaluation */
@@ -5631,6 +5638,11 @@ static void lib_link_view_layer(FileData *fd, Library *lib, ViewLayer *view_laye
 		base->flag |= BASE_DIRTY_ENGINE_SETTINGS;
 	}
 
+	for (OverrideSet *override_set = view_layer->override_sets.first; override_set; override_set = override_set->next) {
+		lib_link_dynamic_properties(fd, lib, &override_set->scene_properties);
+		lib_link_dynamic_properties(fd, lib, &override_set->collection_properties);
+	}
+
 	IDP_LibLinkProperty(view_layer->id_properties, fd);
 }
 
@@ -5909,6 +5921,16 @@ static void direct_link_layer_collections(FileData *fd, ListBase *lb)
 	}
 }
 
+static void direct_link_dynamic_properties(FileData *fd, ListBase *properties)
+{
+	for (DynamicOverrideProperty *dyn_prop = properties->first; dyn_prop; dyn_prop = dyn_prop->next) {
+		dyn_prop->rna_path = newdataadr(fd, dyn_prop->rna_path);
+		dyn_prop->data.str = newdataadr(fd, dyn_prop->data.str);
+		/* Run-time data. */
+		BLI_listbase_clear(&dyn_prop->data_path);
+	}
+}
+
 static void direct_link_view_layer(FileData *fd, ViewLayer *view_layer)
 {
 	view_layer->stats = NULL;
@@ -5933,6 +5955,10 @@ static void direct_link_view_layer(FileData *fd, ViewLayer *view_layer)
 		for (LinkData *link = override_set->affected_collections.first; link; link = link->next) {
 			link->data = newdataadr(fd, link->data);
 		}
+		link_list(fd, &override_set->scene_properties);
+		direct_link_dynamic_properties(fd, &override_set->scene_properties);
+		link_list(fd, &override_set->collection_properties);
+		direct_link_dynamic_properties(fd, &override_set->collection_properties);
 	}
 }
 
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 258f3c3332d..ed11a56965a 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2419,6 +2419,16 @@ static void write_layer_collections(WriteData *wd, ListBase *lb)
 	}
 }
 
+static void write_dynamic_properties(WriteData *wd, ListBase *properties)
+{
+	for (DynamicOverrideProperty *dyn_prop = properties->first; dyn_prop; dyn_prop = dyn_prop->next) {
+		writedata(wd, DATA, strlen(dyn_prop->rna_path) + 1, dyn_prop->rna_path);
+		if (dyn_prop->data.str != NULL) {
+			writedata(wd, DATA, strlen(dyn_prop->data.str) + 1, dyn_prop->data.str);
+		}
+	}
+}
+
 static void write_view_layer(WriteData *wd, ViewLayer *view_layer)
 {
 	writestruct(wd, DATA, ViewLayer, 1, view_layer);
@@ -2440,6 +2450,10 @@ static void write_view_layer(WriteData *wd, ViewLayer *view_layer)
 	writelist(wd, DATA, OverrideSet, &view_layer->override_sets);
 	for (OverrideSet *override_s

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list