[Bf-blender-cvs] [037f7891115] master: Cleanup: Move transform_snap_object.c to C++

Hans Goudey noreply at git.blender.org
Mon Mar 28 22:00:00 CEST 2022


Commit: 037f7891115318e60a63ffcb1bf877b0bbc35d0f
Author: Hans Goudey
Date:   Mon Mar 28 14:59:42 2022 -0500
Branches: master
https://developer.blender.org/rB037f7891115318e60a63ffcb1bf877b0bbc35d0f

Cleanup: Move transform_snap_object.c to C++

This is meant to allow using C++ data structures in this file
as a performance improvement. Particularly `Vector` instead
of `ListBase` for `duplilist`.

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

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

M	source/blender/editors/include/ED_transform_snap_object_context.h
M	source/blender/editors/transform/CMakeLists.txt
R090	source/blender/editors/transform/transform_snap_object.c	source/blender/editors/transform/transform_snap_object.cc

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

diff --git a/source/blender/editors/include/ED_transform_snap_object_context.h b/source/blender/editors/include/ED_transform_snap_object_context.h
index a8a11cd7dda..2919001c5ce 100644
--- a/source/blender/editors/include/ED_transform_snap_object_context.h
+++ b/source/blender/editors/include/ED_transform_snap_object_context.h
@@ -21,11 +21,11 @@ struct Object;
 struct Scene;
 struct View3D;
 
-/* transform_snap_object.c */
+/* transform_snap_object.cc */
 
 /* ED_transform_snap_object_*** API */
 
