[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28455] trunk/blender/source/blender/ python/intern/bpy_rna.c: fixes for euler order setting when the rotation mode is not euler.

Campbell Barton ideasman42 at gmail.com
Tue Apr 27 09:50:31 CEST 2010


Revision: 28455
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28455
Author:   campbellbarton
Date:     2010-04-27 09:50:31 +0200 (Tue, 27 Apr 2010)

Log Message:
-----------
fixes for euler order setting when the rotation mode is not euler.

Modified Paths:
--------------
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2010-04-27 06:47:12 UTC (rev 28454)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2010-04-27 07:50:31 UTC (rev 28455)
@@ -56,9 +56,9 @@
 
 static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyRNA *self, PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length);
 static Py_ssize_t pyrna_prop_array_length(BPy_PropertyRNA *self);
-static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self );
+static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self);
+static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback);
 
-
 /* bpyrna vector/euler/quat callbacks */
 static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
 
@@ -84,10 +84,9 @@
 	
 	/* Euler order exception */
 	if(subtype==MATHUTILS_CB_SUBTYPE_EUL) {
-		PropertyRNA *prop_eul_order= RNA_struct_find_property(&self->ptr, "rotation_mode");
-		if(prop_eul_order) {
-			((EulerObject *)bmo)->order= RNA_property_enum_get(&self->ptr, prop_eul_order);
-		}		
+		EulerObject *eul= (EulerObject *)bmo;
+		PropertyRNA *prop_eul_order= NULL;
+		eul->order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
 	}
 	
 	return 1;
@@ -110,17 +109,18 @@
 	}
 
 	RNA_property_float_set_array(&self->ptr, self->prop, vec_to);
-	
+	RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+
 	/* Euler order exception */
 	if(subtype==MATHUTILS_CB_SUBTYPE_EUL) {
-		PropertyRNA *prop_eul_order= RNA_struct_find_property(&self->ptr, "rotation_mode");
-		if(prop_eul_order) {
-			RNA_property_enum_set(&self->ptr, prop_eul_order, ((EulerObject *)bmo)->order);
+		EulerObject *eul= (EulerObject *)bmo;
+		PropertyRNA *prop_eul_order= NULL;
+		short order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
+		if(order != eul->order) {
+			RNA_property_enum_set(&self->ptr, prop_eul_order, eul->order);
 			RNA_property_update(BPy_GetContext(), &self->ptr, prop_eul_order);
-		}		
+		}
 	}
-
-	RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
 	return 1;
 }
 
@@ -271,22 +271,17 @@
 		case PROP_EULER:
 		case PROP_QUATERNION:
 			if(len==3) { /* euler */
-				/* attempt to get order */
-				/* TODO, keep order in sync */
-				short order= ROT_MODE_XYZ;
-				PropertyRNA *prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode");
-				if(prop_eul_order) {
-					order = RNA_property_enum_get(ptr, prop_eul_order);
-					if (order < ROT_MODE_XYZ || order > ROT_MODE_ZYX) /* could be quat or axisangle */
-						order= ROT_MODE_XYZ;
-				}
+				if(is_thick) {
+					/* attempt to get order, only needed for thixk types since wrapped with update via callbacks */
+					PropertyRNA *prop_eul_order= NULL;
+					short order= pyrna_rotation_euler_order_get(ptr, &prop_eul_order, ROT_MODE_XYZ);
 
-				if(is_thick) {
 					ret= newEulerObject(NULL, order, Py_NEW, NULL); // TODO, get order from RNA
 					RNA_property_float_get_array(ptr, prop, ((EulerObject *)ret)->eul);
 				}
 				else {
-					PyObject *eul_cb= newEulerObject_cb(ret, order, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA
+					/* order will be updated from callback on use */
+					PyObject *eul_cb= newEulerObject_cb(ret, ROT_MODE_XYZ, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA
 					Py_DECREF(ret); /* the euler owns now */
 					ret= eul_cb; /* return the euler instead */
 				}
@@ -337,6 +332,21 @@
 
 #endif
 
+static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback)
+{
+	/* attempt to get order */
+	if(*prop_eul_order==NULL)
+		*prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode");
+
+	if(*prop_eul_order) {
+		short order= RNA_property_enum_get(ptr, *prop_eul_order);
+		if (order >= ROT_MODE_XYZ && order <= ROT_MODE_ZYX) /* could be quat or axisangle */
+			return order;
+	}
+
+	return order_fallback;
+}
+
 static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b )
 {
 	return (a->ptr.data==b->ptr.data) ? 0 : -1;





More information about the Bf-blender-cvs mailing list