[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58620] trunk/blender/source/blender: fix [#36282] Spin error with non uniform scale

Campbell Barton ideasman42 at gmail.com
Fri Jul 26 13:15:23 CEST 2013


Revision: 58620
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58620
Author:   campbellbarton
Date:     2013-07-26 11:15:22 +0000 (Fri, 26 Jul 2013)
Log Message:
-----------
fix [#36282] Spin error with non uniform scale
add support for passing object matrix to bmesh transform operators.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_math_matrix.h
    trunk/blender/source/blender/blenlib/intern/math_matrix.c
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/operators/bmo_dupe.c
    trunk/blender/source/blender/bmesh/operators/bmo_utils.c
    trunk/blender/source/blender/editors/mesh/editmesh_extrude.c

Modified: trunk/blender/source/blender/blenlib/BLI_math_matrix.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_matrix.h	2013-07-26 10:43:23 UTC (rev 58619)
+++ trunk/blender/source/blender/blenlib/BLI_math_matrix.h	2013-07-26 11:15:22 UTC (rev 58620)
@@ -133,12 +133,12 @@
 void orthogonalize_m3(float R[3][3], int axis);
 void orthogonalize_m4(float R[4][4], int axis);
 
-int is_orthogonal_m3(float mat[3][3]);
-int is_orthogonal_m4(float mat[4][4]);
-int is_orthonormal_m3(float mat[3][3]);
-int is_orthonormal_m4(float mat[4][4]);
+bool is_orthogonal_m3(float mat[3][3]);
+bool is_orthogonal_m4(float mat[4][4]);
+bool is_orthonormal_m3(float mat[3][3]);
+bool is_orthonormal_m4(float mat[4][4]);
 
-int is_uniform_scaled_m3(float mat[3][3]);
+bool is_uniform_scaled_m3(float mat[3][3]);
 
 void adjoint_m2_m2(float R[2][2], float A[2][2]);
 void adjoint_m3_m3(float R[3][3], float A[3][3]);
@@ -194,9 +194,12 @@
 void blend_m3_m3m3(float R[3][3], float A[3][3], float B[3][3], const float t);
 void blend_m4_m4m4(float R[4][4], float A[4][4], float B[4][4], const float t);
 
-int is_negative_m3(float mat[3][3]);
-int is_negative_m4(float mat[4][4]);
+bool is_negative_m3(float mat[3][3]);
+bool is_negative_m4(float mat[4][4]);
 
+bool is_zero_m3(float mat[3][3]);
+bool is_zero_m4(float mat[4][4]);
+
 /*********************************** Other ***********************************/
 
 void print_m3(const char *str, float M[3][3]);

Modified: trunk/blender/source/blender/blenlib/intern/math_matrix.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_matrix.c	2013-07-26 10:43:23 UTC (rev 58619)
+++ trunk/blender/source/blender/blenlib/intern/math_matrix.c	2013-07-26 11:15:22 UTC (rev 58620)
@@ -930,7 +930,7 @@
 	mul_v3_fl(mat[2], size[2]);
 }
 
-int is_orthogonal_m3(float m[3][3])
+bool is_orthogonal_m3(float m[3][3])
 {
 	int i, j;
 
@@ -944,7 +944,7 @@
 	return 1;
 }
 
-int is_orthogonal_m4(float m[4][4])
+bool is_orthogonal_m4(float m[4][4])
 {
 	int i, j;
 
@@ -959,7 +959,7 @@
 	return 1;
 }
 
-int is_orthonormal_m3(float m[3][3])
+bool is_orthonormal_m3(float m[3][3])
 {
 	if (is_orthogonal_m3(m)) {
 		int i;
@@ -974,7 +974,7 @@
 	return 0;
 }
 
-int is_orthonormal_m4(float m[4][4])
+bool is_orthonormal_m4(float m[4][4])
 {
 	if (is_orthogonal_m4(m)) {
 		int i;
@@ -989,7 +989,7 @@
 	return 0;
 }
 
-int is_uniform_scaled_m3(float m[3][3])
+bool is_uniform_scaled_m3(float m[3][3])
 {
 	const float eps = 1e-7;
 	float t[3][3];
@@ -1434,20 +1434,34 @@
 	loc_quat_size_to_mat4(out, floc, fquat, fsize);
 }
 
-int is_negative_m3(float mat[3][3])
+bool is_negative_m3(float mat[3][3])
 {
 	float vec[3];
 	cross_v3_v3v3(vec, mat[0], mat[1]);
 	return (dot_v3v3(vec, mat[2]) < 0.0f);
 }
 
-int is_negative_m4(float mat[4][4])
+bool is_negative_m4(float mat[4][4])
 {
 	float vec[3];
 	cross_v3_v3v3(vec, mat[0], mat[1]);
 	return (dot_v3v3(vec, mat[2]) < 0.0f);
 }
 
+bool is_zero_m3(float mat[3][3])
+{
+	return (is_zero_v3(mat[0]) &&
+	        is_zero_v3(mat[1]) &&
+	        is_zero_v3(mat[2]));
+}
+bool is_zero_m4(float mat[4][4])
+{
+	return (is_zero_v4(mat[0]) &&
+	        is_zero_v4(mat[1]) &&
+	        is_zero_v4(mat[2]) &&
+	        is_zero_v4(mat[3]));
+}
+
 /* make a 4x4 matrix out of 3 transform components */
 /* matrices are made in the order: scale * rot * loc */
 /* TODO: need to have a version that allows for rotation order... */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-07-26 10:43:23 UTC (rev 58619)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-07-26 11:15:22 UTC (rev 58620)
@@ -663,6 +663,7 @@
 	{{"cent",            BMO_OP_SLOT_VEC},  /* center of rotation */
 	 {"matrix",          BMO_OP_SLOT_MAT},  /* matrix defining rotation */
 	 {"verts",           BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},  /* input vertices */
+	 {"space",           BMO_OP_SLOT_MAT},  /* matrix to define the space (typically object matrix) */
 	 {{'\0'}},
 	},
 	{{{'\0'}}},  /* no output */
@@ -679,6 +680,7 @@
 	"translate",
 	/* slots_in */
 	{{"vec", BMO_OP_SLOT_VEC},  /* translation offset */
+	 {"space", BMO_OP_SLOT_MAT},  /* matrix to define the space (typically object matrix) */
 	 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},  /* input vertices */
 	 {{'\0'}},
 	},
@@ -696,6 +698,7 @@
 	"scale",
 	/* slots_in */
 	{{"vec", BMO_OP_SLOT_VEC},  /* scale factor */
+	 {"space", BMO_OP_SLOT_MAT},  /* matrix to define the space (typically object matrix) */
 	 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},  /* input vertices */
 	 {{'\0'}},
 	},
@@ -715,6 +718,7 @@
 	"transform",
 	/* slots_in */
 	{{"matrix",          BMO_OP_SLOT_MAT},  /* transform matrix */
+	 {"space",           BMO_OP_SLOT_MAT},  /* matrix to define the space (typically object matrix) */
 	 {"verts",           BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},  /* input vertices */
 	 {{'\0'}},
 	},
@@ -1159,6 +1163,7 @@
 	 {"axis", BMO_OP_SLOT_VEC},             /* rotation axis */
 	 {"dvec", BMO_OP_SLOT_VEC},             /* translation delta per step */
 	 {"angle", BMO_OP_SLOT_FLT},            /* total rotation angle (radians) */
+	 {"space", BMO_OP_SLOT_MAT},            /* matrix to define the space (typically object matrix) */
 	 {"steps", BMO_OP_SLOT_INT},            /* number of steps */
 	 {"use_duplicate", BMO_OP_SLOT_BOOL},   /* duplicate or extrude? */
 	 {{'\0'}},

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dupe.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dupe.c	2013-07-26 10:43:23 UTC (rev 58619)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dupe.c	2013-07-26 11:15:22 UTC (rev 58620)
@@ -489,8 +489,8 @@
 			BMO_op_initf(bm, &dupop, op->flag, "duplicate geom=%S", op, "geom_last.out");
 			BMO_op_exec(bm, &dupop);
 			BMO_op_callf(bm, op->flag,
-			             "rotate cent=%v matrix=%m3 verts=%S",
-			             cent, rmat, &dupop, "geom.out");
+			             "rotate cent=%v matrix=%m3 space=%s verts=%S",
+			             cent, rmat, op, "space", &dupop, "geom.out");
 			BMO_slot_copy(&dupop, slots_out, "geom.out",
 			              op,     slots_out, "geom_last.out");
 			BMO_op_finish(bm, &dupop);
