[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58597] trunk/blender/source/blender: adjust createSpaceNormalTangent so it can take values from a matrix without having to negate the plane first .

Campbell Barton ideasman42 at gmail.com
Thu Jul 25 14:07:55 CEST 2013


Revision: 58597
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58597
Author:   campbellbarton
Date:     2013-07-25 12:07:55 +0000 (Thu, 25 Jul 2013)
Log Message:
-----------
adjust createSpaceNormalTangent so it can take values from a matrix without having to negate the plane first.
also add ED_armature_ebone_to_mat3/4 since there were quite a few places that did this inline.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/armature/armature_edit.c
    trunk/blender/source/blender/editors/armature/armature_relations.c
    trunk/blender/source/blender/editors/armature/armature_utils.c
    trunk/blender/source/blender/editors/include/ED_armature.h
    trunk/blender/source/blender/editors/space_view3d/drawarmature.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_orientations.c
    trunk/blender/source/blender/makesrna/intern/rna_armature.c

Modified: trunk/blender/source/blender/editors/armature/armature_edit.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_edit.c	2013-07-25 11:05:08 UTC (rev 58596)
+++ trunk/blender/source/blender/editors/armature/armature_edit.c	2013-07-25 12:07:55 UTC (rev 58597)
@@ -78,11 +78,10 @@
 	
 	/* Do the rotations */
 	for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
-		float delta[3], tmat[3][3];
+		float tmat[3][3];
 		
 		/* find the current bone's roll matrix */
-		sub_v3_v3v3(delta, ebone->tail, ebone->head);
-		vec_roll_to_mat3(delta, ebone->roll, tmat);
+		ED_armature_ebone_to_mat3(ebone, tmat);
 		
 		/* transform the roll matrix */
 		mul_m3_m3m3(tmat, mat3, tmat);
@@ -282,15 +281,14 @@
 			mul_m3_v3(imat, vec);
 		}
 		else if (type == CALC_ROLL_ACTIVE) {
-			float mat[3][3], nor[3];
+			float mat[3][3];
 			ebone = (EditBone *)arm->act_edbone;
 			if (ebone == NULL) {
 				BKE_report(op->reports, RPT_ERROR, "No active bone set");
 				return OPERATOR_CANCELLED;
 			}
 			
-			sub_v3_v3v3(nor, ebone->tail, ebone->head);
-			vec_roll_to_mat3(nor, ebone->roll, mat);
+			ED_armature_ebone_to_mat3(ebone, mat);
 			copy_v3_v3(vec, mat[2]);
 		}
 		else { /* Axis */

Modified: trunk/blender/source/blender/editors/armature/armature_relations.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_relations.c	2013-07-25 11:05:08 UTC (rev 58596)
+++ trunk/blender/source/blender/editors/armature/armature_relations.c	2013-07-25 12:07:55 UTC (rev 58597)
@@ -242,21 +242,18 @@
 					float difmat[4][4];
 					float imat[4][4];
 					float temp[3][3];
-					float delta[3];
 					
 					/* Get the premat */
-					sub_v3_v3v3(delta, curbone->tail, curbone->head);
-					vec_roll_to_mat3(delta, curbone->roll, temp);
+					ED_armature_ebone_to_mat3(curbone, temp);
 					
-					unit_m4(premat); /* Mat4MulMat34 only sets 3x3 part */
+					unit_m4(premat); /* mul_m4_m3m4 only sets 3x3 part */
 					mul_m4_m3m4(premat, temp, mat);
 					
 					mul_m4_v3(mat, curbone->head);
 					mul_m4_v3(mat, curbone->tail);
 					
 					/* Get the postmat */
-					sub_v3_v3v3(delta, curbone->tail, curbone->head);
-					vec_roll_to_mat3(delta, curbone->roll, temp);
+					ED_armature_ebone_to_mat3(curbone, temp);
 					copy_m4_m3(postmat, temp);
 					
 					/* Find the roll */

Modified: trunk/blender/source/blender/editors/armature/armature_utils.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_utils.c	2013-07-25 11:05:08 UTC (rev 58596)
+++ trunk/blender/source/blender/editors/armature/armature_utils.c	2013-07-25 12:07:55 UTC (rev 58597)
@@ -156,6 +156,25 @@
 	return false;
 }
 
