Commit: bd5f5597c895d9d920ddbee552631a44798dd54f Author: Joseph Eagar Date: Mon Feb 6 02:20:06 2023 -0800 Branches: sculpt-dev https://developer.blender.org/rBbd5f5597c895d9d920ddbee552631a44798dd54f
sculpt-dev: BMLog rewrite part 2 Finished implementing old behavior. I still need to do more testing, but the code is now much (much) cleaner and less confusing. =================================================================== M source/blender/blenkernel/intern/dyntopo.cc M source/blender/bmesh/intern/bmesh_log.cc =================================================================== diff --git a/source/blender/blenkernel/intern/dyntopo.cc b/source/blender/blenkernel/intern/dyntopo.cc index 18351f48c79..6b84f27ec73 100644 --- a/source/blender/blenkernel/intern/dyntopo.cc +++ b/source/blender/blenkernel/intern/dyntopo.cc @@ -759,7 +759,7 @@ static void edge_queue_insert_val34_vert(EdgeQueueContext *eq_ctx, BMVert *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) { + 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; @@ -2718,6 +2718,8 @@ extern "C" bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh, } EdgeQueueContext eq_ctx; + memset(static_cast<void*>(&eq_ctx), 0, sizeof(eq_ctx)); + eq_ctx.pool = nullptr; eq_ctx.bm = pbvh->header.bm; eq_ctx.mask_cb = mask_cb; diff --git a/source/blender/bmesh/intern/bmesh_log.cc b/source/blender/bmesh/intern/bmesh_log.cc index 7a3497dbde9..51ac12ec526 100644 --- a/source/blender/bmesh/intern/bmesh_log.cc +++ b/source/blender/bmesh/intern/bmesh_log.cc @@ -98,7 +98,7 @@ template<typename T> struct BMID { }; template<typename T> struct BMLogElem { - BMID<T> id; + BMID<T> id = BMID<T>(-1); void *customdata = nullptr; char flag = 0; }; @@ -108,7 +108,8 @@ template<typename T> struct LogElemAlloc { LogElemAlloc() { - pool = BLI_mempool_create(sizeof(T), 0, 256, 0); + /* We need an iterable pool to call individual destructors in ~LogElemAlloc(). */ + pool = BLI_mempool_create(sizeof(T), 0, 256, BLI_MEMPOOL_ALLOW_ITER); } LogElemAlloc(const LogElemAlloc &b) = delete; @@ -133,15 +134,21 @@ template<typename T> struct LogElemAlloc { ~LogElemAlloc() { if (pool) { + BLI_mempool_iter iter; + BLI_mempool_iternew(pool, &iter); + while (void *entry = BLI_mempool_iterstep(&iter)) { + T *ptr = static_cast<T *>(entry); + ptr->~T(); + } + BLI_mempool_destroy(pool); } } T *alloc() { - void *ret = BLI_mempool_alloc(pool); - memset(ret, 0, sizeof(T)); - return static_cast<T *>(ret); + void *mem = BLI_mempool_alloc(pool); + return new (mem) T(); } void free(T *elem) @@ -158,8 +165,8 @@ struct BMLogVert : public BMLogElem<BMVert> { }; struct BMLogEdge : public BMLogElem<BMEdge> { - BMID<BMVert> v1; - BMID<BMVert> v2; + BMID<BMVert> v1 = BMID<BMVert>(-1); + BMID<BMVert> v2 = BMID<BMVert>(-1); }; struct BMLogFace : public BMLogElem<BMFace> { @@ -210,9 +217,12 @@ struct BMLogSetDiff : public BMLogSetBase { void add_vert(BMesh *bm, BMVert *v); void remove_vert(BMesh *bm, BMVert *v); void modify_vert(BMesh *bm, BMVert *v); - void add_face(BMesh *bm, BMFace *v); - void remove_face(BMesh *bm, BMFace *v); - void modify_face(BMesh *bm, BMFace *v); + void add_edge(BMesh *bm, BMEdge *e); + void remove_edge(BMesh *bm, BMEdge *e); + void modify_edge(BMesh *bm, BMEdge *e); + void add_face(BMesh *bm, BMFace *f); + void remove_face(BMesh *bm, BMFace *f); + void modify_face(BMesh *bm, BMFace *f); void undo(BMesh *bm, BMLogCallbacks *callbacks) override; void redo(BMesh *bm, BMLogCallbacks *callbacks) override; @@ -226,15 +236,24 @@ struct BMLogSetDiff : public BMLogSetBase { void swap_verts(BMesh *bm, blender::Map<BMID<BMVert>, BMLogVert *> verts, BMLogCallbacks *callbacks); + void restore_edges(BMesh *bm, + blender::Map<BMID<BMEdge>, BMLogEdge *> edges, + BMLogCallbacks *callbacks); + void remove_edges(BMesh *bm, + blender::Map<BMID<BMEdge>, BMLogEdge *> edges, + BMLogCallbacks *callbacks); + void swap_edges(BMesh *bm, + blender::Map<BMID<BMEdge>, BMLogEdge *> edges, + BMLogCallbacks *callbacks); void restore_faces(BMesh *bm, - blender::Map<BMID<BMVert>, BMLogVert *> verts, + blender::Map<BMID<BMFace>, BMLogFace *> faces, BMLogCallbacks *callbacks); void remove_faces(BMesh *bm, - blender::Map<BMID<BMVert>, BMLogVert *> verts, + blender::Map<BMID<BMFace>, BMLogFace *> faces, BMLogCallbacks *callbacks); void swap_faces(BMesh *bm, - blender::Map<BMID<BMVert>, BMLogVert *> verts, + blender::Map<BMID<BMFace>, BMLogFace *> faces, BMLogCallbacks *callbacks); }; @@ -497,6 +516,22 @@ struct BMLogEntry { swap_v3_v3(v->no, lv->no); } + ATTR_NO_OPT void swap_logedge(BMesh *bm, BMID<BMEdge> id, BMEdge *e, BMLogEdge *le) + { + if (e->head.data && le->customdata) { + CustomData_bmesh_swap_data(&edata, &bm->edata, le->customdata, &e->head.data); + } + } + + ATTR_NO_OPT void swap_logface(BMesh *bm, BMID<BMFace> id, BMFace *f, BMLogFace *lf) + { + if (f->head.data && lf->customdata) { + CustomData_bmesh_swap_data(&pdata, &bm->pdata, lf->customdata, &f->head.data); + } + + std::swap(f->head.hflag, lf->flag); + } + ATTR_NO_OPT BMLogVert *alloc_logvert(BMesh *bm, BMVert *v) { BMID<BMVert> id = get_elem_id<BMVert>(bm, v); @@ -529,6 +564,90 @@ struct BMLogEntry { copy_v3_v3(v->no, lv->no); } + BMLogEdge *alloc_logedge(BMesh *bm, BMEdge *e) + { + BMLogEdge *le = epool.alloc(); + + CustomData_bmesh_copy_data(&bm->edata, &edata, e->head.data, &le->customdata); + le->id = get_elem_id<BMEdge>(bm, e); + le->v1 = get_elem_id<BMVert>(bm, e->v1); + le->v2 = get_elem_id<BMVert>(bm, e->v2); + + return le; + } + + void update_logedge(BMesh *bm, BMEdge *e, BMLogEdge *le) + { + le->flag = e->head.hflag; + CustomData_bmesh_copy_data(&bm->edata, &edata, e->head.data, &le->customdata); + } + + void free_logedge(BMesh *bm, BMLogEdge *e) + { + epool.free(e); + } + + BMLogFace *alloc_logface(BMesh *bm, BMFace *f) + { + BMLogFace *lf = fpool.alloc(); + + lf->id = get_elem_id<BMFace>(bm, f); + lf->flag = f->head.hflag; + CustomData_bmesh_copy_data(&bm->pdata, &pdata, f->head.data, &lf->customdata); + + BMLoop *l = f->l_first; + do { + lf->verts.append(get_elem_id<BMVert>(bm, l->v)); + void *loop_customdata = nullptr; + + if (l->head.data) { + CustomData_bmesh_copy_data(&bm->ldata, &ldata, l->head.data, &loop_customdata); + } + + lf->loop_customdata.append(loop_customdata); + } while ((l = l->next) != f->l_first); + + return lf; + } + + void update_logface(BMesh *bm, BMLogFace *lf, BMFace *f) + { + lf->flag = f->head.hflag; + CustomData_bmesh_copy_data(&bm->pdata, &pdata, f->head.data, &lf->customdata); + + if (f->len != lf->verts.size()) { + printf("%s: error: face length changed.\n", __func__); + return; + } + + BMLoop *l = f->l_first; + int i = 0; + do { + void *loop_customdata = nullptr; + + if (l->head.data) { + CustomData_bmesh_copy_data(&bm->ldata, &ldata, l->head.data, &loop_customdata); + } + + lf->loop_customdata[i++] = loop_customdata; + } while ((l = l->next) != f->l_first); + } + + void free_logface(BMesh *bm, BMLogFace *lf) + { + if (lf->loop_customdata[0]) { + for (int i = 0; i < lf->verts.size(); i++) { + BLI_mempool_free(ldata.pool, lf->loop_customdata[i]); + } + } + + if (lf->customdata) { + BLI_mempool_free(pdata.pool, lf->customdata); + } + + fpool.free(lf); + } + void add_vert(BMesh *bm, BMVert *v) { current_diff_set(bm)->add_vert(bm, v); @@ -544,6 +663,21 @@ struct BMLogEntry { current_diff_set(bm)->modify_vert(bm, v); } + void add_edge(BMesh *bm, BMEdge *e) + { + current_diff_set(bm)->add_edge(bm, e); + } + + void remove_edge(BMesh *bm, BMEdge *e) + { + current_diff_set(bm)->remove_edge(bm, e); + } + + void modify_edge(BMesh *bm, BMEdge *e) + { + current_diff_set(bm)->modify_edge(bm, e); + } + void add_face(BMesh *bm, BMFace *f) { current_diff_set(bm)->add_face(bm, f); @@ -557,14 +691,15 @@ struct BMLogEntry { current_diff_set(bm)->modify_face(bm, f); } - void undo(BMesh *bm, BMLogCallbacks *callbacks) + ATTR_NO_OPT void undo(BMesh *bm, BMLogCallbacks *callbacks) { for (int i = sets.size() - 1; i >= 0; i--) { + printf(" - %d of %d\n", i, (int)(sets.size() - 1)); sets[i]->undo(bm, callbacks); } } - void redo(BMesh *bm, BMLogCallbacks *callbacks) + ATTR_NO_OPT void redo(BMesh *bm, BMLogCallbacks *callbacks) { for (int i = 0; i < sets.size(); i++) { sets[i]->redo(bm, callbacks); @@ -592,7 +727,7 @@ struct BMLog { BMIdMap *idmap = nullptr; BMLogEntry *current_entry = nullptr; BMLogEntry *first_entry = nullptr; - int refcount = 0; + int refcount = 1; bool dead = false; BMLog(BMIdMap *_idmap) : idmap(_idmap) @@ -697,6 +832,24 @@ struct BMLog { current_entry->modify_vert(bm, v); } + void add_edge(BMesh *bm, BMEdge *e) + { + ensure_entry(bm); + current_entry->add_edge(bm, e); + } + + void remove_edge(BMesh *bm, BMEdge *e) + { + ensure_entry(bm); + current_entry->remove_edge(bm, e); + } + + void modify_edge(BMesh *bm, BMEdge *e) + { + ensure_entry(bm); + current_entry->modify_edge(bm, e); + } + void add_face(BMesh *bm, BMFace *f) { ensure_entry(bm); @@ -747,10 +900,10 @@ void BMLogSetDiff::add_vert(BMesh *bm, BMVert *v) { BMID<BMVert> id = entry->get_elem_id(bm, v); - BMLogVert *modified_lv = modified_verts.lookup(id); + BMLogVert **modified_lv = modified_verts.lookup_ptr(id); if (modified_lv) { modified_verts.remove(id); - entry->free_logvert(modified_lv); + entry->free_logvert(*modified_lv); } if (added_verts.contains(id)) { @@ -764,10 +917,10 @@ void BMLogSetDiff::remove_vert(BMesh *bm, BMVert *v) { BMID<BMVert> id = entry->get_elem_id(bm, v); - BMLogVert *added_lv = added_verts.lookup(id); + BMLogVert **added_lv = added_verts.lookup_ptr(id); if (added_lv) { added_verts.remove(id); - entry->free_logvert(added_lv); + entry->free_logvert(*added_lv @@ 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