Bugfix #5833:
authorJoshua Leung <aligorith@gmail.com>
Mon, 5 Feb 2007 01:28:14 +0000 (01:28 +0000)
committerJoshua Leung <aligorith@gmail.com>
Mon, 5 Feb 2007 01:28:14 +0000 (01:28 +0000)
When rotating bones around the 3d-cursor in posemode with a rotated
armature, rotation was around strange points other than the cursor.

This bug has been around for quite a few releases now. Somehow, the
maths used to convert the world/global space locations to local locations
only worked on things in editmode, but not bones.

source/blender/blenkernel/BKE_armature.h
source/blender/blenkernel/intern/armature.c
source/blender/src/transform.c
source/blender/src/transform_generics.c

index cefaaf24eb6e3d8e41e673781f2bd4638bde93e0..31f6201f35b8b0ea8414b58b784581552aa8f927 100644 (file)
@@ -97,6 +97,7 @@ void mat3_to_vec_roll(float mat[][3], float *vec, float *roll);
 
 /* Common Conversions Between Co-ordinate Spaces */
 void armature_mat_world_to_pose(struct Object *ob, float inmat[][4], float outmat[][4]);
+void armature_loc_world_to_pose(struct Object *ob, float *inloc, float *outloc);
 void armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[][4], float outmat[][4]);
 void armature_loc_pose_to_bone(struct bPoseChannel *pchan, float *inloc, float *outloc);
 void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
index fb9ffb5b2e84543cd5ad9f6a08a00e6c0f1eb544..2d6c3f58352e702c127c34fbba8eefe609f35d18 100644 (file)
@@ -838,6 +838,24 @@ void armature_mat_world_to_pose(Object *ob, float inmat[][4], float outmat[][4])
        Mat4MulMat4(outmat, obmat, inmat);
 }
 
+/* Convert Wolrd-Space Location to Pose-Space Location
+ * NOTE: this cannot be used to convert to pose-space location of the supplied
+ *             pose-channel into its local space (i.e. 'visual'-keyframing) 
+ */
+void armature_loc_world_to_pose(Object *ob, float *inloc, float *outloc) 
+{
+       float xLocMat[4][4];
+       float nLocMat[4][4];
+       
+       /* build matrix for location */
+       Mat4One(xLocMat);
+       VECCOPY(xLocMat[3], inloc);
+
+       /* get bone-space cursor matrix and extract location */
+       armature_mat_world_to_pose(ob, xLocMat, nLocMat);
+       VECCOPY(outloc, nLocMat[3]);
+}
+
 /* Convert Pose-Space Matrix to Bone-Space Matrix 
  * NOTE: this cannot be used to convert to pose-space transforms of the supplied
  *             pose-channel into its local space (i.e. 'visual'-keyframing)
index 68f877928e57f9aaf9fe8924a339f41d4492f22f..323d155342f566c8380d67a0319f0e49669e75f4 100755 (executable)
@@ -122,7 +122,15 @@ static void helpline(TransInfo *t, float *vec)
        }
        else if(t->flag & T_POSE) {
                Object *ob=t->poseobj;
-               if(ob) Mat4MulVecfl(ob->obmat, vecrot);
+               float tmat[4][4];
+               
+               Mat4One(tmat);
+               VECCOPY(tmat[3], vecrot);
+               
+               if(ob) {
+                       Mat4MulMat4(tmat, ob->obmat, tmat);
+                       VECCOPY(vecrot, tmat[3]);
+               }
        }
        
        getmouseco_areawin(mval);
index 5bf08c02255db49e6baf094f925986ab2a1828ac..18412e0ab37c6e6bc1013dec1df821641f30f789 100755 (executable)
@@ -640,14 +640,24 @@ void restoreTransObjects(TransInfo *t)
 
 void calculateCenter2D(TransInfo *t)
 {
-       if (t->flag & (T_EDIT|T_POSE)) {
-               Object *ob= G.obedit?G.obedit:t->poseobj;
+       if (t->flag & T_EDIT) {
+               Object *ob= G.obedit;
                float vec[3];
                
                VECCOPY(vec, t->center);
                Mat4MulVecfl(ob->obmat, vec);
                projectIntView(t, vec, t->center2d);
        }
+       else if (t->flag & T_POSE) {
+               Object *ob= t->poseobj;
+               float mat[4][4];
+               
+               Mat4One(mat);
+               VECCOPY(mat[3], t->center);
+               
+               Mat4MulMat4(mat, ob->obmat, mat);
+               projectIntView(t, mat[3], t->center2d);
+       }
        else {
                projectIntView(t, t->center, t->center2d);
        }
@@ -661,8 +671,8 @@ void calculateCenterCursor(TransInfo *t)
        VECCOPY(t->center, cursor);
 
        /* If edit or pose mode, move cursor in local space */
-       if(t->flag & (T_EDIT|T_POSE)) {
-               Object *ob= G.obedit?G.obedit:t->poseobj;
+       if (t->flag & T_EDIT) {
+               Object *ob= G.obedit;
                float mat[3][3], imat[3][3];
                
                VecSubf(t->center, t->center, ob->obmat[3]);
@@ -670,6 +680,10 @@ void calculateCenterCursor(TransInfo *t)
                Mat3Inv(imat, mat);
                Mat3MulVecfl(imat, t->center);
        }
+       else if (t->flag & T_POSE) {
+               Object *ob= t->poseobj;
+               armature_loc_world_to_pose(ob, cursor, t->center);
+       }
        
        calculateCenter2D(t);
 }