[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