@@ -500,8 +500,8 @@
 			             op, "geom_last.out");
 			BMO_op_exec(bm, &extop);
 			BMO_op_callf(bm, op->flag,
-			             "rotate cent=%v matrix=%m3 verts=%S",
-			             cent, rmat, &extop, "geom.out");
+			             "rotate cent=%v matrix=%m3 space=%s verts=%S",
+			             cent, rmat, op, "space", &extop, "geom.out");
 			BMO_slot_copy(&extop, slots_out, "geom.out",
 			              op,     slots_out, "geom_last.out");
 			BMO_op_finish(bm, &extop);
@@ -510,8 +510,8 @@
 		if (usedvec) {
 			mul_m3_v3(rmat, dvec);
 			BMO_op_callf(bm, op->flag,
-			             "translate vec=%v verts=%S",
-			             dvec, op, "geom_last.out");
+			             "translate vec=%v space=%s verts=%S",
+			             dvec, op, "space", op, "geom_last.out");
 		}
 	}
 }

Modified: trunk/blender/source/blender/bmesh/operators/bmo_utils.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2013-07-26 10:43:23 UTC (rev 58619)
+++ trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2013-07-26 11:15:22 UTC (rev 58620)
@@ -55,10 +55,16 @@
 {
 	BMOIter iter;
 	BMVert *v;
-	float mat[4][4];
+	float mat[4][4], mat_space[4][4], imat_space[4][4];
 
 	BMO_slot_mat4_get(op->slots_in, "matrix", mat);
+	BMO_slot_mat4_get(op->slots_in, "space", mat_space);
 
+	if (!is_zero_m4(mat_space)) {
+		invert_m4_m4(imat_space, mat_space);
+		mul_serie_m4(mat, imat_space, mat, mat_space, NULL, NULL, NULL, NULL, NULL);
+	}
+
 	BMO_ITER (v, &iter, op->slots_in, "verts", BM_VERT) {
 		mul_m4_v3(mat, v->co);
 	}
@@ -73,7 +79,7 @@
 	unit_m4(mat);
 	copy_v3_v3(mat[3], vec);
 
-	BMO_op_callf(bm, op->flag, "transform matrix=%m4 verts=%s", mat, op, "verts");
+	BMO_op_callf(bm, op->flag, "transform matrix=%m4 space=%s verts=%s", mat, op, "space", op, "verts");
 }
 
 void bmo_scale_exec(BMesh *bm, BMOperator *op)
