Revision: 42491
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42491
Author:   mont29
Date:     2011-12-07 15:55:37 +0000 (Wed, 07 Dec 2011)
Log Message:
-----------
More fix for snapto in Pose mode:
* The code for snap to grid was completely wrong (only x pos of chan was 
affected?\226?\128?\166 by z computed value!), and the same problem as with 
snap to cursor was present (using armature_loc_pose_to_bone is wrong here). 
Also, computing nearest grid point in world space! Else, it generally ends up 
completely out of grid, due to object transforms...
* Small cleanup of code (uneeded vars and copying).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/view3d_snap.c

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_snap.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_snap.c     
2011-12-07 15:21:38 UTC (rev 42490)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_snap.c     
2011-12-07 15:55:37 UTC (rev 42491)
@@ -501,28 +501,36 @@
                                bPoseChannel *pchan;
                                bArmature *arm= ob->data;
                                
+                               invert_m4_m4(ob->imat, ob->obmat);
+                               
                                for (pchan= ob->pose->chanbase.first; pchan; 
pchan= pchan->next) {
                                        if(pchan->bone->flag & BONE_SELECTED) {
                                                if(pchan->bone->layer & 
arm->layer) {
                                                        if((pchan->bone->flag & 
BONE_CONNECTED)==0) { 
-                                                               float vecN[3], 
nLoc[3]; 
+                                                               float nLoc[3]; 
+                                                               float 
inv_restmat[4][4];
                                                                
                                                                /* get nearest 
grid point to snap to */
                                                                
copy_v3_v3(nLoc, pchan->pose_mat[3]);
+                                                               /* We must 
operate in world space! */
+                                                               
mul_m4_v3(ob->obmat, nLoc);
                                                                vec[0]= gridf * 
(float)(floor(0.5f+ nLoc[0]/gridf));
                                                                vec[1]= gridf * 
(float)(floor(0.5f+ nLoc[1]/gridf));
                                                                vec[2]= gridf * 
(float)(floor(0.5f+ nLoc[2]/gridf));
+                                                               /* Back in 
object space... */
+                                                               
mul_m4_v3(ob->imat, vec);
                                                                
-                                                               /* get 
bone-space location of grid point */
-                                                               
armature_loc_pose_to_bone(pchan, vec, vecN);
+                                                               /* get location 
of cursor in *rest* bone-space */
+                                                               
invert_m4_m4(inv_restmat, pchan->bone->arm_mat);
+                                                               
mul_m4_v3(inv_restmat, vec);
                                                                
                                                                /* adjust 
location */
                                                                if 
((pchan->protectflag & OB_LOCK_LOCX)==0)     
-                                                                       
pchan->loc[0]= vecN[0];
+                                                                       
pchan->loc[0]= vec[0];
                                                                if 
((pchan->protectflag & OB_LOCK_LOCY)==0)     
-                                                                       
pchan->loc[0]= vecN[1];
+                                                                       
pchan->loc[1]= vec[1];
                                                                if 
((pchan->protectflag & OB_LOCK_LOCZ)==0)     
-                                                                       
pchan->loc[0]= vecN[2];
+                                                                       
pchan->loc[2]= vec[2];
 
                                                                /* 
auto-keyframing */
                                                                
ED_autokeyframe_pchan(C, scene, ob, pchan, ks);
@@ -630,31 +638,28 @@
                        if(ob->mode & OB_MODE_POSE) {
                                bPoseChannel *pchan;
                                bArmature *arm= ob->data;
-                               float cursp[3];
                                
                                invert_m4_m4(ob->imat, ob->obmat);
-                               copy_v3_v3(cursp, curs);
-                               mul_m4_v3(ob->imat, cursp);
+                               copy_v3_v3(vec, curs);
+                               mul_m4_v3(ob->imat, vec);
                                
                                for (pchan = ob->pose->chanbase.first; pchan; 
pchan=pchan->next) {
                                        if(pchan->bone->flag & BONE_SELECTED) {
                                                if(pchan->bone->layer & 
arm->layer) {
                                                        if((pchan->bone->flag & 
BONE_CONNECTED)==0) { 
-                                                               float curspn[3];
                                                                float 
inv_restmat[4][4];
                                                                
                                                                /* get location 
of cursor in *rest* bone-space */
-                                                               
copy_v3_v3(curspn, cursp);
                                                                
invert_m4_m4(inv_restmat, pchan->bone->arm_mat);
-                                                               
mul_m4_v3(inv_restmat, curspn);
+                                                               
mul_m4_v3(inv_restmat, vec);
                                                                
                                                                /* copy new 
position */
                                                                if 
((pchan->protectflag & OB_LOCK_LOCX)==0)
-                                                                       
pchan->loc[0]= curspn[0];
+                                                                       
pchan->loc[0]= vec[0];
                                                                if 
((pchan->protectflag & OB_LOCK_LOCY)==0)
-                                                                       
pchan->loc[1]= curspn[1];
+                                                                       
pchan->loc[1]= vec[1];
                                                                if 
((pchan->protectflag & OB_LOCK_LOCZ)==0)
-                                                                       
pchan->loc[2]= curspn[2];
+                                                                       
pchan->loc[2]= vec[2];
 
                                                                /* 
auto-keyframing */
                                                                
ED_autokeyframe_pchan(C, scene, ob, pchan, ks);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to