[Bf-blender-cvs] [6d86842dd3c] soc-2017-sculpting_improvements: Mayor rework of the edgering system. Unified code, bugfixes. A lot of bugs still remain.

Sebastian Witt noreply at git.blender.org
Thu Aug 24 17:13:08 CEST 2017


Commit: 6d86842dd3c61d519330c8ce59db66b33c5978b6
Author: Sebastian Witt
Date:   Thu Aug 24 17:10:47 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB6d86842dd3c61d519330c8ce59db66b33c5978b6

Mayor rework of the edgering system. Unified code, bugfixes.
A lot of bugs still remain.

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

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 4ce2a8b1e9d..2b3a47c0f31 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -126,6 +126,7 @@
 #endif
 
 #define SIL_STROKE_STORE_CHUNK 512
+#define SIL_STROKE_STORE_CHUNK_S 128
 /* Store bias is used to bias a close estimate since resizing is more expensive than bigger array on first allocate*/
 #define STORE_ESTIMATE_BIAS 0.1f
 /* Fillet Blur determines the fuzziness wether a vert is intersecting or not.
@@ -277,16 +278,17 @@ typedef struct SilhouetteData {
 	int *fillet_ring_orig_start;	/* start positions to each individual ring */
 	int *fillet_ring_new;			/* ring_edges to connect to in the new mesh */
 	int *fillet_ring_new_start;		/* start positions to each individual ring */
+	int max_fillet_ring_new_start, max_fillet_ring_orig_start;
+	int max_fillet_ring_new, max_fillet_ring_orig;
 	float *exact_isect_points;		/* Exact intersection points. same ring order as fillet ring new */
 	int *exact_isect_points_start;		/* length = num_rings_new */
 	int exact_points_tot;
 	int num_rings, fillet_ring_tot, num_rings_new, fillet_ring_tot_new;
-	int *inter_edges;				/* edges crossing the two shapes */
-	int num_inter_edges;			/* number of edges crossing */
 	int *inter_tris;				/* Triangles intersecting the silhouette mesh. Points to MLooptri bvh->mloop */
 	int num_inter_tris;
 	int *tri_nodebind;				/* offsets in inter_tri arr to address node specific tris. */
 	int num_inter_nodes;
+	GHash *l1_vert_hash;			/* verthash used in first stage to gather all subprocess verts. Contains at first same data as v_to_rm */
 	int *v_to_rm;
 	int num_v_to_rm;
 	BB *fillet_ring_bbs;			/* every ring gets a Bounding box to check intersection with branches */
@@ -5288,7 +5290,6 @@ static SilhouetteData *silhouette_data_new(bContext *C)
 	sil->fillet_ring_orig_start = NULL;
 	sil->fillet_ring_orig = NULL;
 	sil->fillet_ring_orig_start = NULL;
-	sil->inter_edges = NULL;
 	sil->fillet_ring_bbs = NULL;
 	sil->isect_chunk = NULL;
 	sil->fillet_ring_new = NULL;
@@ -5296,6 +5297,7 @@ static SilhouetteData *silhouette_data_new(bContext *C)
 	sil->inter_tris = NULL;
 	sil->tri_nodebind = NULL;
 	sil->v_to_rm = NULL;
+	sil->l1_vert_hash = NULL;
 
 	sil->scene = scene;
 	sil->ob = obedit;
