[Bf-blender-cvs] [371a6799c44] sculpt-dev: Sculpt-dev: Fix local collpase mode
Joseph Eagar
noreply at git.blender.org
Mon Mar 14 22:20:04 CET 2022
Commit: 371a6799c443e30dcff9fe3017453f198871c16b
Author: Joseph Eagar
Date: Mon Mar 14 14:19:23 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rB371a6799c443e30dcff9fe3017453f198871c16b
Sculpt-dev: Fix local collpase mode
* Also disabled "cleanup" mode, need to rewrite
the vertex dissolve func it uses.
===================================================================
M source/blender/blenkernel/intern/dyntopo.c
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_brush_types.c
M source/blender/editors/space_file/fsmenu.c
===================================================================
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index 637d73b3efc..353c4ca202e 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -198,7 +198,7 @@ static void edge_queue_create_local(struct EdgeQueueContext *eq_ctx,
float radius,
const bool use_frontface,
const bool use_projected,
- bool is_collapse);
+ PBVHTopologyUpdateMode local_mode);
void bmesh_disk_edge_append(BMEdge *e, BMVert *v);
void bmesh_radial_loop_append(BMEdge *e, BMLoop *l);
@@ -1449,7 +1449,11 @@ typedef struct EdgeQueueContext {
MinMaxHeap *heap_mm;
int max_heap_mm;
- TableGSet *used_verts;
+ // TableGSet *used_verts;
+ BMVert **used_verts;
+ int used_verts_size;
+ int tot_used_verts;
+
float view_normal[3];
bool use_view_normal;
float limit_min, limit_max, limit_mid;
@@ -1457,8 +1461,10 @@ typedef struct EdgeQueueContext {
const float *center;
float center_proj[3]; /* for when we use projected coords. */
float radius_squared;
- float limit_len;
- float limit_len_squared;
+ float limit_len_min;
+ float limit_len_max;
+ float limit_len_min_sqr;
+ float limit_len_max_sqr;
bool (*edge_queue_tri_in_range)(const struct EdgeQueueContext *q, BMVert *vs[3], float no[3]);
bool (*edge_queue_vert_in_range)(const struct EdgeQueueContext *q, BMVert *v);
@@ -1505,18 +1511,42 @@ static void edge_queue_insert_unified(EdgeQueueContext *eq_ctx, BMEdge *e)
{
if (/*BLI_mm_heap_len(eq_ctx->heap_mm) < eq_ctx->max_heap_mm &&*/ !(e->head.hflag &
BM_ELEM_TAG)) {
- float len = len_squared_v3v3(e->v1->co, e->v2->co);
+ float lensqr = len_squared_v3v3(e->v1->co, e->v2->co);
+
+ float len = sqrtf(lensqr);
+
+ eq_ctx->avg_elen += len;
+ eq_ctx->min_elen = min_ff(eq_ctx->min_elen, len);
+ eq_ctx->max_elen = max_ff(eq_ctx->max_elen, len);
+ eq_ctx->totedge++;
- len += (BLI_thread_frand(0) - 0.5f) * 0.1 * eq_ctx->limit_mid;
+ // lensqr += (BLI_thread_frand(0) - 0.5f) * 0.1 * eq_ctx->limit_mid;
- BLI_mm_heap_insert(eq_ctx->heap_mm, len, e);
+ BLI_mm_heap_insert(eq_ctx->heap_mm, lensqr, e);
e->head.hflag |= BM_ELEM_TAG;
}
}
static void edge_queue_insert_val34_vert(EdgeQueueContext *eq_ctx, BMVert *v)
{
- BLI_table_gset_add(eq_ctx->used_verts, v);
+ // BLI_table_gset_add(eq_ctx->used_verts, v);
+ eq_ctx->tot_used_verts++;
+
+ if (!eq_ctx->used_verts || eq_ctx->tot_used_verts > eq_ctx->used_verts_size) {
+ int newlen = (eq_ctx->tot_used_verts + 1);
+ newlen += newlen >> 1;
+
+ eq_ctx->used_verts_size = newlen;
+ if (eq_ctx->used_verts) {
+ eq_ctx->used_verts = (BMVert **)MEM_reallocN(eq_ctx->used_verts, newlen * sizeof(BMVert *));
+ }
+ else {
+ eq_ctx->used_verts = (BMVert **)MEM_malloc_arrayN(
+ newlen, sizeof(BMVert *), "eq_ctx->used_verts");
+ }
+ }
+
+ eq_ctx->used_verts[eq_ctx->tot_used_verts - 1] = v;
}
BLI_INLINE float calc_curvature_weight(EdgeQueueContext *eq_ctx, BMVert *v1, BMVert *v2)
@@ -1841,12 +1871,12 @@ static void long_edge_queue_face_add(EdgeQueueContext *eq_ctx, BMFace *f, bool i
float len_sq = calc_edge_length(eq_ctx, l_iter->e->v1, l_iter->e->v2);
- if (len_sq > eq_ctx->limit_len_squared) {
+ if (len_sq > eq_ctx->limit_len_max_sqr) {
long_edge_queue_edge_add_recursive(eq_ctx,
l_iter->radial_next,
l_iter,
len_sq,
- eq_ctx->limit_len,
+ eq_ctx->limit_len_max,
DEPTH_START_LIMIT +
1); // ignore_frontface ? 0 : DEPTH_START_LIMIT+1);
}
@@ -2039,9 +2069,9 @@ static void unified_edge_queue_task_cb(void *__restrict userdata,
/* subdivide walks the mesh a bit for better transitions in the topology */
- if ((eq_ctx->mode & PBVH_Subdivide) && (len_sq > eq_ctx->limit_len_squared)) {
+ if ((eq_ctx->mode & PBVH_Subdivide) && (len_sq > eq_ctx->limit_len_max_sqr)) {
long_edge_queue_edge_add_recursive_2(
- tdata, l_iter->radial_next, l_iter, len_sq, eq_ctx->limit_len, 0, true);
+ tdata, l_iter->radial_next, l_iter, len_sq, eq_ctx->limit_len_max, 0, true);
}
if (edge_queue_test(eq_ctx, pbvh, l_iter->e)) {
@@ -2468,6 +2498,8 @@ static void edge_queue_init(EdgeQueueContext *eq_ctx,
eq_ctx->center = center;
copy_v3_v3(eq_ctx->view_normal, view_normal);
eq_ctx->radius_squared = radius * radius;
+ eq_ctx->limit_len_min_sqr = eq_ctx->limit_len_min * eq_ctx->limit_len_min;
+ eq_ctx->limit_len_max_sqr = eq_ctx->limit_len_max * eq_ctx->limit_len_max;
#ifdef USE_EDGEQUEUE_FRONTFACE
eq_ctx->use_view_normal = use_frontface;
@@ -2479,8 +2511,8 @@ static void edge_queue_init(EdgeQueueContext *eq_ctx,
static bool edge_queue_test(EdgeQueueContext *eq_ctx, PBVH *pbvh, BMEdge *e)
{
float len = len_squared_v3v3(e->v1->co, e->v2->co);
- float min = pbvh->bm_min_edge_len * pbvh->bm_min_edge_len;
- float max = pbvh->bm_max_edge_len * pbvh->bm_max_edge_len;
+ float min = eq_ctx->limit_len_min_sqr;
+ float max = eq_ctx->limit_len_max_sqr;
bool ret = false;
@@ -2511,20 +2543,18 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
float radius,
const bool use_frontface,
const bool use_projected,
- const bool local_mode)
+ PBVHTopologyUpdateMode local_mode)
{
if (local_mode) {
edge_queue_create_local(
- eq_ctx, pbvh, center, view_normal, radius, use_frontface, use_projected, false);
+ eq_ctx, pbvh, center, view_normal, radius, use_frontface, use_projected, local_mode);
return;
}
eq_ctx->radius_squared = radius * radius;
- eq_ctx->limit_len_squared = pbvh->bm_max_edge_len * pbvh->bm_max_edge_len;
-#ifdef USE_EDGEQUEUE_EVEN_SUBDIV
- eq_ctx->limit_len = pbvh->bm_max_edge_len;
-#endif
+ eq_ctx->limit_len_min = pbvh->bm_min_edge_len;
+ eq_ctx->limit_len_max = pbvh->bm_max_edge_len;
edge_queue_init(eq_ctx, use_projected, use_frontface, center, view_normal, radius);
@@ -2597,6 +2627,9 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
}
}
+ BMVert **verts = NULL;
+ BLI_array_declare(verts);
+
for (int i = 0; i < count; i++) {
EdgeQueueThreadData *td = tdata + i;
@@ -2626,6 +2659,7 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
if (mv1->flag & SCULPTVERT_NEED_VALENCE) {
BKE_pbvh_bmesh_update_valence(pbvh->cd_sculpt_vert, (SculptVertRef){.i = (intptr_t)e->v1});
}
+
if (mv2->flag & SCULPTVERT_NEED_VALENCE) {
BKE_pbvh_bmesh_update_valence(pbvh->cd_sculpt_vert, (SculptVertRef){.i = (intptr_t)e->v2});
}
@@ -2643,6 +2677,12 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
return;
}
+ BLI_array_append(verts, e->v1);
+ BLI_array_append(verts, e->v2);
+
+ e->v1->head.hflag |= BM_ELEM_TAG;
+ e->v2->head.hflag |= BM_ELEM_TAG;
+
if (edge_queue_test(eq_ctx, pbvh, e)) {
edge_queue_insert_unified(eq_ctx, e);
}
@@ -2654,6 +2694,18 @@ static void unified_edge_queue_create(EdgeQueueContext *eq_ctx,
}
BLI_array_free(tdata);
+ for (int i = 0; i < BLI_array_len(verts); i++) {
+ BMVert *v = verts[i];
+
+ if (v->head.hflag & BM_ELEM_TAG) {
+ v->head.hflag &= ~BM_ELEM_TAG;
+
+ edge_queue_insert_val34_vert(eq_ctx, v);
+ }
+ }
+
+ BLI_array_free(verts);
+
if (push_subentry) {
BM_log_entry_add_ex(pbvh->bm, pbvh->bm_log, true);
}
@@ -2698,12 +2750,14 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
float radius,
const bool use_frontface,
const bool use_projected,
- bool is_collapse)
+ PBVHTopologyUpdateMode local_mode)
{
- eq_ctx->limit_len = pbvh->bm_min_edge_len;
- eq_ctx->limit_len_squared = eq_ctx->limit_len * eq_ctx->limit_len;
+ eq_ctx->limit_len_min = pbvh->bm_min_edge_len;
+ eq_ctx->limit_len_max = pbvh->bm_max_edge_len;
eq_ctx->local_mode = true;
+ float oldlimit = pbvh->bm_min_edge_len;
+
edge_queue_init(eq_ctx, use_projected, use_frontface, center, view_normal, radius);
EdgeQueueThreadData *tdata = NULL;
@@ -2718,7 +2772,7 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
memset(&td, 0, sizeof(td));
td.pbvh = pbvh;
td.node = node;
- td.is_collapse = is_collapse;
+ td.is_collapse = local_mode & PBVH_LocalCollapse;
td.eq_ctx = eq_ctx;
BLI_array_append(tdata, td);
@@ -2780,7 +2834,7 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
for (int j = 0; j < 2; j++) {
BMVert *v = j ? e->v2 : e->v1;
- if (!is_collapse) {
+ if (!(local_mode & PBVH_LocalCollapse)) {
if (!(v->head.hflag & BM_ELEM_TAG)) {
v->head.hflag |= BM_ELEM_TAG;
MSculptVert *mv = BKE_PBVH_SCULPTVERT(pbvh->cd_sculpt_vert, v);
@@ -2788,6 +2842,8 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
if (mv->flag & SCULPTVERT_NEED_VALENCE) {
BKE_pbvh_bmesh_update_valence(pbvh->cd_sculpt_vert, (SculptVertRef){.i = (intptr_t)v});
}
+
+ edge_queue_insert_val34_vert(eq_ctx, v);
}
}
}
@@ -2816,7 +2872,7 @@ static void edge_queue_create_local(EdgeQueueContext *eq_ctx,
edges[i]->head.hflag |= BM_ELEM_TAG;
}
- int totstep = is_collapse ? 3 : 3;
+ int totstep
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list