[Bf-blender-cvs] [edb5e194426] master: Transform Snap: Unify SnapObjectData struct

Germano Cavalcante noreply at git.blender.org
Thu Feb 27 12:43:27 CET 2020


Commit: edb5e1944260075e5322b04d4ffbfd86f9a56ebf
Author: Germano Cavalcante
Date:   Thu Feb 27 08:42:44 2020 -0300
Branches: master
https://developer.blender.org/rBedb5e1944260075e5322b04d4ffbfd86f9a56ebf

Transform Snap: Unify SnapObjectData struct

This simplifies the code, and will allow to switch modes.

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

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

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

diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index c4358168adb..2ad3de1528f 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -19,9 +19,6 @@
  */
 
 #include <stdlib.h>
-#include <math.h>
-#include <float.h>
-#include <stdio.h>
 
 #include "MEM_guardedalloc.h"
 
@@ -34,10 +31,10 @@
 
 #include "DNA_armature_types.h"
 #include "DNA_curve_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_object_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_view3d_types.h"
 
@@ -50,19 +47,16 @@
 #include "BKE_layer.h"
 #include "BKE_main.h"
 #include "BKE_tracking.h"
-#include "BKE_context.h"
 #include "BKE_mesh.h"
 #include "BKE_mesh_runtime.h"
 
-#include "DEG_depsgraph.h"
 #include "DEG_depsgraph_query.h"
 
-#include "ED_transform.h"
 #include "ED_transform_snap_object_context.h"
 #include "ED_view3d.h"
 #include "ED_armature.h"
 
-#include "transform.h"
+#include "ED_transform.h"
 
 /* -------------------------------------------------------------------- */
 /** \name Internal Data Types
@@ -92,25 +86,27 @@ typedef struct SnapObjectData {
     SNAP_MESH = 1,
     SNAP_EDIT_MESH,
   } type;
-} SnapObjectData;
-
-typedef struct SnapObjectData_Mesh {
-  SnapObjectData sd;
-  BVHTreeFromMesh treedata;
-  const struct MPoly *poly;
-  BVHTree *bvhtree[2]; /* from loose verts and from loose edges */
-  uint has_looptris : 1;
-  uint has_loose_edge : 1;
-  uint has_loose_vert : 1;
 
-} SnapObjectData_Mesh;
+  BVHTree *bvhtree[2]; /* MESH: loose edges, loose verts
+                        * EDIT_MESH: verts, edges. */
+  bool cached[2];
 