@@ -5310,9 +5312,6 @@ static void silhouette_data_free(struct wmOperator *op)
 	if (data) {
 		silhouette_stroke_free(data->current_stroke);
 
-		if (data->inter_edges) {
-			MEM_freeN(data->inter_edges);
-		}
 		if (data->fillet_ring_orig) {
 			MEM_freeN(data->fillet_ring_orig);
 		}
@@ -7351,6 +7350,7 @@ static void do_calc_sil_intersect_task_cb_ex(void *userdata, void *UNUSED(userda
 	BLI_ghash_free(edge_hash, NULL, NULL);
 }
 
+#if 0
 static void remove_connected_from_edgehash(MeshElemMap *emap, GHash *edge_hash, int v) {
 	for (int e = 0; e < emap[v].count; e++) {
 		BLI_ghash_remove(edge_hash, emap[v].indices[e], NULL, NULL);
@@ -7385,7 +7385,7 @@ static bool is_dead_end (Mesh *me, GHash *vert_hash, MeshElemMap *emap, int edge
 	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) {
+static bool has_cross_border_neighbour(Mesh *me, GHash *vert_hash, MeshElemMap *emap, int edge, int l_v_edge, int depth) {
 	int v_edge;
 
 	v_edge = me->medge[edge].v1 == l_v_edge ? me->medge[edge].v2 : me->medge[edge].v1;
@@ -7396,13 +7396,11 @@ static bool has_cross_border_neighbour(Mesh *me, GHash *vert_hash, GHash *edge_h
 		if(!BLI_ghash_haskey(vert_hash, SET_INT_IN_POINTER(v_edge))){
 			for (int e = 0; e < emap[v_edge].count; e++) {
 				if(emap[v_edge].indices[e] != edge) {
-					if(has_cross_border_neighbour(me, vert_hash, edge_hash, emap, emap[v_edge].indices[e], v_edge, depth - 1)){
+					if(has_cross_border_neighbour(me, vert_hash, emap, emap[v_edge].indices[e], v_edge, depth - 1)){
 						return true;
 					}
 				}
 			}
-		} else {
-			BLI_ghash_remove(edge_hash, edge, NULL, NULL);
 		}
 	}
 	return false;
@@ -7415,7 +7413,7 @@ static int get_adjacent_edge(Mesh *me, MeshElemMap *emap, int curr_edge, int v_e
 {
 	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)) {
+		if(emap[v_edge].indices[e] != curr_edge && has_cross_border_neighbour(me, vert_hash, emap, emap[v_edge].indices[e], v_edge, 1)) {
 			r_edge = emap[v_edge].indices[e];
 			if (!is_dead_end(me, vert_hash, emap, r_edge, v_edge)) {
 				return r_edge;
@@ -7423,7 +7421,7 @@ static int get_adjacent_edge(Mesh *me, MeshElemMap *emap, int curr_edge, int v_e
 		}
 	}
 	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, 2)) {
+		if(emap[v_edge].indices[e] != curr_edge && has_cross_border_neighbour(me, vert_hash, emap, emap[v_edge].indices[e], v_edge, 2)) {
 			return emap[v_edge].indices[e];
 		}
 	}
@@ -7436,7 +7434,7 @@ static int get_adjacent_edge_from_list(Mesh *me, MeshElemMap *emap, int curr_edg
 	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)) {
+			if(emap[v_edge].indices[e] != curr_edge && has_cross_border_neighbour(me, vert_hash, emap, emap[v_edge].indices[e], v_edge, 1)) {
 				r_edge = emap[v_edge].indices[e];
 				if (!is_dead_end(me, vert_hash, emap, r_edge, v_edge)) {
 					return r_edge;
@@ -7446,7 +7444,7 @@ static int get_adjacent_edge_from_list(Mesh *me, MeshElemMap *emap, int curr_edg
 	}
 	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, 2)) {
+			if(emap[v_edge].indices[e] != curr_edge && has_cross_border_neighbour(me, vert_hash, emap, emap[v_edge].indices[e], v_edge, 2)) {
 				return emap[v_edge].indices[e];
 			}
 		}
@@ -7454,6 +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 r_edge;
 }
+#endif
 
 static void check_preceding_intersecting_edges(Object *ob, SilhouetteData *sil, SpineBranch *branch, PBVHNode **nodes, int tot_edge)
 {
@@ -7478,18 +7477,18 @@ static void check_preceding_intersecting_edges(Object *ob, SilhouetteData *sil,
 #endif
 }
 
-static void crawl_mesh_rec (Mesh *me, MeshElemMap *emap, GHash *vert_hash, IntersectionData *i_sect_data, int num_isect_data, int orig)
+static void crawl_mesh_rec (Mesh *me, MeshElemMap *emap, GHash *vert_hash, GHash **edge_hashes, int num_hashes, int orig)
 {
 	int v_c;
 	for(int e = 0; e < emap[orig].count; e++) {
-		for (int i = 0; i < num_isect_data; i++) {
-			if (BLI_ghash_haskey(i_sect_data[i].edge_hash, SET_INT_IN_POINTER(emap[orig].indices[e]))) {
+		for (int i = 0; i < num_hashes; i++) {
+			if (BLI_ghash_haskey(edge_hashes[i], SET_INT_IN_POINTER(emap[orig].indices[e]))) {
 				goto next_edge;
 			}
 		}
 		v_c = me->medge[emap[orig].indices[e]].v1 == orig ? me->medge[emap[orig].indices[e]].v2 : me->medge[emap[orig].indices[e]].v1;
 		if (BLI_ghash_reinsert(vert_hash, SET_INT_IN_POINTER(v_c), SET_INT_IN_POINTER(v_c), NULL, NULL)) {
-			crawl_mesh_rec(me, emap, vert_hash, i_sect_data, num_isect_data, v_c);
+			crawl_mesh_rec(me, emap, vert_hash, edge_hashes, num_hashes, v_c);
 		}
 	next_edge:;
 	}
@@ -7561,219 +7560,359 @@ static void add_points_in_order(Mesh *me, MeshElemMap *emap, IntersectionData *d
 
 }*/
 
-static void order_exact_points(Mesh *me, MeshElemMap *emap, IntersectionData *data, SilhouetteData *sil, int num_hash, int exact_p_tot)
+static void order_exact_points(Mesh *me, MeshElemMap *emap, IntersectionData *data, SilhouetteData *sil, int num_hash)
 {
 	int r_size;
 	MEdge edge;
-	int last_edge = -1;
-	int vc;
-	int last_v = -1;
 	int exact_p_pos = 0;
-	sil->exact_isect_points = MEM_callocN(sizeof(float) * 3 * exact_p_tot, "exact points intersection");
+	int vc = - 1;
+	sil->exact_isect_points = MEM_callocN(sizeof(float) * 3 * sil->fillet_ring_tot_new, "exact points intersection");
 	sil->exact_isect_points_start = MEM_callocN(sizeof(int) * sil->num_rings_new, "exact points isect start");
+
 	for (int r = 0; r < sil->num_rings_new; r++) {
 		r_size = r + 1 < sil->num_rings_new ? sil->fillet_ring_new_start[r + 1] - sil->fillet_ring_new_start[r] : sil->fillet_ring_tot_new - sil->fillet_ring_new_start[r];
+		sil->exact_isect_points_start[r] = exact_p_pos;
 		for (int i = 0; i < r_size; i++) {
 			edge = me->medge[sil->fillet_ring_new[sil->fillet_ring_new_start[r] + i]];
 			vc = edge.v1 == vc ? edge.v2 : edge.v1;
-			if (i == 0) {
-				/*last_v = get_first_to_sort(&edge, data, emap, vc);*/
-				last_v = -1;
-			}
-			add_points_in_order(me, emap, data, sil, num_hash, &exact_p_pos, exact_p_tot, vc, &last_v);
+			add_points_in_order(emap, data, sil, num_hash, &exact_p_pos, vc);
 		}
 	}
+	sil->exact_points_tot = exact_p_pos;
+	sil->exact_isect_points = MEM_reallocN(sil->exact_isect_points, sizeof(float) * 3 * exact_p_pos);
 }
 #endif
 
-static void add_points_in_order(MeshElemMap *emap, IntersectionData *data, SilhouetteData *sil, int num_hash, int *e_pos, int v)
+static void calc_ring_bbs(Mesh *me, BB **ring_bbs, int *data, int num_rings, int *start_arr, int tot)
 {
-	void *vl;
-	int p_idx;
-	for (int e = 0; e < emap[v].count; e++) {
-		for (int h = 0; h < num_hash; h++) {
-			vl = BLI_ghash_lookup(data[h].edge_hash, SET_INT_IN_POINTER(emap[v].indices[e]));
-			if (vl) {
-				p_idx = abs(GET_INT_FROM_POINTER(vl)) - 1;
-				copy_v3_v3(&sil->exact_isect_points[*e_pos * 3], &data[h].intersection_points[p_idx]);
-				*e_pos = *e_pos + 1;
-				return;
-			}
+	int len, edge;
+	BB *ring_bb_data = *ring_bbs;
+	BB *curr;
+	if (num_rings > tot) {
+		return;
+	}
+
+	ring_bb_data = MEM_callocN(sizeof(BB) * num_ring

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list