[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57259] trunk/blender/source/blender/bmesh : fix issue with new bridge tool interpolation [#35636]

Campbell Barton ideasman42 at gmail.com
Wed Jun 5 23:31:02 CEST 2013


Revision: 57259
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57259
Author:   campbellbarton
Date:     2013-06-05 21:31:01 +0000 (Wed, 05 Jun 2013)
Log Message:
-----------
fix issue with new bridge tool interpolation [#35636]

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c
    trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c	2013-06-05 20:10:15 UTC (rev 57258)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c	2013-06-05 21:31:01 UTC (rev 57259)
@@ -47,8 +47,8 @@
 } BMEdgeLoopStore;
 
 #define BM_EDGELOOP_IS_CLOSED (1 << 0)
+#define EDGELOOP_EPS 0.00001f
 
-
 /* -------------------------------------------------------------------- */
 /* BM_mesh_edgeloops_find & Util Functions  */
 
@@ -580,7 +580,7 @@
 
 }
 
-void BM_edgeloop_calc_normal(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store)
+bool BM_edgeloop_calc_normal(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store)
 {
 	LinkData *node_curr = el_store->verts.first;
 	float const *v_prev = NODE_AS_CO(el_store->verts.last);
@@ -601,9 +601,14 @@
 		}
 	} while (true);
 
-	if (UNLIKELY(normalize_v3(el_store->no) == 0.0f)) {
+	if (UNLIKELY(normalize_v3(el_store->no) < EDGELOOP_EPS)) {
 		el_store->no[2] = 1.0f; /* other axis set to 0.0 */
+		return false;
+
 	}
+	else {
+		return true;
+	}
 }
 
 /**
@@ -612,7 +617,7 @@
  *
  * Instead use an alignment vector and calculate the normal based on that.
  */
-void BM_edgeloop_calc_normal_aligned(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store, const float no_align[3])
+bool BM_edgeloop_calc_normal_aligned(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store, const float no_align[3])
 {
 	LinkData *node_curr = el_store->verts.first;
 	float const *v_prev = NODE_AS_CO(el_store->verts.last);
@@ -637,9 +642,13 @@
 		}
 	} while (true);
 
-	if (UNLIKELY(normalize_v3(el_store->no) == 0.0f)) {
+	if (UNLIKELY(normalize_v3(el_store->no) < EDGELOOP_EPS)) {
 		el_store->no[2] = 1.0f; /* other axis set to 0.0 */
+		return false;
 	}
+	else {
+		return true;
+	}
 }
 
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h	2013-06-05 20:10:15 UTC (rev 57258)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h	2013-06-05 21:31:01 UTC (rev 57259)
@@ -58,8 +58,8 @@
 const float        *BM_edgeloop_center_get(struct BMEdgeLoopStore *el_store);
 void                BM_edgeloop_edges_get(struct BMEdgeLoopStore *el_store, BMEdge **e_arr);
 void                BM_edgeloop_calc_center(BMesh *bm, struct BMEdgeLoopStore *el_store);
-void                BM_edgeloop_calc_normal(BMesh *bm, struct BMEdgeLoopStore *el_store);
-void                BM_edgeloop_calc_normal_aligned(BMesh *bm, struct BMEdgeLoopStore *el_store,
+bool                BM_edgeloop_calc_normal(BMesh *bm, struct BMEdgeLoopStore *el_store);
+bool                BM_edgeloop_calc_normal_aligned(BMesh *bm, struct BMEdgeLoopStore *el_store,
                                                     const float no_align[3]);
 void                BM_edgeloop_flip(BMesh *bm, struct BMEdgeLoopStore *el_store);
 void                BM_edgeloop_expand(BMesh *bm, struct BMEdgeLoopStore *el_store, int el_store_len);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c	2013-06-05 20:10:15 UTC (rev 57258)
+++ trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c	2013-06-05 21:31:01 UTC (rev 57259)
@@ -547,6 +547,7 @@
 {
 	const int resolu = cuts + 2;
 	const int dims = 3;
+	bool is_a_no_valid, is_b_no_valid;
 	int i;
 
 	float el_store_a_co[3], el_store_b_co[3];
@@ -559,21 +560,31 @@
 	BM_edgeloop_calc_center(bm, el_store_a);
 	BM_edgeloop_calc_center(bm, el_store_b);
 
-	BM_edgeloop_calc_normal(bm, el_store_a);
-	BM_edgeloop_calc_normal(bm, el_store_b);
+	is_a_no_valid = BM_edgeloop_calc_normal(bm, el_store_a);
+	is_b_no_valid = BM_edgeloop_calc_normal(bm, el_store_b);
 
 	copy_v3_v3(el_store_a_co, BM_edgeloop_center_get(el_store_a));
 	copy_v3_v3(el_store_b_co, BM_edgeloop_center_get(el_store_b));
 
-	copy_v3_v3(el_store_a_no, BM_edgeloop_normal_get(el_store_a));
-	copy_v3_v3(el_store_b_no, BM_edgeloop_normal_get(el_store_b));
-
 	/* correct normals need to be flipped to face each other
 	 * we know both normals point in the same direction so one will need flipping */
 	{
 		float el_dir[3];
+		float no[3];
 		sub_v3_v3v3(el_dir, el_store_a_co, el_store_b_co);
+		normalize_v3_v3(no, el_dir);
 
+		if (is_a_no_valid == false) {
+			is_a_no_valid = BM_edgeloop_calc_normal_aligned(bm, el_store_a, no);
+		}
+		if (is_b_no_valid == false) {
+			is_b_no_valid = BM_edgeloop_calc_normal_aligned(bm, el_store_b, no);
+		}
+		(void)is_a_no_valid, (void)is_b_no_valid;
+
+		copy_v3_v3(el_store_a_no, BM_edgeloop_normal_get(el_store_a));
+		copy_v3_v3(el_store_b_no, BM_edgeloop_normal_get(el_store_b));
+
 		if (dot_v3v3(el_store_a_no, el_dir) > 0.0f) {
 			negate_v3(el_store_a_no);
 		}




More information about the Bf-blender-cvs mailing list