[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