@@ -87,7 +93,7 @@
 	mat[1][1] = vec[1];
 	mat[2][2] = vec[2];
 
-	BMO_op_callf(bm, op->flag, "transform matrix=%m3 verts=%s", mat, op, "verts");
+	BMO_op_callf(bm, op->flag, "transform matrix=%m3 space=%s verts=%s", mat, op, "space", op, "verts");
 }
 
 void bmo_rotate_exec(BMesh *bm, BMOperator *op)
@@ -99,7 +105,7 @@
 	BMO_slot_mat4_get(op->slots_in, "matrix", mat);
 	pivot_m4(mat, center);
 
-	BMO_op_callf(bm, op->flag, "transform matrix=%m4 verts=%s", mat, op, "verts");
+	BMO_op_callf(bm, op->flag, "transform matrix=%m4 space=%s verts=%s", mat, op, "space", op, "verts");
 }
 
 void bmo_reverse_faces_exec(BMesh *bm, BMOperator *op)

Modified: trunk/blender/source/blender/editors/mesh/editmesh_extrude.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_extrude.c	2013-07-26 10:43:23 UTC (rev 58619)
+++ trunk/blender/source/blender/editors/mesh/editmesh_extrude.c	2013-07-26 11:15:22 UTC (rev 58620)
@@ -713,7 +713,7 @@
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
 	BMesh *bm = em->bm;
 	BMOperator spinop;
-	float cent[3], axis[3], imat[3][3];
+	float cent[3], axis[3];
 	float d[3] = {0.0f, 0.0f, 0.0f};
 	int steps, dupli;
 	float angle;
@@ -726,15 +726,10 @@
 	angle = -angle;
 	dupli = RNA_boolean_get(op->ptr, "dupli");
 
-	/* undo object transformation */
-	copy_m3_m4(imat, obedit->imat);
-	sub_v3_v3(cent, obedit->obmat[3]);
-	mul_m3_v3(imat, cent);
-	mul_m3_v3(imat, axis);
-
+	/* keep the values in worldspace since we're passing the obmat */
 	if (!EDBM_op_init(em, &spinop, op,
-	                  "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%i angle=%f use_duplicate=%b",
-	                  BM_ELEM_SELECT, cent, axis, d, steps, angle, dupli))
+	                  "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%i angle=%f space=%m4 use_duplicate=%b",
+	                  BM_ELEM_SELECT, cent, axis, d, steps, angle, obedit->obmat, dupli))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -800,8 +795,7 @@
 	BMVert *eve, *v1, *v2;
 	BMIter iter, eiter;
 	BMOperator spinop;
-	float dvec[3], nor[3], cent[3], axis[3];
-	float imat[3][3];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list