[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