Pose Channels - changing settings in RNA updates them correctly again
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user