Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/transform/transform_manipulator.c')
-rw-r--r--source/blender/editors/transform/transform_manipulator.c70
1 files changed, 67 insertions, 3 deletions
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index bdf0a91bf89..2247977ef87 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -175,6 +175,61 @@ static void stats_editbone(View3D *v3d, EditBone *ebo)
protectflag_to_drawflags(OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE, &v3d->twdrawflag);
}
+
+static int test_rotmode_euler(short rotmode)
+{
+ return (ELEM(rotmode, ROT_MODE_AXISANGLE, ROT_MODE_QUAT)) ? 0:1;
+}
+
+void gimbalAxis(Object *ob, float gmat[][3])
+{
+ if(ob->mode & OB_MODE_POSE)
+ {
+ bPoseChannel *pchan= NULL;
+
+ /* use channels to get stats */
+ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->bone && pchan->bone->flag & BONE_ACTIVE) {
+ if(test_rotmode_euler(pchan->rotmode)) {
+ break;
+ }
+ }
+ }
+
+ if(pchan) {
+ int i;
+
+ EulToGimbalAxis(gmat, pchan->eul, pchan->rotmode);
+
+ for (i=0; i<3; i++)
+ Mat3MulVecfl(pchan->bone->bone_mat, gmat[i]);
+
+ if(pchan->parent) {
+ bPoseChannel *pchan_par= pchan->parent;
+
+ float tmat[3][3];
+ Mat3CpyMat4(tmat, pchan_par->pose_mat);
+
+ for (i=0; i<3; i++)
+ Mat3MulVecfl(tmat, gmat[i]);
+ }
+
+ /* needed if object trans isnt identity */
+ for (i=0; i<3; i++) {
+ float tmat[3][3];
+ Mat3CpyMat4(tmat, ob->obmat);
+ Mat3MulVecfl(tmat, gmat[i]);
+ }
+ }
+ }
+ else {
+ if(test_rotmode_euler(ob->rotmode)) {
+ EulToGimbalAxis(gmat, ob->rot, ob->rotmode);
+ }
+ }
+}
+
+
/* centroid, boundbox, of selection */
/* returns total items selected */
int calc_manipulator_stats(const bContext *C)
@@ -416,6 +471,14 @@ int calc_manipulator_stats(const bContext *C)
case V3D_MANIP_GLOBAL:
break; /* nothing to do */
+ case V3D_MANIP_GIMBAL:
+ {
+ float mat[3][3];
+ Mat3One(mat);
+ gimbalAxis(ob, mat);
+ Mat4CpyMat3(rv3d->twmat, mat);
+ break;
+ }
case V3D_MANIP_NORMAL:
if(obedit || ob->mode & OB_MODE_POSE) {
float mat[3][3];
@@ -1404,9 +1467,10 @@ void BIF_draw_manipulator(const bContext *C)
int totsel;
if(!(v3d->twflag & V3D_USE_MANIPULATOR)) return;
- if(G.moving && (G.moving & G_TRANSFORM_MANIP)==0) return;
+// if(G.moving && (G.moving & G_TRANSFORM_MANIP)==0) return;
- if(G.moving==0) {
+// if(G.moving==0) {
+ {
v3d->twflag &= ~V3D_DRAW_MANIPULATOR;
totsel= calc_manipulator_stats(C);
@@ -1454,7 +1518,7 @@ void BIF_draw_manipulator(const bContext *C)
else draw_manipulator_rotate_cyl(v3d, rv3d, 0, drawflags, v3d->twtype, MAN_RGB);
}
else
- draw_manipulator_rotate(v3d, rv3d, G.moving, drawflags, v3d->twtype);
+ draw_manipulator_rotate(v3d, rv3d, 0 /* G.moving*/, drawflags, v3d->twtype);
glDisable(GL_BLEND);
}