[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15050] trunk/blender/source/blender: Transform Orientations

Martin Poirier theeth at yahoo.com
Thu May 29 21:10:09 CEST 2008


Revision: 15050
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15050
Author:   theeth
Date:     2008-05-29 21:10:09 +0200 (Thu, 29 May 2008)

Log Message:
-----------
Transform Orientations

Edit Bone and Pose Bone can now be used as transform orientations

Also fix a bug with CTO comming from non-uniformally scaled meshes.

Modified Paths:
--------------
    trunk/blender/source/blender/include/transform.h
    trunk/blender/source/blender/src/transform_manipulator.c
    trunk/blender/source/blender/src/transform_orientations.c

Modified: trunk/blender/source/blender/include/transform.h
===================================================================
--- trunk/blender/source/blender/include/transform.h	2008-05-29 14:23:08 UTC (rev 15049)
+++ trunk/blender/source/blender/include/transform.h	2008-05-29 19:10:09 UTC (rev 15050)
@@ -515,6 +515,7 @@
 
 int manageObjectSpace(int confirm, int set);
 int manageMeshSpace(int confirm, int set);
+int manageBoneSpace(int confirm, int set);
 
 /* Those two fill in mat and return non-zero on success */
 int createSpaceNormal(float mat[3][3], float normal[3]);

Modified: trunk/blender/source/blender/src/transform_manipulator.c
===================================================================
--- trunk/blender/source/blender/src/transform_manipulator.c	2008-05-29 14:23:08 UTC (rev 15049)
+++ trunk/blender/source/blender/src/transform_manipulator.c	2008-05-29 19:10:09 UTC (rev 15050)
@@ -158,7 +158,7 @@
 }
 
 /* for pose mode */
-static void stats_pose(View3D *v3d, bPoseChannel *pchan, float *normal, float *plane)
+static void stats_pose(View3D *v3d, bPoseChannel *pchan)
 {
 	Bone *bone= pchan->bone;
 	
@@ -166,9 +166,6 @@
 		if (bone->flag & BONE_TRANSFORM) {
 			calc_tw_center(pchan->pose_head);
 			protectflag_to_drawflags(pchan->protectflag, &v3d->twdrawflag);
-
-			VecAddf(normal, normal, pchan->pose_mat[2]);
-			VecAddf(plane, plane, pchan->pose_mat[1]);
 		}
 	}
 }
@@ -349,26 +346,24 @@
 		}
 	}
 	else if(ob && (ob->flag & OB_POSEMODE)) {
-		bArmature *arm= ob->data;
+		bArmature *arm = ob->data;
 		bPoseChannel *pchan;
 		int mode;
 		
 		if((ob->lay & G.vd->lay)==0) return 0;
 		
-		mode= Trans.mode;
-		Trans.mode= TFM_ROTATION;	// mislead counting bones... bah
+		mode = Trans.mode;
+		Trans.mode = TFM_ROTATION;	// mislead counting bones... bah
 		
 		/* count total, we use same method as transform will do */
 		Trans.total= 0;
 		count_bone_select(&Trans, arm, &arm->bonebase, 1);
-		totsel= Trans.total;
+		totsel = Trans.total;
 		if(totsel) {
 			/* use channels to get stats */
 			for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
-				stats_pose(v3d, pchan, normal, plane);
+				stats_pose(v3d, pchan);
 			}
-			//VecMulf(normal, -1.0);
-			VecMulf(plane, -1.0);
 			
 			VecMulf(G.scene->twcent, 1.0f/(float)totsel);	// centroid!
 			Mat4MulVecfl(ob->obmat, G.scene->twcent);
@@ -376,7 +371,7 @@
 			Mat4MulVecfl(ob->obmat, G.scene->twmax);
 		}
 		/* restore, mode can be TFM_INIT */
-		Trans.mode= mode;
+		Trans.mode = mode;
 	}
 	else if(G.f & (G_VERTEXPAINT + G_TEXTUREPAINT + G_WEIGHTPAINT + G_SCULPTMODE)) {
 		;
@@ -433,7 +428,7 @@
 			break;
 			
 		case V3D_MANIP_NORMAL:
-			if(G.obedit) {
+			if(G.obedit || ob->flag & OB_POSEMODE) {
 				float mat[3][3];
 				int type;
 				
@@ -479,34 +474,6 @@
 				}
 				break;
 			}
-			/* pose mode is a bit weird, so keep it separated */
-			else if (ob->flag & OB_POSEMODE)
-			{
-				strcpy(t->spacename, "normal");
-				if(normal[0]!=0.0 || normal[1]!=0.0 || normal[2]!=0.0) {
-					float imat[3][3], mat[3][3];
-					
-					/* we need the transpose of the inverse for a normal... */
-					Mat3CpyMat4(imat, ob->obmat);
-					
-					Mat3Inv(mat, imat);
-					Mat3Transp(mat);
-					Mat3MulVecfl(mat, normal);
-					Mat3MulVecfl(mat, plane);
-
-					Normalize(normal);
-					if(0.0==Normalize(plane)) VECCOPY(plane, mat[1]);
-					
-					VECCOPY(mat[2], normal);
-					Crossf(mat[0], normal, plane);
-					Crossf(mat[1], mat[2], mat[0]);
-					
-					Mat4CpyMat3(v3d->twmat, mat);
-					Mat4Ortho(v3d->twmat);
-
-					break;
-				}
-			}
 			/* no break we define 'normal' as 'local' in Object mode */
 		case V3D_MANIP_LOCAL:
 			strcpy(t->spacename, "local");

Modified: trunk/blender/source/blender/src/transform_orientations.c
===================================================================
--- trunk/blender/source/blender/src/transform_orientations.c	2008-05-29 14:23:08 UTC (rev 15049)
+++ trunk/blender/source/blender/src/transform_orientations.c	2008-05-29 19:10:09 UTC (rev 15050)
@@ -27,6 +27,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_armature_types.h"
+#include "DNA_action_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_listBase.h"
 #include "DNA_object_types.h"
@@ -68,12 +69,18 @@
 }
  
 void BIF_manageTransformOrientation(int confirm, int set) {
+	Object *ob = OBACT;
 	int index = -1; 
 	
 	if (G.obedit) {
 		if (G.obedit->type == OB_MESH)
 			index = manageMeshSpace(confirm, set);
+		else if (G.obedit->type == OB_ARMATURE)
+			index = manageBoneSpace(confirm, set);
 	}
+	else if (ob && (ob->flag & OB_POSEMODE)) {
+			index = manageBoneSpace(confirm, set);
+	}
 	else {
 		index = manageObjectSpace(confirm, set);
 	}
@@ -122,7 +129,32 @@
 	}
 }
 
