[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