[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42490] trunk/blender/source/blender/ editors/space_view3d/view3d_snap.c: Fix [#29461] Selection-to-Cursor works strange with bones with TrackTo constraint.

Bastien Montagne montagne29 at wanadoo.fr
Wed Dec 7 16:21:41 CET 2011


Revision: 42490
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42490
Author:   mont29
Date:     2011-12-07 15:21:38 +0000 (Wed, 07 Dec 2011)
Log Message:
-----------
Fix [#29461] Selection-to-Cursor works strange with bones with TrackTo constraint.

In fact, the problem was present with any kind of constraint?\226?\128?\166

We need the cursor coordinates in the rest bone space (aka armature space), i.e with all "manual" and "procedural" (constraints, ...) pose transforms cleared (as said in armature_mat_pose_to_bone:

	/* Remove the pchan's transforms from it's pose_mat.
	 * This should leave behind the effects of restpose + 
	 * parenting + constraints
	 */

, only "manual" transforms are "cleared" by armature_loc_pose_to_bone...).

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 14:54:03 UTC (rev 42489)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_snap.c	2011-12-07 15:21:38 UTC (rev 42490)
@@ -641,16 +641,19 @@
 						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 bone-space */
-								armature_loc_pose_to_bone(pchan, cursp, curspn);
+								/* 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);
 								
 								/* copy new position */
-								if ((pchan->protectflag & OB_LOCK_LOCX)==0)	
+								if ((pchan->protectflag & OB_LOCK_LOCX)==0)
 									pchan->loc[0]= curspn[0];
-								if ((pchan->protectflag & OB_LOCK_LOCY)==0)	
+								if ((pchan->protectflag & OB_LOCK_LOCY)==0)
 									pchan->loc[1]= curspn[1];
-								if ((pchan->protectflag & OB_LOCK_LOCZ)==0)	
+								if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
 									pchan->loc[2]= curspn[2];
 
 								/* auto-keyframing */




More information about the Bf-blender-cvs mailing list