-typedef struct SnapObjectData_EditMesh {
-  SnapObjectData sd;
-  BVHTreeFromEditMesh *bvh_trees[3];
-  float min[3], max[3];
-
-} SnapObjectData_EditMesh;
+  union {
+    struct {
+      /* SNAP_MESH */
+      BVHTreeFromMesh treedata_mesh;
+      const struct MPoly *poly;
+      uint has_looptris : 1;
+      uint has_loose_edge : 1;
+      uint has_loose_vert : 1;
+    };
+    struct {
+      /* SNAP_EDIT_MESH */
+      BVHTreeFromEditMesh treedata_editmesh;
+      float min[3], max[3];
+    };
+  };
+} SnapObjectData;
 
 struct SnapObjectContext {
   Main *bmain;
@@ -149,7 +145,7 @@ struct SnapObjectContext {
 /** \} */
 
 /* -------------------------------------------------------------------- */
-/** \name Common Utilities
+/** \name Snap Object Data
  * \{ */
 
 /**
@@ -166,6 +162,45 @@ 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);
+  for (int i = 0; i < ARRAY_SIZE(sod->bvhtree); i++) {
+    if (!sod->cached[i]) {
+      BLI_bvhtree_free(sod->bvhtree[i]);
+    }
+    sod->bvhtree[i] = NULL;
+  }
+  free_bvhtree_from_mesh(&sod->treedata_mesh);
+}
+
+static void snap_object_data_editmesh_clear(SnapObjectData *sod)
+{
+  BLI_assert(sod->type == SNAP_EDIT_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;
+  }
+  free_bvhtree_from_editmesh(&sod->treedata_editmesh);
+}
+
+static void snap_object_data_clear(SnapObjectData *sod)
+{
+  switch (sod->type) {
+    case SNAP_MESH: {
+      snap_object_data_mesh_clear(sod);
+      break;
+    }
+    case SNAP_EDIT_MESH: {
+      snap_object_data_editmesh_clear(sod);
+      break;
+    }
+  }
+  memset(&sod->type, 0x0, sizeof(*sod) - offsetof(SnapObjectData, type));
+}
+
 static SnapObjectData *snap_object_data_lookup(SnapObjectContext *sctx, Object *ob)
 {
   SnapObjectData *sod = BLI_ghash_lookup(sctx->cache.object_map, ob);
@@ -181,15 +216,17 @@ static SnapObjectData *snap_object_data_lookup(SnapObjectContext *sctx, Object *
   return sod;
 }
 
-static SnapObjectData_Mesh *snap_object_data_mesh_get(SnapObjectContext *sctx, Object *ob)
+static SnapObjectData *snap_object_data_mesh_get(SnapObjectContext *sctx, Object *ob)
 {
   void **sod_p;
   if (BLI_ghash_ensure_p(sctx->cache.object_map, ob, &sod_p)) {
     BLI_assert(((SnapObjectData *)*sod_p)->type == SNAP_MESH);
   }
   else {
-    SnapObjectData_Mesh *sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
-    sod->sd.type = SNAP_MESH;
+    SnapObjectData *sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
+
+    /* Init. */
+    sod->type = SNAP_MESH;
     /* start assuming that it has each of these element types */
     sod->has_looptris = true;
     sod->has_loose_edge = true;
@@ -199,9 +236,9 @@ static SnapObjectData_Mesh *snap_object_data_mesh_get(SnapObjectContext *sctx, O
   return *sod_p;
 }
 
-static SnapObjectData_EditMesh *snap_object_data_editmesh_get(SnapObjectContext *sctx,
-                                                              Object *ob,
-                                                              BMEditMesh *em)
+static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx,
+                                                     Object *ob,
+                                                     BMEditMesh *em)
 {
   void **sod_p;
 
@@ -224,15 +261,23 @@ static SnapObjectData_EditMesh *snap_object_data_editmesh_get(SnapObjectContext
     BLI_assert(((SnapObjectData *)*sod_p)->type == SNAP_EDIT_MESH);
   }
   else {
-    SnapObjectData_EditMesh *sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena,
-                                                                sizeof(*sod));
-    sod->sd.type = SNAP_EDIT_MESH;
+    SnapObjectData *sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
+
+    /* Init. */
+    sod->type = SNAP_EDIT_MESH;
+    sod->treedata_editmesh.em = em;
     bm_mesh_minmax(em->bm, sod->min, sod->max);
   }
 
   return *sod_p;
 }
 
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Iterator
+ * \{ */
+
 typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx,
                                      bool is_obedit,
                                      bool use_backface_culling,
@@ -516,9 +561,9 @@ static bool raycastMesh(SnapObjectContext *sctx,
     len_diff = 0.0f;
   }
 
-  SnapObjectData_Mesh *sod = snap_object_data_mesh_get(sctx, ob);
+  SnapObjectData *sod = snap_object_data_mesh_get(sctx, ob);
 
-  BVHTreeFromMesh *treedata = &sod->treedata;
+  BVHTreeFromMesh *treedata = &sod->treedata_mesh;
 
   /* The tree is owned by the Mesh and may have been freed since we last used. */
   if (treedata->tree) {
@@ -668,7 +713,7 @@ static bool raycastEditMesh(SnapObjectContext *sctx,
     local_depth *= local_scale;
   }
 
-  SnapObjectData_EditMesh *sod = snap_object_data_editmesh_get(sctx, ob, em);
+  SnapObjectData *sod = snap_object_data_editmesh_get(sctx, ob, em);
 
   /* Test BoundBox */
 
@@ -690,24 +735,21 @@ static bool raycastEditMesh(SnapObjectContext *sctx,
     len_diff = 0.0f;
   }
 
-  if (sod->bvh_trees[2] == NULL) {
-    sod->bvh_trees[2] = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(BVHTreeFromEditMesh));
-  }
-
-  BVHTreeFromEditMesh *treedata = sod->bvh_trees[2];
+  BVHTreeFromEditMesh *treedata = &sod->treedata_editmesh;
 
   BVHCache **em_bvh_cache = &((Mesh *)ob->data)->runtime.bvh_cache;
 
-  if (sctx->callbacks.edit_mesh.test_face_fn == NULL) {
+  if (treedata->tree && treedata->cached) {
     /* The tree is owned by the Mesh and may have been freed since we last used! */
-    if (treedata->tree && !bvhcache_has_tree(*em_bvh_cache, treedata->tree)) {
-      free_bvhtree_from_editmesh(treedata);
+    if (!bvhcache_has_tree(*em_bvh_cache, treedata->tree)) {
+      treedata->tree = NULL;
     }
   }
 
   if (treedata->tree == NULL) {
     /* Get original version of the edit_mesh. */
-    BMEditMesh *em_orig = BKE_editmesh_from_object(DEG_get_original_object(ob));
+    BLI_assert(sod->treedata_editmesh.em == BKE_editmesh_from_object(DEG_get_original_object(ob)));
+    BMEditMesh *em_orig = sod->treedata_editmesh.em;
 
     if (sctx->callbacks.edit_mesh.test_face_fn) {
       BMesh *bm = em_orig->bm;
@@ -796,7 +838,7 @@ static bool raycastEditMesh(SnapObjectContext *sctx,
 
         if (r_index) {
           /* Get original version of the edit_mesh. */
-          BMEditMesh *em_orig = BKE_editmesh_from_object(DEG_get_original_object(ob));
+          BMEditMesh *em_orig = sod->treedata_editmesh.em;
 
           *r_index = BM_elem_index_get(em_orig->looptris[hit.index][0]->f);
         }
@@ -850,7 +892,10 @@ static bool raycastObj(SnapObjectContext *sctx,
       Mesh *me = ob->data;
       bool use_hide = false;
       if (BKE_object_is_in_editmode(ob)) {
-        BMEditMesh *em = BKE_editmesh_from_object(ob);
+        /* Strange, sometimes the `em` of the evaluated object has
+         * uninitialized memory. Need to be investigated.
+         * Use the `em` of the original object then. */
+        BMEditMesh *em = BKE_editmesh_from_object(DEG_get_original_object(ob));
         if (use_obedit) {
           retval = raycastEditMesh(sctx,
                                    ray_start,
@@ -1400,14 +1445,14 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
   BLI_assert(sod != NULL);
 
   if (sod->type == SNAP_MESH) {
-    BVHTreeFromMesh *treedata = &((SnapObjectData_Mesh *)sod)->treedata;
+    BVHTreeFromMesh *treedata = &sod->treedata_mesh;
 
     nearest2d.userdata = treedata;
     nearest2d.get_vert_co = (Nearest2DGetVertCoCallback)cb_mvert_co_get;
     nearest2d.get_edge_verts_index = (Nearest2DGetEdgeVertsCallback)cb_medge_verts_get;
     nearest2d.copy_vert_no = (Nearest2DCopyVertNoCallback)cb_mvert_no_copy;
 
-    const MPoly *mp = &((SnapObjectData_Mesh *)sod)->poly[*r_index];
+    const MPoly *mp = &sod->poly[*r_index];
     const MLoop *ml = &treedata->loop[mp->loopstart];
     if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
       elem = SCE_SNAP_MODE_EDGE;
@@ -1435,7 +1480,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
   }
   else {
     BLI_assert(sod->type =

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list