From 06629033b30ae29a4d63372bcfc5e670d439891a Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 2 Mar 2009 01:22:02 +0000 Subject: Pose Channels - changing settings in RNA updates them correctly again --- source/blender/editors/transform/transform.c | 46 ++++++++++++++++------ .../editors/transform/transform_conversions.c | 23 ++++++++--- source/blender/makesrna/intern/rna_pose.c | 15 +++++++ 3 files changed, 67 insertions(+), 17 deletions(-) (limited to 'source/blender') diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index e6b8662ce4c..e7749e6eb3a 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -2449,7 +2449,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short 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 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short 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 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short /* 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); - - 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); + /* 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); + } constraintRotLim(t, td); } } else { - if ((td->flag & TD_NO_LOC) == 0) { /* translation */ @@ -2506,7 +2527,8 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short /* 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 diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 587607f3eb8..b47f4edc7da 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -551,7 +551,11 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr 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 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr 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); diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index d18b01ecc16..dbaf4279884 100755 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -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 @@ static void rna_def_pose_channel(BlenderRNA *brna) 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); -- cgit v1.2.3