Revision: 46607
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46607
Author:   mont29
Date:     2012-05-13 16:01:59 +0000 (Sun, 13 May 2012)
Log Message:
-----------
Adds ?\226?\128?\156align?\226?\128?\157 option to snap to verts/edges/faces, 
for bones in Pose mode.

Have to use a ugly hack, as for pose bones, rotscale transform matrix is not 
always the same as translate one... :/

Adresses feature request [#30979] snapping: "align rotation with the snapping 
target" and pose-mode.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2012-05-13 
14:47:53 UTC (rev 46606)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2012-05-13 
16:01:59 UTC (rev 46607)
@@ -93,7 +93,7 @@
             if snap_element != 'INCREMENT':
                 row.prop(toolsettings, "snap_target", text="")
                 if obj:
-                    if obj.mode == 'OBJECT' and snap_element != 'VOLUME':
+                    if obj.mode in {'OBJECT','POSE'} and snap_element != 
'VOLUME':
                         row.prop(toolsettings, "use_snap_align_rotation", 
text="")
                     elif obj.mode == 'EDIT':
                         row.prop(toolsettings, "use_snap_self", text="")

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c  2012-05-13 
14:47:53 UTC (rev 46606)
+++ trunk/blender/source/blender/editors/transform/transform.c  2012-05-13 
16:01:59 UTC (rev 46607)
@@ -3035,12 +3035,16 @@
                }
                
                /* rotation */
-               if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate 
objects itself
+               /* MORE HACK: as in some cases the matrix to apply location and 
rot/scale is not the same,
+                * and ElementRotation() might be called in Translation context 
(with align snapping),
+                * we need to be sure to actually use the *rotation* matrix 
here...
+                * So no other way than storing it in some dedicated members of 
td->ext! */
+               if ((t->flag & T_V3D_ALIGN)==0) { /* align mode doesn't rotate 
objects itself */
                        /* euler or quaternion/axis-angle? */
                        if (td->ext->rotOrder == ROT_MODE_QUAT) {
-                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, 
NULL, NULL, NULL, NULL, NULL);
+                               mul_serie_m3(fmat, td->ext->r_mtx, mat, 
td->ext->r_smtx, NULL, NULL, NULL, NULL, NULL);
                                
-                               mat3_to_quat(quat, fmat);       // Actual 
transform
+                               mat3_to_quat(quat, fmat); /* Actual transform */
                                
                                mul_qt_qtqt(td->ext->quat, quat, 
td->ext->iquat);
                                /* this function works on end result */
@@ -3053,8 +3057,8 @@
                                
                                axis_angle_to_quat(iquat, td->ext->irotAxis, 
td->ext->irotAngle);
                                
-                               mul_serie_m3(fmat, td->mtx, mat, td->smtx, 
NULL, NULL, NULL, NULL, NULL);
-                               mat3_to_quat(quat, fmat);       // Actual 
transform
+                               mul_serie_m3(fmat, td->ext->r_mtx, mat, 
td->ext->r_smtx, NULL, NULL, NULL, NULL, NULL);
+                               mat3_to_quat(quat, fmat); /* Actual transform */
                                mul_qt_qtqt(tquat, quat, iquat);
                                
                                quat_to_axis_angle(td->ext->rotAxis, 
td->ext->rotAngle, tquat);
@@ -3065,8 +3069,8 @@
                        else { 
                                float eulmat[3][3];
                                
-                               mul_m3_m3m3(totmat, mat, td->mtx);
-                               mul_m3_m3m3(smat, td->smtx, totmat);
+                               mul_m3_m3m3(totmat, mat, td->ext->r_mtx);
+                               mul_m3_m3m3(smat, td->ext->r_smtx, totmat);
                                
                                /* calculate the total rotatation in eulers */
                                copy_v3_v3(eul, td->ext->irot);
@@ -3472,12 +3476,18 @@
                /* handle snapping rotation before doing the translation */
                if (usingSnappingNormal(t)) {
                        if (validSnappingNormal(t)) {
-                               float *original_normal = td->axismtx[2];
+                               float *original_normal;
                                float axis[3];
                                float quat[4];
                                float mat[3][3];
                                float angle;
                                
+                               /* In pose mode, we want to align normals with 
Y axis of bones... */
+                               if (t->flag & T_POSE)
+                                       original_normal = td->axismtx[1];
+                               else
+                                       original_normal = td->axismtx[2];
+                               
                                cross_v3_v3v3(axis, original_normal, 
t->tsnap.snapNormal);
                                angle = saacos(dot_v3v3(original_normal, 
t->tsnap.snapNormal));
                                

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h  2012-05-13 
14:47:53 UTC (rev 46606)
+++ trunk/blender/source/blender/editors/transform/transform.h  2012-05-13 
16:01:59 UTC (rev 46607)
@@ -137,6 +137,10 @@
        float  isize[3];         /* Initial size                                
                                   */
        float  obmat[4][4];      /* Object matrix */
        float  l_smtx[3][3]; /* use instead of td->smtx, It is the same but 
without the 'bone->bone_mat', see TD_PBONE_LOCAL_MTX_C */
+       float  r_mtx[3][3];  /* The rotscale matrix of pose bone, to allow 
using snap-align in translation mode,
+                             * when td->mtx is the loc pose bone matrix (and 
hence can't be used to apply rotation in some cases,
+                             * namely when a bone is in "NoLocal" or "Hinge" 
mode)... */
+       float  r_smtx[3][3]; /* Invers of previous one. */
        int    rotOrder;        /* rotation mode,  as defined in eRotationModes 
(DNA_action_types.h) */
 } TransDataExtension;
 

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c      
2012-05-13 14:47:53 UTC (rev 46606)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c      
2012-05-13 16:01:59 UTC (rev 46607)
@@ -538,6 +538,7 @@
        /* New code, using "generic" BKE_pchan_to_pose_mat(). */
        {
                float rotscale_mat[4][4], loc_mat[4][4];
+               float rpmat[3][3];
 
                BKE_pchan_to_pose_mat(pchan, rotscale_mat, loc_mat);
                if (t->mode == TFM_TRANSLATION)
@@ -545,13 +546,23 @@
                else
                        copy_m3_m4(pmat, rotscale_mat);
 
+               /* Grrr! Exceptional case: When translating pose bones that are 
either Hinge or NoLocal,
+                * and want align snapping, we just need both loc_mat and 
rotscale_mat.
+                * So simply always store rotscale mat in td->ext, and always 
use it to apply rotations...
+                * Ugly to need such hacks! :/ */
+               copy_m3_m4(rpmat, rotscale_mat);
+
                if (constraints_list_needinv(t, &pchan->constraints)) {
                        copy_m3_m4(tmat, pchan->constinv);
                        invert_m3_m3(cmat, tmat);
                        mul_serie_m3(td->mtx, pmat, omat, cmat, NULL, NULL, 
NULL, NULL, NULL);
+                       mul_serie_m3(td->ext->r_mtx, rpmat, omat, cmat, 
NULL,NULL,NULL,NULL,NULL);
                }
-               else
-                       mul_serie_m3(td->mtx, pmat, omat, NULL, NULL, NULL, 
NULL, NULL, NULL);
+               else {
+                       mul_serie_m3(td->mtx, pmat, omat, NULL, 
NULL,NULL,NULL,NULL,NULL);
+                       mul_serie_m3(td->ext->r_mtx, rpmat, omat, NULL, 
NULL,NULL,NULL,NULL,NULL);
+               }
+               invert_m3_m3(td->ext->r_smtx, td->ext->r_mtx);
        }
 
        invert_m3_m3(td->smtx, td->mtx);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to