[Bf-blender-cvs] [1f270cf99b7] master: Snap: Use Map and unique_ptr for snap cache

Hans Goudey noreply at git.blender.org
Wed Apr 27 01:34:21 CEST 2022


Commit: 1f270cf99b76d8a92b4c964882da2873afbd114d
Author: Hans Goudey
Date:   Tue Apr 26 18:33:05 2022 -0500
Branches: master
https://developer.blender.org/rB1f270cf99b76d8a92b4c964882da2873afbd114d

Snap: Use Map and unique_ptr for snap cache

Use C++ types instead of GHash to make code easier to read and simpler.

Differential Revision: https://developer.blender.org/D14758

===================================================================

M	source/blender/editors/transform/transform_snap_object.cc

===================================================================

diff --git a/source/blender/editors/transform/transform_snap_object.cc b/source/blender/editors/transform/transform_snap_object.cc
index 8f04725e521..584c9642e5a 100644
--- a/source/blender/editors/transform/transform_snap_object.cc
+++ b/source/blender/editors/transform/transform_snap_object.cc
@@ -9,9 +9,9 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_float4x4.hh"
-#include "BLI_ghash.h"
 #include "BLI_kdopbvh.h"
 #include "BLI_listbase.h"
+#include "BLI_map.hh"
 #include "BLI_math.h"
 #include "BLI_math_vector.hh"
 #include "BLI_utildefines.h"
@@ -46,6 +46,7 @@
 
 using blender::float3;
 using blender::float4x4;
+using blender::Map;
 
 /* -------------------------------------------------------------------- */
 /** \name Internal Data Types
@@ -72,6 +73,26 @@ struct SnapData_Mesh {
   uint has_looptris : 1;
   uint has_loose_edge : 1;
   uint has_loose_vert : 1;
+
+  void clear()
+  {
+    for (int i = 0; i < ARRAY_SIZE(this->bvhtree); i++) {
+      if (!this->cached[i]) {
+        BLI_bvhtree_free(this->bvhtree[i]);
+      }
+      this->bvhtree[i] = nullptr;
+    }
+    free_bvhtree_from_mesh(&this->treedata_mesh);
+  }
+
+  ~SnapData_Mesh()
+  {
+    this->clear();
+  }
+
+#ifdef WITH_CXX_GUARDEDALLOC
+  MEM_CXX_CLASS_ALLOC_FUNCS("SnapData_Mesh")
+#endif
 };
 
 /* SnapObjectContext.cache.editmesh_map */
