[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19164] branches/blender2.5/blender/source /blender: Pose Channels - changing settings in RNA updates them correctly again

Joshua Leung aligorith at gmail.com
Mon Mar 2 02:23:05 CET 2009


Revision: 19164
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19164
Author:   aligorith
Date:     2009-03-02 02:22:02 +0100 (Mon, 02 Mar 2009)

Log Message:
-----------
Pose Channels - changing settings in RNA updates them correctly again

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/transform/transform.c
    branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_pose.c

Modified: branches/blender2.5/blender/source/blender/editors/transform/transform.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform.c	2009-03-02 00:55:10 UTC (rev 19163)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform.c	2009-03-02 01:22:02 UTC (rev 19164)
@@ -2449,7 +2449,7 @@
 			Mat3MulVecfl(pmtx, vec);	// To Global space
 			Mat3MulVecfl(mat, vec);		// Applying rotation
 			Mat3MulVecfl(imtx, vec);	// To Local space
-	
+			
 			VecAddf(vec, vec, center);
 			/* vec now is the location where the object has to be */
 			
@@ -2457,9 +2457,9 @@
 			
 			Mat3MulVecfl(pmtx, vec);	// To Global space
 			Mat3MulVecfl(td->smtx, vec);// To Pose space
-	
+				
 			protectedTransBits(td->protectflag, vec);
-	
+			
 			VecAddf(td->loc, td->iloc, vec);
 			
 			constraintTransLim(t, td);
@@ -2467,19 +2467,40 @@
 		
 		/* rotation */
 		if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
-			Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+			/* euler or quaternion? */
+			if (td->flag & TD_USEQUAT) {
+				Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+				
+				Mat3ToQuat(fmat, quat);	// Actual transform
+				
+				QuatMul(td->ext->quat, quat, td->ext->iquat);
+				/* this function works on end result */
+				protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
+			}
+			else {
+				float eulmat[3][3];
+				
+				Mat3MulMat3(totmat, mat, td->mtx);
+				Mat3MulMat3(smat, td->smtx, totmat);
+				
+				/* calculate the total rotatation in eulers */
+				VECCOPY(eul, td->ext->irot);
+				EulToMat3(eul, eulmat);
+				
+				/* mat = transform, obmat = bone rotation */
+				Mat3MulMat3(fmat, smat, eulmat);
+				
+				Mat3ToCompatibleEul(fmat, eul, td->ext->rot);
+				
+				/* and apply (to end result only) */
+				protectedRotateBits(td->protectflag, eul, td->ext->irot);
+				VECCOPY(td->ext->rot, eul);
+			}
 			
-			Mat3ToQuat(fmat, quat);	// Actual transform
-			
-			QuatMul(td->ext->quat, quat, td->ext->iquat);
-			/* this function works on end result */
-			protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
-			
 			constraintRotLim(t, td);
 		}
 	}
 	else {
-		
 		if ((td->flag & TD_NO_LOC) == 0)
 		{
 			/* translation */
@@ -2506,7 +2527,8 @@
 
 		/* rotation */
 		if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
-			if(td->flag & TD_USEQUAT) {
+			/* euler or quaternion? */
+ 	  	    if (td->flag & TD_USEQUAT) {
 				Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
 				Mat3ToQuat(fmat, quat);	// Actual transform
 				

Modified: branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c	2009-03-02 00:55:10 UTC (rev 19163)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c	2009-03-02 01:22:02 UTC (rev 19164)
@@ -551,7 +551,11 @@
 	VECCOPY(td->center, vec);
 	
 	td->ob = ob;
-	td->flag= TD_SELECTED|TD_USEQUAT;
+	td->flag = TD_SELECTED;
+	if (pchan->rotmode == PCHAN_ROT_QUAT)
+	{
+		td->flag |= TD_USEQUAT;
+	}
 	if (bone->flag & BONE_HINGE_CHILD_TRANSFORM)
 	{
 		td->flag |= TD_NOCENTER;
@@ -568,12 +572,21 @@
 	td->loc = pchan->loc;
 	VECCOPY(td->iloc, pchan->loc);
 	
-	td->ext->rot= NULL;
-	td->ext->quat= pchan->quat;
 	td->ext->size= pchan->size;
-
-	QUATCOPY(td->ext->iquat, pchan->quat);
 	VECCOPY(td->ext->isize, pchan->size);
+	
+	if (pchan->rotmode) {
+		td->ext->rot= pchan->eul;
+		td->ext->quat= NULL;
+		
+		VECCOPY(td->ext->irot, pchan->eul);
+	}
+	else {
+		td->ext->rot= NULL;
+		td->ext->quat= pchan->quat;
+		
+		QUATCOPY(td->ext->iquat, pchan->quat);
+	}
 
 	/* proper way to get parent transform + own transform + constraints transform */
 	Mat3CpyMat4(omat, ob->obmat);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_pose.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_pose.c	2009-03-02 00:55:10 UTC (rev 19163)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_pose.c	2009-03-02 01:22:02 UTC (rev 19164)
@@ -35,8 +35,18 @@
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 
+#include "WM_types.h"
+
 #ifdef RNA_RUNTIME
 
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+
+static void rna_Pose_update(bContext *C, PointerRNA *ptr)
+{
+	DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
+}
+
 #else
 
 /* users shouldn't be editing pose channel data directly -- better to set ipos and let blender calc pose_channel stuff */
@@ -128,23 +138,28 @@
 	prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
 	RNA_def_property_float_sdna(prop, NULL, "loc");
 	RNA_def_property_ui_text(prop, "Location", "");
+	RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
 
 	prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_VECTOR);
 	RNA_def_property_float_sdna(prop, NULL, "size");
 	RNA_def_property_ui_text(prop, "Scale", "");
+	RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
 
 	prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION);
 	RNA_def_property_float_sdna(prop, NULL, "quat");
 	RNA_def_property_ui_text(prop, "Rotation", "Rotation in Quaternions.");
+	RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
 	
 	prop= RNA_def_property(srna, "euler_rotation", PROP_FLOAT, PROP_ROTATION);
 	RNA_def_property_float_sdna(prop, NULL, "eul");
 	RNA_def_property_ui_text(prop, "Rotation (Euler)", "Rotation in Eulers.");
+	RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
 	
 	prop= RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "rotmode");
 	RNA_def_property_enum_items(prop, prop_rotmode_items);
 	RNA_def_property_ui_text(prop, "Rotation Mode", "");
+	RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
 
 	/* These three matrix properties await an implementation of the PROP_MATRIX subtype, which currently doesn't exist. */
 /*	prop= RNA_def_property(srna, "channel_matrix", PROP_FLOAT, PROP_MATRIX);





More information about the Bf-blender-cvs mailing list