+int manageBoneSpace(int confirm, int set) {
+	float mat[3][3];
+	float normal[3], plane[3];
+	char name[36] = "";
+	int index;
 
+	getTransformOrientation(normal, plane, 0);
+	
+	if (confirm == 0 && confirmSpace(set, "Bone") == 0) {
+		return -1;
+	}
+
+	if (createSpaceNormalTangent(mat, normal, plane) == 0) {
+		error("Cannot use zero-length bone");
+		return -1;
+	}
+
+	strcpy(name, "Bone");
+
+	/* Input name */
+	sbutton(name, 1, 35, "name: ");
+
+	index = addMatrixSpace(mat, name);
+	return index;
+}
+
 int manageMeshSpace(int confirm, int set) {
 	float mat[3][3];
 	float normal[3], plane[3];
@@ -363,6 +395,29 @@
   	}
 }
 
+static int count_bone_select(bArmature *arm, ListBase *lb, int do_it) 
+{
+	Bone *bone;
+	int do_next;
+	int total = 0;
+	
+	for(bone= lb->first; bone; bone= bone->next) {
+		bone->flag &= ~BONE_TRANSFORM;
+		do_next = do_it;
+		if(do_it) {
+			if(bone->layer & arm->layer) {
+				if (bone->flag & BONE_SELECTED) {
+					bone->flag |= BONE_TRANSFORM;
+					total++;
+					do_next= 0;	// no transform on children if one parent bone is selected
+				}
+			}
+		}
+		total += count_bone_select(arm, &bone->childbase, do_next);
+	}
+	
+	return total;
+}
 
 int getTransformOrientation(float normal[3], float plane[3], int activeOnly)
 {
@@ -375,6 +430,14 @@
 
 	if(G.obedit)
 	{
+		float imat[3][3], mat[3][3];
+		
+		/* we need the transpose of the inverse for a normal... */
+		Mat3CpyMat4(imat, ob->obmat);
+		
+		Mat3Inv(mat, imat);
+		Mat3Transp(mat);
+
 		ob= G.obedit;
 
 		if(G.obedit->type==OB_MESH)
@@ -639,12 +702,48 @@
 			}
 
 		}
-		
-		Mat4Mul3Vecfl(G.obedit->obmat, plane);
-		Mat4Mul3Vecfl(G.obedit->obmat, normal);
+
+		/* Vectors from edges don't need the special transpose inverse multiplication */
+		if (result == ORIENTATION_EDGE)
+		{
+			Mat4Mul3Vecfl(ob->obmat, normal);
+			Mat4Mul3Vecfl(ob->obmat, plane);
+		}
+		else
+		{
+			Mat3MulVecfl(mat, normal);
+			Mat3MulVecfl(mat, plane);
+		}
 	}
 	else if(ob && (ob->flag & OB_POSEMODE))
 	{
+		bArmature *arm= ob->data;
+		bPoseChannel *pchan;
+		int totsel;
+		
+		totsel = count_bone_select(arm, &arm->bonebase, 1);
+		if(totsel) {
+			float imat[3][3], mat[3][3];
+
+			/* use channels to get stats */
+			for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+				if (pchan->bone && pchan->bone->flag & BONE_TRANSFORM) {
+					VecAddf(normal, normal, pchan->pose_mat[2]);
+					VecAddf(plane, plane, pchan->pose_mat[1]);
+				}
+			}
+			VecMulf(plane, -1.0);
+			
+			/* we need the transpose of the inverse for a normal... */
+			Mat3CpyMat4(imat, ob->obmat);
+			
+			Mat3Inv(mat, imat);
+			Mat3Transp(mat);
+			Mat3MulVecfl(mat, normal);
+			Mat3MulVecfl(mat, plane);
+			
+			result = ORIENTATION_EDGE;
+		}
 	}
 	else if(G.f & (G_VERTEXPAINT + G_TEXTUREPAINT + G_WEIGHTPAINT + G_SCULPTMODE))
 	{





More information about the Bf-blender-cvs mailing list