[Bf-blender-cvs] [ba1d1a6923e] temp-dynamic-overrides: Hard-coded support for arrays, color works

Dalai Felinto noreply at git.blender.org
Tue May 15 14:26:23 CEST 2018


Commit: ba1d1a6923eb648df24938ea511023c00af5b3fd
Author: Dalai Felinto
Date:   Mon May 14 22:21:34 2018 +0200
Branches: temp-dynamic-overrides
https://developer.blender.org/rBba1d1a6923eb648df24938ea511023c00af5b3fd

Hard-coded support for arrays, color works

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

M	release/scripts/startup/bl_ui/properties_view_layer.py
M	source/blender/blenkernel/intern/layer.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesrna/intern/rna_layer.c

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

diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py
index a46c8087d32..302264f15fd 100644
--- a/release/scripts/startup/bl_ui/properties_view_layer.py
+++ b/release/scripts/startup/bl_ui/properties_view_layer.py
@@ -154,18 +154,39 @@ class VIEWLAYER_OT_overrides(ViewLayerButtonsPanel, Panel):
     def _icon_from_id_type(id_type):
         return id_type + '_DATA'
 
-    def _draw_property(self, layout, dyn_prop, index, property_type):
+    @staticmethod
+    def _value_name_override_mode_get(data_type, data_subtype):
+        """
+        return Tuple: value name and whether the property supports override modes
+        """
         # TODO: Finish this.
         proptype_map = {
-            'BOOLEAN': ("value_boolean", False),
-            'INT': ("value_int", True),
-            'FLOAT': ("value_float", True),
-            'STRING': (None, False),
-            'ENUM': (None, False),
-            'POINTER': (None, False),
-            'COLLECTION': (None, False),
+            'BOOLEAN': {
+                'NONE': ("value_boolean", False)},
+            'INT': {
+                'NONE': ("value_int", True)},
+            'FLOAT': {
+                'NONE': ("value_float", True),
+                'COLOR': ("value_color", False)},
+            'STRING': {
+                'NONE': (None, False)},
+            'ENUM': {
+                'NONE': (None, False)},
+            'POINTER': {
+                'NONE': (None, False)},
+            'COLLECTION': {
+                'NONE': (None, False)},
         }
 
+        type_lookup = proptype_map[data_type]
+        value_name = type_lookup.get(data_subtype)
+
+        if value_name is None:
+            value_name = type_lookup['NONE']
+
+        return value_name
+
+    def _draw_property(self, layout, dyn_prop, index, property_type):
         box = layout.box()
         row = box.row()
         row.prop(dyn_prop, "use", text="")
@@ -173,7 +194,7 @@ class VIEWLAYER_OT_overrides(ViewLayerButtonsPanel, Panel):
         subrow.active = dyn_prop.use
 
         subrow.label(text=dyn_prop.name, icon=self._icon_from_id_type(dyn_prop.id_type))