@@ -85,6 +106,26 @@ struct SnapData_EditMesh {
 
   struct Mesh_Runtime *mesh_runtime;
   float min[3], max[3];
+
+  void clear()
+  {
+    for (int i = 0; i < ARRAY_SIZE(this->bvhtree); i++) {
+      if (!this->cached[i]) {
+        BLI_bvhtree_free(this->bvhtree[i]);
+      }
+      this->bvhtree[i] = nullptr;
+    }
+    free_bvhtree_from_editmesh(&this->treedata_editmesh);
+  }
+
+  ~SnapData_EditMesh()
+  {
+    this->clear();
+  }
+
+#ifdef WITH_CXX_GUARDEDALLOC
+  MEM_CXX_CLASS_ALLOC_FUNCS("SnapData_EditMesh")
+#endif
 };
 
 struct SnapObjectContext {
@@ -92,13 +133,8 @@ struct SnapObjectContext {
 
   int flag;
 
-  struct {
-    /* Object -> SnapData_Mesh map */
-    GHash *mesh_map;
-
-    /* EditMesh -> SnapData_EditMesh map */
-    GHash *editmesh_map;
-  } cache;
+  Map<const Object *, std::unique_ptr<SnapData_Mesh>> mesh_caches;
+  Map<const BMEditMesh *, std::unique_ptr<SnapData_EditMesh>> editmesh_caches;
 
   /* Filter data, returns true to check this value */
   struct {
@@ -194,91 +230,16 @@ static void snap_editmesh_minmax(SnapObjectContext *sctx,
   }
 }
 
-static void snap_object_data_mesh_clear(SnapData_Mesh *sod)
-{
-  for (int i = 0; i < ARRAY_SIZE(sod->bvhtree); i++) {
-    if (!sod->cached[i]) {
-      BLI_bvhtree_free(sod->bvhtree[i]);
-    }
-    sod->bvhtree[i] = nullptr;
-  }
-  free_bvhtree_from_mesh(&sod->treedata_mesh);
-  memset(sod, 0x0, sizeof(*sod));
-}
-
-static void snap_object_data_editmesh_clear(SnapData_EditMesh *sod)
-{
-  for (int i = 0; i < ARRAY_SIZE(sod->bvhtree); i++) {
-    if (!sod->cached[i]) {
-      BLI_bvhtree_free(sod->bvhtree[i]);
-    }
-    sod->bvhtree[i] = nullptr;
-  }
-  free_bvhtree_from_editmesh(&sod->treedata_editmesh);
-  memset(sod, 0x0, sizeof(*sod));
-}
-
-static void snap_object_data_mesh_free(SnapData_Mesh *sod)
-{
-  snap_object_data_mesh_clear(sod);
-  MEM_delete(sod);
-}
-
-static void snap_object_data_editmesh_free(SnapData_EditMesh *sod)
-{
-  snap_object_data_editmesh_clear(sod);
-  MEM_delete(sod);
-}
-
-static SnapData_Mesh *snap_object_lookup_mesh(SnapObjectContext *sctx, Object *ob_eval)
-{
-  return static_cast<SnapData_Mesh *>(BLI_ghash_lookup(sctx->cache.mesh_map, ob_eval));
-}
-
-static SnapData_EditMesh *snap_object_lookup_editmesh(SnapObjectContext *sctx, Object *ob_eval)
-{
-  if (!sctx->cache.editmesh_map) {
-    return nullptr;
-  }
-  BMEditMesh *em = BKE_editmesh_from_object(ob_eval);
-  if (!em) {
-    return nullptr;
-  }
-  return static_cast<SnapData_EditMesh *>(BLI_ghash_lookup(sctx->cache.editmesh_map, em));
-}
-
-static void snap_object_data_mesh_free_ensure(SnapObjectContext *sctx, Object *ob_eval)
-{
-  auto *sod = snap_object_lookup_mesh(sctx, ob_eval);
-  if (!sod) {
-    return;
-  }
-  BLI_ghash_remove(sctx->cache.mesh_map, ob_eval, nullptr, nullptr);
-  snap_object_data_mesh_free(sod);
-}
-
-static void snap_object_data_editmesh_free_ensure(SnapObjectContext *sctx, Object *ob_eval)
-{
-  auto *sod = snap_object_lookup_editmesh(sctx, ob_eval);
-  if (!sod) {
-    return;
-  }
-  BMEditMesh *em = BKE_editmesh_from_object(ob_eval);
-  BLI_ghash_remove(sctx->cache.editmesh_map, em, nullptr, nullptr);
-  snap_object_data_editmesh_free(sod);
-}
-
 static SnapData_Mesh *snap_object_data_mesh_get(SnapObjectContext *sctx,
                                                 Object *ob_eval,
                                                 const Mesh *me_eval,
                                                 bool use_hide)
 {
   SnapData_Mesh *sod;
-  void **sod_p;
   bool init = false;
 
-  if (BLI_ghash_ensure_p(sctx->cache.mesh_map, ob_eval, &sod_p)) {
-    sod = static_cast<SnapData_Mesh *>(*sod_p);
+  if (std::unique_ptr<SnapData_Mesh> *sod_p = sctx->mesh_caches.lookup_ptr(ob_eval)) {
+    sod = sod_p->get();
     bool is_dirty = false;
     if (sod->treedata_mesh.tree && sod->treedata_mesh.cached &&
         !bvhcache_has_tree(me_eval->runtime.bvh_cache, sod->treedata_mesh.tree)) {
@@ -312,15 +273,18 @@ static SnapData_Mesh *snap_object_data_mesh_get(SnapObjectContext *sctx,
     }
 
     if (is_dirty) {
-      snap_object_data_mesh_clear(sod);
+      sod->clear();
       init = true;
     }
   }
   else {
     /* Any existing #SnapData_EditMesh is now invalid. */
-    snap_object_data_editmesh_free_ensure(sctx, ob_eval);
+    sctx->editmesh_caches.remove(BKE_editmesh_from_object(ob_eval));
+
+    std::unique_ptr<SnapData_Mesh> sod_ptr = std::make_unique<SnapData_Mesh>();
+    sod = sod_ptr.get();
+    sctx->mesh_caches.add_new(ob_eval, std::move(sod_ptr));
 
-    *sod_p = sod = MEM_cnew<SnapData_Mesh>(__func__);
     init = true;
   }
 
@@ -336,7 +300,6 @@ static SnapData_Mesh *snap_object_data_mesh_get(SnapObjectContext *sctx,
     BLI_assert(!me_eval->mvert || sod->treedata_mesh.vert_normals);
     BLI_assert(sod->treedata_mesh.loop == me_eval->mloop);
     BLI_assert(!me_eval->mpoly || sod->treedata_mesh.looptri);
-    BLI_assert(sod->has_looptris == false);
 
     sod->has_looptris = sod->treedata_mesh.tree != nullptr;
 
@@ -374,18 +337,13 @@ static SnapData_EditMesh *snap_object_data_editmesh_get(SnapObjectContext *sctx,
                                                         BMEditMesh *em)
 {
   SnapData_EditMesh *sod;
-  void **sod_p;
   bool init = false;
 
   /* Any existing #SnapData_Mesh is now invalid. */
-  snap_object_data_mesh_free_ensure(sctx, ob_eval);
-
-  if (sctx->cache.editmesh_map == nullptr) {
-    sctx->cache.editmesh_map = BLI_ghash_ptr_new(__func__);
-  }
+  sctx->mesh_caches.remove(ob_eval);
 
-  if (BLI_ghash_ensure_p(sctx->cache.editmesh_map, em, &sod_p)) {
-    sod = static_cast<SnapData_EditMesh *>(*sod_p);
+  if (std::unique_ptr<SnapData_EditMesh> *sod_p = sctx->editmesh_caches.lookup_ptr(em)) {
+    sod = sod_p->get();
     bool is_dirty = false;
     /* Check if the geometry has changed. */
     if (sod->treedata_editmesh.em != em) {
@@ -420,12 +378,14 @@ static SnapData_EditMesh *snap_object_data_editmesh_get(SnapObjectContext *sctx,
     }
 
     if (is_dirty) {
-      snap_object_data_editmesh_clear(sod);
+      sod->clear();
       init = true;
     }
   }
   else {
-    *sod_p = sod = MEM_cnew<SnapData_EditMesh>(__func__);
+    std::unique_ptr<SnapData_EditMesh> sod_ptr = std::make_unique<SnapData_EditMesh>();
+    sod = sod_ptr.get();
+    sctx->editmesh_caches.add_new(em, std::move(sod_ptr));
     init = true;
   }
 
@@ -1596,16 +1556,16 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
   nearest.dist_sq = square_f(*dist_px);
 
   Nearest2dUserData nearest2d;
-  SnapData_Mesh *sod_mesh = snap_object_lookup_mesh(sctx, ob_eval);
+  std::unique_ptr<SnapData_Mesh> *sod_mesh = sctx->mesh_caches.lookup_ptr(ob_eval);
   if (sod_mesh) {
-    nearest2d_data_init_mesh(sod_mesh,
+    nearest2d_data_init_mesh(sod_mesh->get(),
                              sctx->runtime.view_proj == VIEW_PROJ_PERSP,
                              params->use_backface_culling,
                              &nearest2d);
 
-    BVHTreeFromMesh *treedata = &sod_mesh->treedata_mesh;
+    BVHTreeFromMesh *treedata = &sod_mesh->get()->treedata_mesh;
 
-    const MPoly *mp = &sod_mesh->poly[*r_index];
+    const MPoly *mp = &sod_mesh->get()->poly[*r_index];
     const MLoop *ml = &treedata->loop[mp->loopstart];
     if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) {
       elem = SCE_SNAP_MODE_EDGE;
@@ -1633,10 +1593,11 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
   }
   else {
     /* The object's #BMEditMesh was used to snap instead. */
-    SnapData_EditMesh *sod_editmesh = snap_object_lookup_editmesh(sctx, ob_eval);
-    BLI_assert(sod_editmesh != nullptr);
+    std::unique_ptr<SnapData_EditMesh> &sod_editmesh = sctx->editmesh_caches.lookup(
+        BKE_editmesh_from_object(ob_eval));
+    BLI_assert(sod_editmesh.get() != nullptr);
 
-    nearest2d_data_init_editmesh(sod_editmesh,
+    nearest2d_data_init_editmesh(sod_editmesh.get(),
                                  sctx->runtime.view_proj == VIEW_PROJ_PERSP,
                                  params->use_backface_culling,
                                  &nearest2d);
@@ -1718,17 +1679,18 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
 
   Nearest2dUserData nearest2d;
   {
-    SnapData_Mesh *sod_mesh = snap_object_lookup_mesh(sctx, ob_eval);
+    std::unique_ptr<SnapData_Mesh> *sod_mesh = sctx->mesh_caches.lookup_ptr(ob_eval);
     if (sod_mesh) {
-      nearest2d_data_init_mesh(sod_mesh,
+      nearest2d_data_init_mesh(sod_mesh->get(),
                                sctx->runtime.view_proj == VIEW_PROJ_PERSP,
                                params->use_backface_culling,
                                &nearest2d);
     }
     else {
       /* The object's #BMEditMesh was used to snap instead. */
-      SnapData_EditMesh *sod_editmesh = snap_object_lookup_editmesh(sctx, ob_eval);
-      nearest2d_data_init_editmesh(sod_editmes

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list