[Bf-blender-cvs] [5465a1ee165] soc-2017-sculpting_improvements: Overlapping parts of cross node edgecuts are now calculated.

Sebastian Witt noreply at git.blender.org
Fri Aug 4 15:09:38 CEST 2017


Commit: 5465a1ee16562cd313f7be01808147a8d8a2e72a
Author: Sebastian Witt
Date:   Fri Aug 4 15:08:24 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB5465a1ee16562cd313f7be01808147a8d8a2e72a

Overlapping parts of cross node edgecuts are now calculated.

===================================================================

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 a32740d45af..4a91043f24c 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -7296,21 +7296,43 @@ static void calc_ring_bbs(SilhouetteData *sil, Mesh *me)
 	}
 }
 
-static bool next_to_in_ring(int e1, int p_to_e2, int *ring, int min, int max)
-{
-	if (ring[p_to_e2] == e1) {
-		return true;
-	}
-	if (p_to_e2 + 1 < max && ring[p_to_e2 + 1] == e1) {
-		return true;
+/* We calculate a start and an endpoint of the two node ends intersecting. Now we need to determine the right side on which the intersection happens 
+ * Returning the points in correct order (positive looping results in inner side);
+ */
+static void order_positive_is_inside(Mesh *me, SilhouetteData *sil, MeshElemMap *emap, int *r11, int *r12, int r1_start, int r1_tot, int r2_start, int r2_tot)
+{
+	int dist_1;
+	int center;
+	int comp_v1, comp_v2;
+	int comp_e;
+	int tmp_swap;
+	if (*r11 > *r12) {
+		dist_1 = r1_tot - *r11 + *r12;
+	} else {
+		dist_1 = *r12 - *r11;
 	}
-	if (p_to_e2 - 1 > min && ring[p_to_e2 - 1] == e1) {
-		return true;
+
+	center = r1_start + (*r11 + (dist_1 / 2)) % r1_tot;
+	comp_v1 = me->medge[sil->fillet_ring_new[center]].v2;
+
+	for (int e = 0; e < emap[comp_v1].count; e++) {
+		comp_e = emap[comp_v1].indices[e];
+		if (comp_e != sil->fillet_ring_new[center] && comp_e != sil->fillet_ring_new[center + 1] && comp_e != sil->fillet_ring_new[center - 1]) {
+			comp_v2 = me->medge[comp_e].v1 == comp_v1 ? me->medge[comp_e].v2 : me->medge[comp_e].v1;
+			for (int e_l = 0; e_l < r2_tot; e_l ++) {
+				if (me->medge[sil->fillet_ring_new[r2_start + e_l]].v2 == comp_v2) {
+					return;
+				}
+			}
+		}
 	}
-	return false;
+	tmp_swap = *r11;
+	*r11 = *r12;
+	*r12 = tmp_swap;
+	return;
 }
 
-static void join_node_separated_rings(SilhouetteData *sil, Mesh *me)
+static void join_node_separated_rings(SilhouetteData *sil, Mesh *me, MeshElemMap *emap)
 {
 	/*int *merged_ring_arr = NULL;
 	int *merged_start = NULL;
@@ -7327,32 +7349,54 @@ static void join_node_separated_rings(SilhouetteData *sil, Mesh *me)
 				r2_start = sil->fillet_ring_new_start[r2];
 				r1_tot = sil->fillet_ring_new_start[r1 + 1] - r1_start;
 				r2_tot = r2 + 1 < sil->num_rings ? sil->fillet_ring_new_start[r2 + 1] - r2_start : sil->fillet_ring_tot - r2_start;
+				r1_e_s1 = -1, r1_e_s2 = -1, r2_e_s1 = -1, r2_e_s2 = -1;
 				for (int e1 = 0; e1 < r1_tot; e1++) {
 					e1_c = me->medge[sil->fillet_ring_new[r1_start + e1]];
 					for (int e2 = 0; e2 < r2_tot; e2++) {
 						e2_c = me->medge[sil->fillet_ring_new[r2_start + e2]];
 						if (e1_c.v1 == e2_c.v1 || e1_c.v1 == e2_c.v2 || e1_c.v2 == e2_c.v1 || e1_c.v2 == e2_c.v2) {
 							if (r1_e_s1 == -1) {
-								r1_e_s1 = sil->fillet_ring_new[r1_start + e1];
-								r2_e_s1 = sil->fillet_ring_new[r2_start + e2];
+								r1_e_s1 = e1;
+								r2_e_s1 = e2;
 							} else {
-								if (!next_to_in_ring(r1_e_s1, r1_start + e1, sil->fillet_ring_new, r1_start + r1_tot, r1_start)) {
-									r1_e_s2 = sil->fillet_ring_new[r1_start + e1];
-									r2_e_s2 = sil->fillet_ring_new[r2_start + e2];
+								if (abs(r1_e_s1 - e1) > 3) {
+									r1_e_s2 = e1;
+									r2_e_s2 = e2;
 									/* Found start and endpoint of the two ring intersections */
+									order_positive_is_inside(me, sil, emap, &r1_e_s1, &r1_e_s2, r1_start, r1_tot, r2_start, r2_tot);
+									order_positive_is_inside(me, sil, emap, &r2_e_s1, &r2_e_s2, r2_start, r2_tot, r1_start, r1_tot);
 #ifdef DEBUG_DRAW
 									bl_debug_color_set(0xffffff);
-									bl_debug_draw_point(me->mvert[me->medge[r1_e_s1].v1].co, 0.2f);
+									bl_debug_draw_point(me->mvert[me->medge[sil->fillet_ring_new[r1_start + r1_e_s1]].v1].co, 0.2f);
 									bl_debug_color_set(0x000000);
-									bl_debug_draw_point(me->mvert[me->medge[r1_e_s2].v1].co, 0.2f);
+									bl_debug_draw_point(me->mvert[me->medge[sil->fillet_ring_new[r1_start + r1_e_s2]].v1].co, 0.3f);
 									bl_debug_color_set(0x000000);
-#endif
+
+									bl_debug_color_set(0x00ff00);
+									for (int e_ins = 0; e_ins < r1_tot; e_ins ++) {
+										if((r1_e_s1 + e_ins) % r1_tot == r1_e_s2) {
+											bl_debug_color_set(0x000000);
+											break;
+										}
+										bl_debug_draw_medge_add(me, sil->fillet_ring_new[r1_start + (r1_e_s1 + e_ins) % r1_tot]);
+									}
+									bl_debug_color_set(0x000000);
+#endif	
+									/* TODO: Is this a bad coding practise?
+									 * Maybe:
+									 * e1 = r1_tot;
+									 * e2 = r2_tot;
+									 * r2++;
+									 */
+									goto next_ring;
 								}
 							}
 						}
 					}
 				}
 			}
+			/* Continue with the next ring */
+			next_ring:;
 		}
 	}
 }
@@ -7601,7 +7645,7 @@ static void do_calc_fillet_line(Object *ob, SilhouetteData *silhouette, PBVHNode
 #endif
 
 	/*TODO: Join multiple parts together when totnode > 1.*/
-	join_node_separated_rings(silhouette, me);
+	join_node_separated_rings(silhouette, me, emap);
 
 	if (v_remove) {
 #if 0




More information about the Bf-blender-cvs mailing list