[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58709] trunk/blender/source/blender/bmesh : bmesh optimization (noted as todo), avoid recalculating normal every time BM_face_legal_splits() runs,

Campbell Barton ideasman42 at gmail.com
Mon Jul 29 08:04:09 CEST 2013


Revision: 58709
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58709
Author:   campbellbarton
Date:     2013-07-29 06:04:09 +0000 (Mon, 29 Jul 2013)
Log Message:
-----------
bmesh optimization (noted as todo), avoid recalculating normal every time BM_face_legal_splits() runs,
assume normal is valid (assert when its not).

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
    trunk/blender/source/blender/bmesh/operators/bmo_connect_nonplanar.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2013-07-29 05:16:16 UTC (rev 58708)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2013-07-29 06:04:09 UTC (rev 58709)
@@ -1061,7 +1061,7 @@
 {
 	const int len2 = len * 2;
 	BMLoop *l;
-	float v1[2], v2[2], v3[2] /*, v4[3 */, no[3], mid[2], *p1, *p2, *p3, *p4;
+	float v1[2], v2[2], v3[2], mid[2], *p1, *p2, *p3, *p4;
 	float out[2] = {-FLT_MAX, -FLT_MAX};
 	float axis_mat[3][3];
 	float (*projverts)[2] = BLI_array_alloca(projverts, f->len);
@@ -1069,10 +1069,9 @@
 	float fac1 = 1.0000001f, fac2 = 0.9f; //9999f; //0.999f;
 	int i, j, a = 0, clen;
 
-	/* TODO, the face normal may already be correct */
-	BM_face_calc_normal(f, no);
+	BLI_assert(BM_face_is_normal_valid(f));
 
-	axis_dominant_v3_to_m3(axis_mat, no);
+	axis_dominant_v3_to_m3(axis_mat, f->no);
 
 	for (i = 0, l = BM_FACE_FIRST_LOOP(f); i < f->len; i++, l = l->next) {
 		BM_elem_index_set(l, i); /* set_loop */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-07-29 05:16:16 UTC (rev 58708)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-07-29 06:04:09 UTC (rev 58709)
@@ -1719,6 +1719,18 @@
 	return false;
 }
 
+/**
+ * Use within assert's to check normals are valid.
+ */
+bool BM_face_is_normal_valid(BMFace *f)
+{
+	const float eps = 0.0001f;
+	float no[3];
+
+	BM_face_calc_normal(f, no);
+	return len_squared_v3v3(no, f->no) < (eps * eps);
+}
+
 static void bm_mesh_calc_volume_face(BMFace *f, float *r_vol)
 {
 	int tottri = f->len - 2;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2013-07-29 05:16:16 UTC (rev 58708)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2013-07-29 06:04:09 UTC (rev 58709)
@@ -116,6 +116,8 @@
 bool BM_face_is_any_vert_flag_test(BMFace *f, const char hflag);
 bool BM_face_is_any_edge_flag_test(BMFace *f, const char hflag);
 
+bool BM_face_is_normal_valid(BMFace *f);
+
 float BM_mesh_calc_volume(BMesh *bm, bool is_signed);
 
 int   BM_mesh_calc_face_groups(BMesh *bm, int *r_groups_array, int (**r_group_index)[2],

Modified: trunk/blender/source/blender/bmesh/operators/bmo_connect_nonplanar.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_connect_nonplanar.c	2013-07-29 05:16:16 UTC (rev 58708)
+++ trunk/blender/source/blender/bmesh/operators/bmo_connect_nonplanar.c	2013-07-29 06:04:09 UTC (rev 58709)
@@ -214,6 +214,7 @@
 		if (bm_face_split_by_angle(bm, f, f_pair, angle_limit)) {
 			int j;
 			for (j = 0; j < 2; j++) {
+				BM_face_normal_update(f_pair[j]);
 				if (f_pair[j]->len > 3) {
 					STACK_PUSH(fstack, f_pair[j]);
 				}




More information about the Bf-blender-cvs mailing list