== etch-a-ton ==
authorMartin Poirier <theeth@yahoo.com>
Tue, 31 Mar 2009 14:29:58 +0000 (14:29 +0000)
committerMartin Poirier <theeth@yahoo.com>
Tue, 31 Mar 2009 14:29:58 +0000 (14:29 +0000)
Correct joint-guided roll to use the previous bone, not the following (that was silly). Also made first bone use view axis (since it has no previous), this is much nicer that using rotation correction only. Using the joint roll option makes it MUCH more orientation independant.

source/blender/src/editarmature_retarget.c

index ad114868a69520759945021a88b18cf5d94292dd..f42fed06757ace0dc7543baed9c0812eb0607efe 100644 (file)
@@ -201,12 +201,12 @@ float rollBoneByQuatAligned(EditBone *bone, float old_up_axis[3], float qrot[4],
        }
 }
 
-float rollBoneByQuatJoint(RigEdge *edge, RigEdge *previous, float qrot[4], float qroll[4])
+float rollBoneByQuatJoint(RigEdge *edge, RigEdge *previous, float qrot[4], float qroll[4], float up_axis[3])
 {
        if (previous == NULL)
        {
-               QuatOne(qroll);
-               return rollBoneByQuat(edge->bone, edge->up_axis, qrot);
+               /* default to up_axis if no previous */
+               return rollBoneByQuatAligned(edge->bone, edge->up_axis, qrot, qroll, up_axis);
        }
        else
        {
@@ -223,9 +223,8 @@ float rollBoneByQuatJoint(RigEdge *edge, RigEdge *previous, float qrot[4], float
                }
                else
                {
-                       /* SHOULDN'T BE HERE */
-                       QuatOne(qroll);
-                       return rollBoneByQuat(edge->bone, edge->up_axis, qrot);
+                       /* default to up_axis if first bone in the chain is an offset */
+                       return rollBoneByQuatAligned(edge->bone, edge->up_axis, qrot, qroll, up_axis);
                }
                
                VecSubf(vec_second, edge->bone->tail, edge->bone->head);
@@ -1846,7 +1845,7 @@ static void repositionBone(RigGraph *rigg, RigEdge *edge, float vec0[3], float v
                }
                else if (G.scene->toolsettings->skgen_retarget_roll == SK_RETARGET_ROLL_JOINT)
                {
-                       bone->roll = rollBoneByQuatJoint(edge, edge->next, qrot, qroll);
+                       bone->roll = rollBoneByQuatJoint(edge, edge->prev, qrot, qroll, up_axis);
                }
                else
                {