+void ED_armature_ebone_to_mat3(EditBone *ebone, float mat[3][3])
+{
+	float delta[3];
+
+	/* Find the current bone matrix */
+	sub_v3_v3v3(delta, ebone->tail, ebone->head);
+	vec_roll_to_mat3(delta, ebone->roll, mat);
+}
+
+void ED_armature_ebone_to_mat4(EditBone *ebone, float mat[4][4])
+{
+	float m3[3][3];
+
+	ED_armature_ebone_to_mat3(ebone, m3);
+
+	copy_m4_m3(mat, m3);
+	copy_v3_v3(mat[3], ebone->head);
+}
+
 /* *************************************************************** */
 /* Mirroring */
 
@@ -389,7 +408,6 @@
 	float postmat[3][3];
 	float difmat[3][3];
 	float imat[3][3];
-	float delta[3];
 	
 	for (curBone = bonelist->first; curBone; curBone = curBone->next) {
 		/* sets local matrix and arm_mat (restpos) */
@@ -402,8 +420,7 @@
 		
 		if (ebone) {
 			/* Get the ebone premat */
-			sub_v3_v3v3(delta, ebone->tail, ebone->head);
-			vec_roll_to_mat3(delta, ebone->roll, premat);
+			ED_armature_ebone_to_mat3(ebone, premat);
 			
 			/* Get the bone postmat */
 			copy_m3_m4(postmat, curBone->arm_mat);
@@ -503,11 +520,9 @@
 			{
 				float M_parentRest[3][3];
 				float iM_parentRest[3][3];
-				float delta[3];
 				
 				/* Get the parent's  matrix (rotation only) */
-				sub_v3_v3v3(delta, eBone->parent->tail, eBone->parent->head);
-				vec_roll_to_mat3(delta, eBone->parent->roll, M_parentRest);
+				ED_armature_ebone_to_mat3(eBone->parent, M_parentRest);
 				
 				/* Invert the parent matrix */
 				invert_m3_m3(iM_parentRest, M_parentRest);

Modified: trunk/blender/source/blender/editors/include/ED_armature.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_armature.h	2013-07-25 11:05:08 UTC (rev 58596)
+++ trunk/blender/source/blender/editors/include/ED_armature.h	2013-07-25 12:07:55 UTC (rev 58597)
@@ -135,8 +135,12 @@
 void add_primitive_bone(struct Object *obedit_arm, bool view_aligned);
 struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, const char *name);
 void ED_armature_edit_bone_remove(struct bArmature *arm, EditBone *exBone);
+
 bool ED_armature_ebone_is_child_recursive(EditBone *ebone_parent, EditBone *ebone_child);
 
+void ED_armature_ebone_to_mat3(EditBone *ebone, float mat[3][3]);
+void ED_armature_ebone_to_mat4(EditBone *ebone, float mat[4][4]);
+
 void transform_armature_mirror_update(struct Object *obedit);
 void ED_armature_origin_set(struct Scene *scene, struct Object *ob, float cursor[3], int centermode, int around);
 

Modified: trunk/blender/source/blender/editors/space_view3d/drawarmature.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawarmature.c	2013-07-25 11:05:08 UTC (rev 58596)
+++ trunk/blender/source/blender/editors/space_view3d/drawarmature.c	2013-07-25 12:07:55 UTC (rev 58597)
@@ -2060,20 +2060,10 @@
 }
 
 /* in editmode, we don't store the bone matrix... */
-static void get_matrix_editbone(EditBone *eBone, float bmat[4][4])
+static void get_matrix_editbone(EditBone *ebone, float bmat[4][4])
 {
-	float delta[3];
-	float mat[3][3];
-	
-	/* Compose the parent transforms (i.e. their translations) */
-	sub_v3_v3v3(delta, eBone->tail, eBone->head);
-	
-	eBone->length = (float)sqrt(delta[0] * delta[0] + delta[1] * delta[1] + delta[2] * delta[2]);
-	
-	vec_roll_to_mat3(delta, eBone->roll, mat);
-	copy_m4_m3(bmat, mat);
-
-	add_v3_v3(bmat[3], eBone->head);
+	ebone->length = len_v3v3(ebone->tail, ebone->head);
+	ED_armature_ebone_to_mat4(ebone, bmat);
 }
 
 static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, const short dt)

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-07-25 11:05:08 UTC (rev 58596)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-07-25 12:07:55 UTC (rev 58597)
@@ -1047,7 +1047,7 @@
 	bArmature *arm = t->obedit->data;
 	ListBase *edbo = arm->edbo;
 	TransData *td;
-	float mtx[3][3], smtx[3][3], delta[3], bonemat[3][3];
+	float mtx[3][3], smtx[3][3], bonemat[3][3];
 	
 	/* special hack for envelope drawmode and scaling:
 	 *  to allow scaling the size of the envelope around single points,
@@ -1139,8 +1139,7 @@
 					td->flag = TD_SELECTED;
 
 					/* use local bone matrix */
