[Bf-blender-cvs] [e27bacaa437] soc-2017-sculpting_improvements: Fix mini crasher, last commit before mayor rework of the edgering detection/sort.
Sebastian Witt
noreply at git.blender.org
Tue Aug 22 18:04:53 CEST 2017
Commit: e27bacaa4377c4a40ea741542d5861caaccdf421
Author: Sebastian Witt
Date: Tue Aug 22 18:03:51 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rBe27bacaa4377c4a40ea741542d5861caaccdf421
Fix mini crasher, last commit before mayor rework of the edgering detection/sort.
===================================================================
M source/blender/editors/sculpt_paint/sculpt.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 98f71b94cfe..4ce2a8b1e9d 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -7295,7 +7295,7 @@ static void do_calc_sil_intersect_task_cb_ex(void *userdata, void *UNUSED(userda
BLI_array_grow_items(int_points, 3);
interp_v3_v3v3(&int_points[BLI_array_count(int_points) - 3], p1, p2, t_lambda);
#ifdef DEBUG_DRAW
- if(t_lambda > 0.999999f || t_lambda < 0.000001f) {
+ /*if(t_lambda > 0.999999f || t_lambda < 0.000001f) {
bl_debug_color_set(0xff3333);
} else {
bl_debug_color_set(0x0000ff);
@@ -7303,7 +7303,7 @@ static void do_calc_sil_intersect_task_cb_ex(void *userdata, void *UNUSED(userda
bl_debug_draw_point(&int_points[BLI_array_count(int_points) - 3], 0.05f);
bl_debug_color_set(0x000000);
bl_debug_draw_edge_add(p1, p2);
- bl_debug_color_set(0x000000);
+ bl_debug_color_set(0x000000);*/
#endif
break;
}
@@ -7318,15 +7318,14 @@ static void do_calc_sil_intersect_task_cb_ex(void *userdata, void *UNUSED(userda
BLI_array_grow_items(int_points, 3);
interp_v3_v3v3(&int_points[BLI_array_count(int_points) - 3], p1, p2, t_lambda);
#ifdef DEBUG_DRAW
- if(t_lambda > 0.999999f || t_lambda < 0.000001f) {
+ /*if(t_lambda > 0.999999f || t_lambda < 0.000001f) {
bl_debug_color_set(0xff3333);
} else {
bl_debug_color_set(0x0000ff);
}
- //bl_debug_draw_point(&int_points[BLI_array_count(int_points) - 3], 0.05f);
bl_debug_color_set(0x000000);
bl_debug_draw_edge_add(p1, p2);
- bl_debug_color_set(0x000000);
+ bl_debug_color_set(0x000000);*/
#endif
break;
}
@@ -7366,6 +7365,26 @@ static void remove_connected_from_edgehash_list(MeshElemMap *emap, GHash **edge_
}
}
+static bool is_dead_end (Mesh *me, GHash *vert_hash, MeshElemMap *emap, int edge, int e_vert)
+{
+ int c_v;
+ MEdge *c_e;
+ int s_v = me->medge[edge].v1 == e_vert ? me->medge[edge].v2 : me->medge[edge].v1;
+
+ for (int e = 0; e < emap[s_v].count; e++) {
+ c_v = me->medge[emap[s_v].indices[e]].v1 == s_v ? me->medge[emap[s_v].indices[e]].v2 : me->medge[emap[s_v].indices[e]].v1;
+ if(!BLI_ghash_haskey(vert_hash, SET_INT_IN_POINTER(c_v))){
+ for (int e2 = 0; e2 < emap[c_v].count; e2++) {
+ c_e = &me->medge[emap[c_v].indices[e2]];
+ if (c_e->v1 == e_vert || c_e->v2 == e_vert) {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+}
+
static bool has_cross_border_neighbour(Mesh *me, GHash *vert_hash, GHash *edge_hash, MeshElemMap *emap, int edge, int l_v_edge, int depth) {
int v_edge;
@@ -7394,9 +7413,13 @@ static bool has_cross_border_neighbour(Mesh *me, GHash *vert_hash, GHash *edge_h
* TODO: One wide strips might get cutoff */
static int get_adjacent_edge(Mesh *me, MeshElemMap *emap, int curr_edge, int v_edge, GHash *edge_hash, GHash *vert_hash)
{
+ int r_edge = -1;
for (int e = 0; e < emap[v_edge].count; e++) {
if(emap[v_edge].indices[e] != curr_edge && has_cross_border_neighbour(me, vert_hash, edge_hash, emap, emap[v_edge].indices[e], v_edge, 1)) {
- return emap[v_edge].indices[e];
+ r_edge = emap[v_edge].indices[e];
+ if (!is_dead_end(me, vert_hash, emap, r_edge, v_edge)) {
+ return r_edge;
+ }
}
}
for (int e = 0; e < emap[v_edge].count; e++) {
@@ -7405,15 +7428,19 @@ static int get_adjacent_edge(Mesh *me, MeshElemMap *emap, int curr_edge, int v_e
}
}
/*End Of Loop. Shouldn't happen with two manifold meshes*/
- return -1;
+ return r_edge;
}
static int get_adjacent_edge_from_list(Mesh *me, MeshElemMap *emap, int curr_edge, int v_edge, GHash **edge_hash, int num_hash, GHash *vert_hash)
{
+ int r_edge = -1;
for (int e = 0; e < emap[v_edge].count; e++) {
for (int i = 0; i < num_hash; i++) {
if(emap[v_edge].indices[e] != curr_edge && has_cross_border_neighbour(me, vert_hash, edge_hash[i], emap, emap[v_edge].indices[e], v_edge, 1)) {
- return emap[v_edge].indices[e];
+ r_edge = emap[v_edge].indices[e];
+ if (!is_dead_end(me, vert_hash, emap, r_edge, v_edge)) {
+ return r_edge;
+ }
}
}
}
@@ -7425,7 +7452,7 @@ static int get_adjacent_edge_from_list(Mesh *me, MeshElemMap *emap, int curr_edg
}
}
/*End Of Loop. Shouldn't happen with two manifold meshes*/
- return -1;
+ return r_edge;
}
static void check_preceding_intersecting_edges(Object *ob, SilhouetteData *sil, SpineBranch *branch, PBVHNode **nodes, int tot_edge)
@@ -7685,6 +7712,13 @@ static void combine_intersection_data(Mesh *me, SilhouetteData *sil)
}
}
+#ifdef DEBUG_DRAW
+ GHASH_ITER_INDEX (gh_iter, vert_hash, idx) {
+ bl_debug_color_set(0xffff00);
+ bl_debug_draw_point(me->mvert[(int)BLI_ghashIterator_getKey(&gh_iter)].co, 0.05f);
+ bl_debug_color_set(0x000000);
+ }
+#endif
if (BLI_array_count(ring_start) > BLI_array_count(edge_ring_fillet)) {
BLI_array_empty(ring_start);
BLI_array_empty(edge_ring_fillet);
@@ -7897,9 +7931,9 @@ static int *find_triangulation(Mesh *me, int *a_verts, int *b_verts, int a_size,
invert = dot_v3v3(n1, n2) < 0;
#ifdef DEBUG_DRAW
- bl_debug_color_set(0x0099ff);
+ /*bl_debug_color_set(0x0099ff);
bl_debug_draw_edge_add(me->mvert[a_verts[pas]].co, me->mvert[b_verts[pbs]].co);
- bl_debug_color_set(0x000000);
+ bl_debug_color_set(0x000000);*/
#endif
*r_invert = invert;
@@ -8203,7 +8237,7 @@ static void gen_fillet_velp(Mesh *me,
me->mloop[l_pos].e = e_start + 3 * i + 2;
l_pos ++;
me->mloop[l_pos].v = b_verts[map[i]];
- me->mloop[l_pos].e = b_edges[(map[i] + boff) % a_size];
+ me->mloop[l_pos].e = b_edges[(map[i] + boff) % b_size];
l_pos ++;
me->mloop[l_pos].v = b_verts[map[next_i]];
me->mloop[l_pos].e = e_start + 3 * next_i + 2;
@@ -8437,6 +8471,21 @@ static void generate_fillet_topology(Mesh *me, SilhouetteData *sil)
}
} else {
printf("Couldn't transition the intersecting parts. Algorithm produced a non matching ringlayout.\n");
+#ifdef DEBUG_DRAW
+ for (int r = 0; r < sil->num_rings; r++) {
+ bl_debug_draw_BB_add(&sil->fillet_ring_bbs[r], 0x0000ff);
+ }
+ for (int r = 0; r < sil->num_rings_new; r++) {
+ bl_debug_draw_BB_add(&sil->fillet_ring_bbs_new[r], 0x00ffff);
+ int deb_start = sil->fillet_ring_new_start[r];
+ int deb_tot = r + 1 < sil->num_rings_new ? sil->fillet_ring_new_start[r + 1] - deb_start : sil->fillet_ring_tot_new - deb_start;
+ for(int j = 0; j < deb_tot; j++) {
+ bl_debug_color_set(0x0000ff * ((float)r / sil->num_rings_new));
+ bl_debug_draw_medge_add(me, sil->fillet_ring_new[deb_start + j]);
+ bl_debug_color_set(0x000000);
+ }
+ }
+#endif
BLI_assert(false);
}
}
More information about the Bf-blender-cvs
mailing list