[Bf-blender-cvs] [bd5f5597c89] sculpt-dev: sculpt-dev: BMLog rewrite part 2
Joseph Eagar
noreply at git.blender.org
Mon Feb 6 11:22:18 CET 2023
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. @@
More information about the Bf-blender-cvs
mailing list