[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25005] trunk/blender/source/blender/ editors/transform: Gimbal orientation defaults to Normal instead of Global when bone or object is not using euler orientation (Normal is bone axis for pose and Local axis for object, so this is more useful than defaulting to Global).

Martin Poirier theeth at yahoo.com
Sun Nov 29 19:20:27 CET 2009


Revision: 25005
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25005
Author:   theeth
Date:     2009-11-29 19:20:26 +0100 (Sun, 29 Nov 2009)

Log Message:
-----------
Gimbal orientation defaults to Normal instead of Global when bone or object is not using euler orientation (Normal is bone axis for pose and Local axis for object, so this is more useful than defaulting to Global).

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

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2009-11-29 18:14:16 UTC (rev 25004)
+++ trunk/blender/source/blender/editors/transform/transform.h	2009-11-29 18:20:26 UTC (rev 25005)
@@ -534,7 +534,7 @@
 void flushTransSeq(TransInfo *t);
 
 /*********************** exported from transform_manipulator.c ********** */
-void gimbal_axis(struct Object *ob, float gmat[][3]);
+int gimbal_axis(struct Object *ob, float gmat[][3]); /* return 0 when no gimbal for selection */
 int calc_manipulator_stats(const struct bContext *C);
 float get_drawsize(struct ARegion *ar, float *co);
 

Modified: trunk/blender/source/blender/editors/transform/transform_manipulator.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_manipulator.c	2009-11-29 18:14:16 UTC (rev 25004)
+++ trunk/blender/source/blender/editors/transform/transform_manipulator.c	2009-11-29 18:20:26 UTC (rev 25005)
@@ -182,60 +182,67 @@
 	return (ELEM(rotmode, ROT_MODE_AXISANGLE, ROT_MODE_QUAT)) ? 0:1;
 }
 
-void gimbal_axis(Object *ob, float gmat[][3])
+int gimbal_axis(Object *ob, float gmat[][3])
 {
-	if(ob->mode & OB_MODE_POSE)
-	{
-		bPoseChannel *pchan= get_active_posechannel(ob);
+	if (ob) {
+		if(ob->mode & OB_MODE_POSE)
+		{
+			bPoseChannel *pchan= get_active_posechannel(ob);
 
-		if(pchan && test_rotmode_euler(pchan->rotmode)) {
-			float mat[3][3], tmat[3][3], obmat[3][3];
+			if(pchan && test_rotmode_euler(pchan->rotmode)) {
+				float mat[3][3], tmat[3][3], obmat[3][3];
 
-			eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode);
+				eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode);
 
-			/* apply bone transformation */
-			mul_m3_m3m3(tmat, pchan->bone->bone_mat, mat);
-			
-			if (pchan->parent)
-			{
-				float parent_mat[3][3];
+				/* apply bone transformation */
+				mul_m3_m3m3(tmat, pchan->bone->bone_mat, mat);
 
-				copy_m3_m4(parent_mat, pchan->parent->pose_mat);
-				mul_m3_m3m3(mat, parent_mat, tmat);
+				if (pchan->parent)
+				{
+					float parent_mat[3][3];
 
-				/* needed if object transformation isn't identity */
-				copy_m3_m4(obmat, ob->obmat);
-				mul_m3_m3m3(gmat, obmat, mat);
+					copy_m3_m4(parent_mat, pchan->parent->pose_mat);
+					mul_m3_m3m3(mat, parent_mat, tmat);
+
+					/* needed if object transformation isn't identity */
+					copy_m3_m4(obmat, ob->obmat);
+					mul_m3_m3m3(gmat, obmat, mat);
+				}
+				else
+				{
+					/* needed if object transformation isn't identity */
+					copy_m3_m4(obmat, ob->obmat);
+					mul_m3_m3m3(gmat, obmat, tmat);
+				}
+
+				normalize_m3(gmat);
+				return 1;
 			}
-			else
-			{
-				/* needed if object transformation isn't identity */
-				copy_m3_m4(obmat, ob->obmat);
-				mul_m3_m3m3(gmat, obmat, tmat);
-			}
+		}
+		else {
+			if(test_rotmode_euler(ob->rotmode)) {
 
-			normalize_m3(gmat);
-		}
-	}
-	else {
-		if(test_rotmode_euler(ob->rotmode)) {
-			
-			
-			if (ob->parent)
-			{
-				float parent_mat[3][3], amat[3][3];
 				
-				eulO_to_gimbal_axis(amat, ob->rot, ob->rotmode);
-				copy_m3_m4(parent_mat, ob->parent->obmat);
-				normalize_m3(parent_mat);
-				mul_m3_m3m3(gmat, parent_mat, amat);
+				if (ob->parent)
+				{
+					float parent_mat[3][3], amat[3][3];
+
+					eulO_to_gimbal_axis(amat, ob->rot, ob->rotmode);
+					copy_m3_m4(parent_mat, ob->parent->obmat);
+					normalize_m3(parent_mat);
+					mul_m3_m3m3(gmat, parent_mat, amat);
+					return 1;
+				}
+				else
+				{
+					eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode);
+					return 1;
+				}
 			}
-			else
-			{
-				eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode);
-			}
 		}
 	}
+
+	return 0;
 }
 
 
@@ -481,10 +488,11 @@
 		case V3D_MANIP_GIMBAL:
 		{
 			float mat[3][3];
-			unit_m3(mat);
-			gimbal_axis(ob, mat);
-			copy_m4_m3(rv3d->twmat, mat);
-			break;
+			if (gimbal_axis(ob, mat)) {
+				copy_m4_m3(rv3d->twmat, mat);
+				break;
+			}
+			/* if not gimbal, fall through to normal */
 		}
 		case V3D_MANIP_NORMAL:
 			if(obedit || ob->mode & OB_MODE_POSE) {

Modified: trunk/blender/source/blender/editors/transform/transform_orientations.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_orientations.c	2009-11-29 18:14:16 UTC (rev 25004)
+++ trunk/blender/source/blender/editors/transform/transform_orientations.c	2009-11-29 18:20:26 UTC (rev 25005)
@@ -523,9 +523,10 @@
 
 	case V3D_MANIP_GIMBAL:
 		unit_m3(t->spacemtx);
-		if(ob)
-			gimbal_axis(ob, t->spacemtx);
-		break;
+		if (gimbal_axis(ob, t->spacemtx)) {
+			break;
+		}
+		/* no gimbal fallthrough to normal */
 	case V3D_MANIP_NORMAL:
 		if(obedit || (ob && ob->mode & OB_MODE_POSE)) {
 			strcpy(t->spacename, "normal");





More information about the Bf-blender-cvs mailing list