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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs