[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