[Bf-blender-cvs] [561f375] master: Fix T41409: Copy Custom Property function does nothing with pose bones.

Bastien Montagne noreply at git.blender.org
Tue Aug 12 17:33:11 CEST 2014


Commit: 561f375109c063663919e815b3c05c802e9428f8
Author: Bastien Montagne
Date:   Tue Aug 12 17:31:26 2014 +0200
Branches: master
https://developer.blender.org/rB561f375109c063663919e815b3c05c802e9428f8

Fix T41409: Copy Custom Property function does nothing with pose bones.

Copying custom IDprops actually never worked, afaik, since previous code was copying 'from'
prop onto itself, in this case!

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

M	source/blender/makesrna/intern/rna_access.c

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

diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 079f71d..9f0e68d 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -6464,18 +6464,29 @@ bool RNA_property_reset(PointerRNA *ptr, PropertyRNA *prop, int index)
 			return false;
 	}
 }
-	
+
 bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, int index)
 {
 	int len, fromlen;
+	PropertyRNA *fromprop = prop;
+
+	if (prop->magic != RNA_MAGIC) {
+		/* In case of IDProperty, we have to find the *real* idprop of ptr,
+		 * since prop in this case is just a fake wrapper around actual IDProp data, and not a 'real' PropertyRNA. */
+		prop = (PropertyRNA *)rna_idproperty_find(ptr, ((IDProperty *)fromprop)->name);
+		/* Even though currently we now prop will always be the 'fromprop', this might not be the case in the future. */
+		if (prop == fromprop) {
+			fromprop = (PropertyRNA *)rna_idproperty_find(fromptr, ((IDProperty *)prop)->name);
+		}
+	}
 
 	/* get the length of the array to work with */
 	len = RNA_property_array_length(ptr, prop);
-	fromlen = RNA_property_array_length(fromptr, prop);
+	fromlen = RNA_property_array_length(fromptr, fromprop);
 
 	if (len != fromlen)
 		return false;
-	
+
 	/* get and set the default values as appropriate for the various types */
 	switch (RNA_property_type(prop)) {
 		case PROP_BOOLEAN:
@@ -6483,18 +6494,18 @@ bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop,
 				if (index == -1) {
 					int *tmparray = MEM_callocN(sizeof(int) * len, "copy - boolean");
 					
-					RNA_property_boolean_get_array(fromptr, prop, tmparray);
+					RNA_property_boolean_get_array(fromptr, fromprop, tmparray);
 					RNA_property_boolean_set_array(ptr, prop, tmparray);
 					
 					MEM_freeN(tmparray);
 				}
 				else {
-					int value = RNA_property_boolean_get_index(fromptr, prop, index);
+					int value = RNA_property_boolean_get_index(fromptr, fromprop, index);
 					RNA_property_boolean_set_index(ptr, prop, index, value);
 				}
 			}
 			else {
-				int value = RNA_property_boolean_get(fromptr, prop);
+				int value = RNA_property_boolean_get(fromptr, fromprop);
 				RNA_property_boolean_set(ptr, prop, value);
 			}
 			return true;
@@ -6503,18 +6514,18 @@ bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop,
 				if (index == -1) {
 					int *tmparray = MEM_callocN(sizeof(int) * len, "copy - int");
 					
-					RNA_property_int_get_array(fromptr, prop, tmparray);
+					RNA_property_int_get_array(fromptr, fromprop, tmparray);
 					RNA_property_int_set_array(ptr, prop, tmparray);
 					
 					MEM_freeN(tmparray);
 				}
 				else {
-					int value = RNA_property_int_get_index(fromptr, prop, index);
+					int value = RNA_property_int_get_index(fromptr, fromprop, index);
 					RNA_property_int_set_index(ptr, prop, index, value);
 				}
 			}
 			else {
-				int value = RNA_property_int_get(fromptr, prop);
+				int value = RNA_property_int_get(fromptr, fromprop);
 				RNA_property_int_set(ptr, prop, value);
 			}
 			return true;
@@ -6523,36 +6534,36 @@ bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop,
 				if (index == -1) {
 					float *tmparray = MEM_callocN(sizeof(float) * len, "copy - float");
 					
-					RNA_property_float_get_array(fromptr, prop, tmparray);
+					RNA_property_float_get_array(fromptr, fromprop, tmparray);
 					RNA_property_float_set_array(ptr, prop, tmparray);
 					
 					MEM_freeN(tmparray);
 				}
 				else {
-					float value = RNA_property_float_get_index(fromptr, prop, index);
+					float value = RNA_property_float_get_index(fromptr, fromprop, index);
 					RNA_property_float_set_index(ptr, prop, index, value);
 				}
 			}
 			else {
-				float value = RNA_property_float_get(fromptr, prop);
+				float value = RNA_property_float_get(fromptr, fromprop);
 				RNA_property_float_set(ptr, prop, value);
 			}
 			return true;
 		case PROP_ENUM:
 		{
-			int value = RNA_property_enum_get(fromptr, prop);
+			int value = RNA_property_enum_get(fromptr, fromprop);
 			RNA_property_enum_set(ptr, prop, value);
 			return true;
 		}
 		case PROP_POINTER:
 		{
-			PointerRNA value = RNA_property_pointer_get(fromptr, prop);
+			PointerRNA value = RNA_property_pointer_get(fromptr, fromprop);
 			RNA_property_pointer_set(ptr, prop, value);
 			return true;
 		}
 		case PROP_STRING:
 		{
-			char *value = RNA_property_string_get_alloc(fromptr, prop, NULL, 0, NULL);
+			char *value = RNA_property_string_get_alloc(fromptr, fromprop, NULL, 0, NULL);
 			RNA_property_string_set(ptr, prop, value);
 			MEM_freeN(value);
 			return true;




More information about the Bf-blender-cvs mailing list