-        value_propname, override_mode_support = proptype_map[dyn_prop.data_type]
+        value_propname, override_mode_support = self._value_name_override_mode_get(dyn_prop.data_type, dyn_prop.data_subtype)
 
         if override_mode_support:
             subrow.prop(dyn_prop, "override_mode", text="")
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index c828b6e7840..2ed8061bc95 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -2021,22 +2021,29 @@ DynamicOverrideProperty *BKE_view_layer_override_property_add(
 	dyn_prop->property_type = property_type;
 	dyn_prop->rna_path = rna_path_str;
 
+	const bool is_array = RNA_property_array_check(prop);
+
 	/* TODO handle array. */
 	switch (RNA_property_type(prop)) {
 		case PROP_BOOLEAN:
-			dyn_prop->data.i = RNA_property_boolean_get(ptr, prop);
+			dyn_prop->data.i[0] = RNA_property_boolean_get(ptr, prop);
 			break;
 		case PROP_INT:
-			dyn_prop->data.i = RNA_property_int_get(ptr, prop);
+			dyn_prop->data.i[0] = RNA_property_int_get(ptr, prop);
 			break;
 		case PROP_FLOAT:
-			dyn_prop->data.f = RNA_property_float_get(ptr, prop);
+			if (is_array) {
+				RNA_property_float_get_array(ptr, prop, dyn_prop->data.f);
+			}
+			else {
+				dyn_prop->data.f[0] = 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);
+			dyn_prop->data.i[0] = RNA_property_enum_get(ptr, prop);
 			break;
 		case PROP_POINTER:
 		{
diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h
index a5be96784b6..b4743dc03e6 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -63,8 +63,8 @@ typedef struct LayerCollection {
 } LayerCollection;
 
 typedef struct DynamicOverridePropertyData {
-	int i;
-	float f;
+	int i[4];
+	float f[4];
 	struct ID *id;
 	char *str;
 } DynamicOverridePropertyData;
diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c
index 42edaef8110..9569a8f1982 100644
--- a/source/blender/makesrna/intern/rna_layer.c
+++ b/source/blender/makesrna/intern/rna_layer.c
@@ -866,7 +866,7 @@ static int rna_DynamicOverrideProperty_length(PointerRNA *ptr)
 	return strlen(dyn_prop->rna_path);
 }
 
-static int rna_DynamicOverrideProperty_data_type_get(PointerRNA *ptr)
+static PropertyRNA *rna_DynamicOverride_property_get(PointerRNA *ptr)
 {
 	DynamicOverrideProperty *dyn_prop = ptr->data;
 
@@ -890,32 +890,44 @@ static int rna_DynamicOverrideProperty_data_type_get(PointerRNA *ptr)
 	PropertyElemRNA *prop_elem = dyn_prop->data_path.last;
 
 	/* Note that we have no 'invalid' value for PropertyRNA type... :/ */
-	return prop_elem ? RNA_property_type(prop_elem->prop) : -1;
+	return prop_elem ? prop_elem->prop : NULL;
+
+}
 
+static int rna_DynamicOverrideProperty_data_type_get(PointerRNA *ptr)
+{
+	PropertyRNA *prop = rna_DynamicOverride_property_get(ptr);
+	return prop ? RNA_property_type(prop) : -1;
+}
+
+static int rna_DynamicOverrideProperty_data_subtype_get(PointerRNA *ptr)
+{
+	PropertyRNA *prop = rna_DynamicOverride_property_get(ptr);
+	return prop ? RNA_property_subtype(prop) : -1;
 }
 
 static int rna_DynamicOverrideProperty_value_boolean_get(PointerRNA *ptr)
 {
 	DynamicOverrideProperty *dyn_prop = ptr->data;
-	return dyn_prop->data.i;
+	return dyn_prop->data.i[0];
 }
 
 static void rna_DynamicOverrideProperty_value_boolean_set(PointerRNA *ptr, int value)
 {
 	DynamicOverrideProperty *dyn_prop = ptr->data;
-	dyn_prop->data.i = value;
+	dyn_prop->data.i[0] = value;
 }
 
 static int rna_DynamicOverrideProperty_value_int_get(PointerRNA *ptr)
 {
 	DynamicOverrideProperty *dyn_prop = ptr->data;
-	return dyn_prop->data.i;
+	return dyn_prop->data.i[0];
 }
 
 static void rna_DynamicOverrideProperty_value_int_set(PointerRNA *ptr, int value)
 {
 	DynamicOverrideProperty *dyn_prop = ptr->data;
-	dyn_prop->data.i = value;
+	dyn_prop->data.i[0] = value;
 }
 
 static void rna_DynamicOverrideProperty_value_int_range(
@@ -931,13 +943,13 @@ static void rna_DynamicOverrideProperty_value_int_range(
 static float rna_DynamicOverrideProperty_value_float_get(PointerRNA *ptr)
 {
 	DynamicOverrideProperty *dyn_prop = ptr->data;
-	return dyn_prop->data.f;
+	return dyn_prop->data.f[0];
 }
 
 static void rna_DynamicOverrideProperty_value_float_set(PointerRNA *ptr, float value)
 {
 	DynamicOverrideProperty *dyn_prop = ptr->data;
-	dyn_prop->data.f = value;
+	dyn_prop->data.f[0] = value;
 }
 
 static void rna_DynamicOverrideProperty_value_float_range(
@@ -950,6 +962,18 @@ static void rna_DynamicOverrideProperty_value_float_range(
 	*max = FLT_MAX;
 }
 
+static void rna_DynamicOverrideProperty_value_color_get(PointerRNA *ptr, float *values)
+{
+	DynamicOverrideProperty *dyn_prop = ptr->data;
+	copy_v3_v3(values, dyn_prop->data.f);
+}
+
+static void rna_DynamicOverrideProperty_value_color_set(PointerRNA *ptr, const float *values)
+{
+	DynamicOverrideProperty *dyn_prop = ptr->data;
+	copy_v3_v3(dyn_prop->data.f, values);
+}
+
 static void rna_OverriddenCollection_name_get(PointerRNA *ptr, char *value)
 {
 	SceneCollection *collection = ((LinkData *)ptr->data)->data;
@@ -2184,6 +2208,12 @@ static void rna_def_dynamic_override_property(BlenderRNA *brna)
 	RNA_def_property_enum_funcs(prop, "rna_DynamicOverrideProperty_data_type_get", NULL, NULL);
 	RNA_def_property_ui_text(prop, "Type", "Data type of the property");
 
+	prop = RNA_def_property(srna, "data_subtype", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_items(prop, rna_enum_property_subtype_items);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_enum_funcs(prop, "rna_DynamicOverrideProperty_data_subtype_get", NULL, NULL);
+	RNA_def_property_ui_text(prop, "Subtype", "Data subtype of the property");
+
 	/* Accessors for the different value types. */
 	prop = RNA_def_property(srna, "value_boolean", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_funcs(prop,
@@ -2204,6 +2234,14 @@ static void rna_def_dynamic_override_property(BlenderRNA *brna)
 	                             "rna_DynamicOverrideProperty_value_float_set",
 	                             "rna_DynamicOverrideProperty_value_float_range");
 	RNA_def_property_update(prop, NC_SCENE | ND_DYN_OVERRIDES, NULL);
+
+	prop = RNA_def_property(srna, "value_color", PROP_FLOAT, PROP_COLOR);
+	RNA_def_property_array(prop, 3);
+	RNA_def_property_float_funcs(prop,
+	                             "rna_DynamicOverrideProperty_value_color_get",
+	                             "rna_DynamicOverrideProperty_value_color_set",
+	                             NULL);
+	RNA_def_property_update(prop, NC_SCENE | ND_DYN_OVERRIDES, NULL);
 }
 
 static void rna_def_overridden_collection(BlenderRNA *brna)



More information about the Bf-blender-cvs mailing list