-typedef enum {
+typedef enum eSnapSelect {
   SNAP_ALL = 0,
   SNAP_NOT_SELECTED = 1,
   SNAP_NOT_ACTIVE = 2,
@@ -33,7 +33,7 @@ typedef enum {
   SNAP_SELECTABLE = 4,
 } eSnapSelect;
 
-typedef enum {
+typedef enum eSnapEditType {
   SNAP_GEOM_FINAL = 0,
   SNAP_GEOM_CAGE = 1,
   SNAP_GEOM_EDIT = 2, /* Bmesh for mesh-type. */
@@ -59,13 +59,13 @@ struct SnapObjectHitDepth {
 /** parameters that define which objects will be used to snap. */
 struct SnapObjectParams {
   /* Special context sensitive handling for the active or selected object. */
-  char snap_select;
+  eSnapSelect snap_select;
   /* Geometry for snapping in edit mode. */
-  char edit_mode_type;
+  eSnapEditType edit_mode_type;
   /* snap to the closest element, use when using more than one snap type */
-  unsigned int use_occlusion_test : 1;
+  bool use_occlusion_test : true;
   /* exclude back facing geometry from snapping */
-  unsigned int use_backface_culling : 1;
+  bool use_backface_culling : true;
 };
 
 typedef struct SnapObjectContext SnapObjectContext;
diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index c8033d9d767..68c4f4e76ca 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -90,7 +90,7 @@ set(SRC
   transform_orientations.c
   transform_snap.c
   transform_snap_animation.c
-  transform_snap_object.c
+  transform_snap_object.cc
   transform_snap_sequencer.c
 
   transform.h
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.cc
similarity index 90%
rename from source/blender/editors/transform/transform_snap_object.c
rename to source/blender/editors/transform/transform_snap_object.cc
index 329c5104136..1c50b2fcebb 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.cc
@@ -4,7 +4,7 @@
  * \ingroup edtransform
  */
 
-#include <stdlib.h>
+#include <cstdlib>
 
 #include "MEM_guardedalloc.h"
 
@@ -55,11 +55,12 @@ enum eViewProj {
   VIEW_PROJ_PERSP = -1,
 };
 
-typedef struct SnapObjectData {
-  enum {
-    SNAP_MESH = 1,
-    SNAP_EDIT_MESH,
-  } type;
+struct SnapObjectData {
+  enum class Type {
+    Mesh,
+    EditMesh,
+  };
+  Type type;
 
   BVHTree *bvhtree[2]; /* MESH: loose edges, loose verts
                         * EDIT_MESH: verts, edges. */
@@ -67,7 +68,7 @@ typedef struct SnapObjectData {
 
   union {
     struct {
-      /* SNAP_MESH */
+      /* Type::Mesh */
       BVHTreeFromMesh treedata_mesh;
       const struct MPoly *poly;
       uint has_looptris : 1;
@@ -75,13 +76,13 @@ typedef struct SnapObjectData {
       uint has_loose_vert : 1;
     };
     struct {
-      /* SNAP_EDIT_MESH */
+      /* Type::EditMesh */
       BVHTreeFromEditMesh treedata_editmesh;
       float min[3], max[3];
       struct Mesh_Runtime *mesh_runtime;
     };
   };
-} SnapObjectData;
+};
 
 struct SnapObjectContext {
   Scene *scene;
@@ -129,14 +130,14 @@ struct SnapObjectContext {
  * \{ */
 
 /* Mesh used for snapping.
- * If NULL the BMesh should be used. */
+ * If nullptr the BMesh should be used. */
 static Mesh *mesh_for_snap(Object *ob_eval, eSnapEditType edit_mode_type, bool *r_use_hide)
 {
   Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval);
   bool use_hide = false;
   if (BKE_object_is_in_editmode(ob_eval)) {
     if (edit_mode_type == SNAP_GEOM_EDIT) {
-      return NULL;
+      return nullptr;
     }
 
     Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(ob_eval);
@@ -144,14 +145,14 @@ static Mesh *mesh_for_snap(Object *ob_eval, eSnapEditType edit_mode_type, bool *
 
     if ((edit_mode_type == SNAP_GEOM_FINAL) && editmesh_eval_final) {
       if (editmesh_eval_final->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH) {
-        return NULL;
+        return nullptr;
       }
       me_eval = editmesh_eval_final;
       use_hide = true;
     }
     else if ((edit_mode_type == SNAP_GEOM_CAGE) && editmesh_eval_cage) {
       if (editmesh_eval_cage->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH) {
-        return NULL;
+        return nullptr;
       }
       me_eval = editmesh_eval_cage;
       use_hide = true;
@@ -185,24 +186,24 @@ static void bm_mesh_minmax(BMesh *bm, float r_min[3], float r_max[3])
 
 static void snap_object_data_mesh_clear(SnapObjectData *sod)
 {
-  BLI_assert(sod->type == SNAP_MESH);
+  BLI_assert(sod->type == SnapObjectData::Type::Mesh);
   for (int i = 0; i < ARRAY_SIZE(sod->bvhtree); i++) {
     if (!sod->cached[i]) {
       BLI_bvhtree_free(sod->bvhtree[i]);
     }
-    sod->bvhtree[i] = NULL;
+    sod->bvhtree[i] = nullptr;
   }
   free_bvhtree_from_mesh(&sod->treedata_mesh);
 }
 
 static void snap_object_data_editmesh_clear(SnapObjectData *sod)
 {
-  BLI_assert(sod->type == SNAP_EDIT_MESH);
+  BLI_assert(sod->type == SnapObjectData::Type::EditMesh);
   for (int i = 0; i < ARRAY_SIZE(sod->bvhtree); i++) {
     if (!sod->cached[i]) {
       BLI_bvhtree_free(sod->bvhtree[i]);
     }
-    sod->bvhtree[i] = NULL;
+    sod->bvhtree[i] = nullptr;
   }
   free_bvhtree_from_editmesh(&sod->treedata_editmesh);
 }
@@ -210,11 +211,11 @@ static void snap_object_data_editmesh_clear(SnapObjectData *sod)
 static void snap_object_data_clear(SnapObjectData *sod)
 {
   switch (sod->type) {
-    case SNAP_MESH: {
+    case SnapObjectData::Type::Mesh: {
       snap_object_data_mesh_clear(sod);
       break;
     }
-    case SNAP_EDIT_MESH: {
+    case SnapObjectData::Type::EditMesh: {
       snap_object_data_editmesh_clear(sod);
       break;
     }
@@ -224,13 +225,15 @@ static void snap_object_data_clear(SnapObjectData *sod)
 
 static SnapObjectData *snap_object_data_lookup(SnapObjectContext *sctx, Object *ob_eval)
 {
-  SnapObjectData *sod = BLI_ghash_lookup(sctx->cache.object_map, ob_eval);
-  if (sod == NULL) {
-    if (sctx->cache.data_to_object_map != NULL) {
-      ob_eval = BLI_ghash_lookup(sctx->cache.data_to_object_map, ob_eval->data);
+  SnapObjectData *sod = static_cast<SnapObjectData *>(
+      BLI_ghash_lookup(sctx->cache.object_map, ob_eval));
+  if (sod == nullptr) {
+    if (sctx->cache.data_to_object_map != nullptr) {
+      ob_eval = static_cast<Object *>(
+          BLI_ghash_lookup(sctx->cache.data_to_object_map, ob_eval->data));
       /* Could be NULl when mixing edit-mode and non edit-mode objects. */
-      if (ob_eval != NULL) {
-        sod = BLI_ghash_lookup(sctx->cache.object_map, ob_eval);
+      if (ob_eval != nullptr) {
+        sod = static_cast<SnapObjectData *>(BLI_ghash_lookup(sctx->cache.object_map, ob_eval));
       }
     }
   }
@@ -247,9 +250,9 @@ static SnapObjectData *snap_object_data_mesh_get(SnapObjectContext *sctx,
   bool init = false;
 
   if (BLI_ghash_ensure_p(sctx->cache.object_map, ob_eval, &sod_p)) {
-    sod = *sod_p;
+    sod = static_cast<SnapObjectData *>(*sod_p);
     bool is_dirty = false;
-    if (sod->type != SNAP_MESH) {
+    if (sod->type != SnapObjectData::Type::Mesh) {
       is_dirty = true;
     }
     else if (sod->treedata_mesh.tree && sod->treedata_mesh.cached &&
@@ -290,21 +293,22 @@ static SnapObjectData *snap_object_data_mesh_get(SnapObjectContext *sctx,
     }
   }
   else {
-    sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
+    *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
+    sod = static_cast<SnapObjectData *>(*sod_p);
     init = true;
   }
 
   if (init) {
-    sod->type = SNAP_MESH;
+    sod->type = SnapObjectData::Type::Mesh;
 
     /* The BVHTree from looptris is always required. */
-    BLI_assert(sod->treedata_mesh.tree == NULL);
+    BLI_assert(sod->treedata_mesh.tree == nullptr);
     BKE_bvhtree_from_mesh_get(&sod->treedata_mesh,
                               me_eval,
                               use_hide ? BVHTREE_FROM_LOOPTRI_NO_HIDDEN : BVHTREE_FROM_LOOPTRI,
                               4);
 
-    if (sod->treedata_mesh.tree == NULL) {
+    if (sod->treedata_mesh.tree == nullptr) {
       sod->treedata_mesh.vert = me_eval->mvert;
       sod->treedata_mesh.vert_normals = BKE_mesh_vertex_normals_ensure(me_eval);
       sod->treedata_mesh.loop = me_eval->mloop;
@@ -312,10 +316,10 @@ static SnapObjectData *snap_object_data_mesh_get(SnapObjectContext *sctx,
       BLI_assert(sod->has_looptris == false);
     }
     else {
-      BLI_assert(sod->treedata_mesh.vert != NULL);
-      BLI_assert(sod->treedata_mesh.vert_normals != NULL);
-      BLI_assert(sod->treedata_mesh.loop != NULL);
-      BLI_assert(sod->treedata_mesh.looptri != NULL);
+      BLI_assert(sod->treedata_mesh.vert != nullptr);
+      BLI_assert(sod->treedata_mesh.vert_normals != nullptr);
+      BLI_assert(sod->treedata_mesh.loop != nullptr);
+      BLI_assert(sod->treedata_mesh.looptri != nullptr);
       sod->has_looptris = true;
     }
 
@@ -357,12 +361,12 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx,
   {
     /* Use object-data as the key in ghash since the editmesh
      * is used to create bvhtree and is the same for each linked object. */
-    if (sctx->cache.data_to_object_map == NULL) {
+    if (sctx->cache.data_to_object_map == nullptr) {
       sctx->cache.data_to_object_map = BLI_ghash_ptr_new(__func__);
     }
     void **ob_p;
     if (BLI_ghash_ensure_p(sctx->cache.data_to_object_map, ob_eval->data, &ob_p)) {
-      ob_eval = *ob_p;
+      ob_eval = static_cast<Object *>(*ob_p);
     }
     else {
       *ob_p = ob_eval;
@@ -370,10 +374,10 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx,
   }
 
   if (BLI_ghash_ensure_p(sctx->cache.object_map, ob_eval, &sod_p)) {
-    sod = *sod_p;
+ 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list