-					sub_v3_v3v3(delta, ebo->tail, ebo->head);
-					vec_roll_to_mat3(delta, ebo->roll, bonemat);
+					ED_armature_ebone_to_mat3(ebo, bonemat);
 					mul_m3_m3m3(td->mtx, mtx, bonemat);
 					invert_m3_m3(td->smtx, td->mtx);
 
@@ -1180,8 +1179,7 @@
 					copy_m3_m3(td->smtx, smtx);
 					copy_m3_m3(td->mtx, mtx);
 
-					sub_v3_v3v3(delta, ebo->tail, ebo->head);
-					vec_roll_to_mat3(delta, ebo->roll, td->axismtx);
+					ED_armature_ebone_to_mat3(ebo, td->axismtx);
 
 					if ((ebo->flag & BONE_ROOTSEL) == 0) {
 						td->extra = ebo;
@@ -1204,8 +1202,7 @@
 					copy_m3_m3(td->smtx, smtx);
 					copy_m3_m3(td->mtx, mtx);
 
-					sub_v3_v3v3(delta, ebo->tail, ebo->head);
-					vec_roll_to_mat3(delta, ebo->roll, td->axismtx);
+					ED_armature_ebone_to_mat3(ebo, td->axismtx);
 
 					td->extra = ebo; /* to fix roll */
 

Modified: trunk/blender/source/blender/editors/transform/transform_orientations.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_orientations.c	2013-07-25 11:05:08 UTC (rev 58596)
+++ trunk/blender/source/blender/editors/transform/transform_orientations.c	2013-07-25 12:07:55 UTC (rev 58597)
@@ -256,13 +256,19 @@
 	return true;
 }
 
+/**
+ * \note To recreate an orientation from the matrix:
+ * - (plane  == mat[1])
+ * - (normal == mat[2])
+ */
 bool createSpaceNormalTangent(float mat[3][3], const float normal[3], const float tangent[3])
 {
 	if (normalize_v3_v3(mat[2], normal) == 0.0f) {
 		return false;  /* error return */
 	}
 
-	copy_v3_v3(mat[1], tangent);
+	/* negate so we can use values from the matrix as input */
+	negate_v3_v3(mat[1], tangent);
 	/* preempt zero length tangent from causing trouble */
 	if (is_zero_v3(mat[1])) {
 		mat[1][2] = 1.0f;
@@ -691,6 +697,10 @@
 					result = ORIENTATION_VERT;
 				}
 			}
+
+			/* not needed but this matches 2.68 and older behavior */
+			negate_v3(plane);
+
 		} /* end editmesh */
 		else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
 			Curve *cu = obedit->data;
@@ -773,7 +783,7 @@
 
 				copy_v3_v3(normal, qmat[2]);
 
-				negate_v3_v3(plane, qmat[1]);
+				copy_v3_v3(plane, qmat[1]);
 				
 				result = ORIENTATION_FACE;
 			}
@@ -781,45 +791,33 @@
 		else if (obedit->type == OB_ARMATURE) {
 			bArmature *arm = obedit->data;
 			EditBone *ebone;
-			int ok = FALSE;
-			
-			/* grr. but better then duplicate code */
-#define EBONE_CALC_NORMAL_PLANE  { \
-			float tmat[3][3]; \
-			float vec[3]; \
-			sub_v3_v3v3(vec, ebone->tail, ebone->head); \
-			normalize_v3(vec); \
-			add_v3_v3(normal, vec); \
-			\
-			vec_roll_to_mat3(vec, ebone->roll, tmat); \
-			add_v3_v3(plane, tmat[2]); \
-		} (void)0
+			bool ok = false;
+			float tmat[3][3];
 
-
 			if (activeOnly && (ebone = arm->act_edbone)) {
-				EBONE_CALC_NORMAL_PLANE;
-				ok = TRUE;
+				ED_armature_ebone_to_mat3(ebone, tmat);
+				add_v3_v3(normal, tmat[2]);
+				add_v3_v3(plane, tmat[1]);
+				ok = true;
 			}
 			else {
 				for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
 					if (arm->layer & ebone->layer) {
 						if (ebone->flag & BONE_SELECTED) {
-							EBONE_CALC_NORMAL_PLANE;
-							ok = TRUE;
+							ED_armature_ebone_to_mat3(ebone, tmat);
+							add_v3_v3(normal, tmat[2]);
+							add_v3_v3(plane, tmat[1]);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list