[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58615] trunk/blender/source/blender: optimization: call one bmesh operator for rotate (not 3).

Campbell Barton ideasman42 at gmail.com
Fri Jul 26 08:12:50 CEST 2013


Revision: 58615
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58615
Author:   campbellbarton
Date:     2013-07-26 06:12:49 +0000 (Fri, 26 Jul 2013)
Log Message:
-----------
optimization: call one bmesh operator for rotate (not 3).
added pivot_m4() utility function since rotating about an arbitrary point is handy.

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/operators/bmo_utils.c

Modified: trunk/blender/source/blender/blenlib/BLI_math_matrix.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_matrix.h	2013-07-26 05:08:24 UTC (rev 58614)
+++ trunk/blender/source/blender/blenlib/BLI_math_matrix.h	2013-07-26 06:12:49 UTC (rev 58615)
@@ -175,8 +175,8 @@
 void translate_m4(float mat[4][4], float tx, float ty, float tz);
 void rotate_m4(float mat[4][4], const char axis, const float angle);
 void rotate_m2(float mat[2][2], const float angle);
+void pivot_m4(float mat[4][4], const float pivot[3]);
 
-
 void mat3_to_rot_size(float rot[3][3], float size[3], float mat3[3][3]);
 void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[4][4]);
 void mat4_to_loc_quat(float loc[3], float quat[4], float wmat[4][4]);

Modified: trunk/blender/source/blender/blenlib/intern/math_matrix.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_matrix.c	2013-07-26 05:08:24 UTC (rev 58614)
+++ trunk/blender/source/blender/blenlib/intern/math_matrix.c	2013-07-26 06:12:49 UTC (rev 58615)
@@ -1374,6 +1374,21 @@
 	mat[1][0] = -mat[0][1];
 }
 
+/* scale or rotate around a non zero pivot */
+void pivot_m4(float mat[4][4], const float pivot[3])
+{
+	float tmat[4][4];
+
+	unit_m4(tmat);
+
+	copy_v3_v3(tmat[3], pivot);
+	mul_m4_m4m4(mat, tmat, mat);
+
+	/* invert the matrix */
+	negate_v3(tmat[3]);
+	mul_m4_m4m4(mat, mat, tmat);
+}
+
 void blend_m3_m3m3(float out[3][3], float dst[3][3], float src[3][3], const float srcweight)
 {
 	float srot[3][3], drot[3][3];

Modified: trunk/blender/source/blender/bmesh/operators/bmo_utils.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2013-07-26 05:08:24 UTC (rev 58614)
+++ trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2013-07-26 06:12:49 UTC (rev 58615)
@@ -92,20 +92,14 @@
 
 void bmo_rotate_exec(BMesh *bm, BMOperator *op)
 {
-	float vec[3];
-	
-	BMO_slot_vec_get(op->slots_in, "cent", vec);
-	
-	/* there has to be a proper matrix way to do this, but
-	 * this is how editmesh did it and I'm too tired to think
-	 * through the math right now. */
-	mul_v3_fl(vec, -1.0f);
-	BMO_op_callf(bm, op->flag, "translate verts=%s vec=%v", op, "verts", vec);
+	float center[3];
+	float mat[4][4];
 
-	BMO_op_callf(bm, op->flag, "transform matrix=%s verts=%s", op, "matrix", op, "verts");
+	BMO_slot_vec_get(op->slots_in, "cent", center);
+	BMO_slot_mat4_get(op->slots_in, "matrix", mat);
+	pivot_m4(mat, center);
 
-	mul_v3_fl(vec, -1.0f);
-	BMO_op_callf(bm, op->flag, "translate verts=%s vec=%v", op, "verts", vec);
+	BMO_op_callf(bm, op->flag, "transform matrix=%m4 verts=%s", mat, op, "verts");
 }
 
 void bmo_reverse_faces_exec(BMesh *bm, BMOperator *op)




More information about the Bf-blender-cvs mailing list