[Bf-blender-cvs] [a68e8ac993a] master: BKE bvhutils: create and use new `BKE_bvhtree_from_editmesh_get`

mano-wii noreply at git.blender.org
Sat Aug 24 00:51:47 CEST 2019


Commit: a68e8ac993a169b63365ffc099d3f01581f6ce0b
Author: mano-wii
Date:   Fri Aug 23 19:45:09 2019 -0300
Branches: master
https://developer.blender.org/rBa68e8ac993a169b63365ffc099d3f01581f6ce0b

BKE bvhutils: create and use new `BKE_bvhtree_from_editmesh_get`

With this function it is easier to create and have control over editmeshes `BHVtree`s.

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

M	source/blender/blenkernel/BKE_bvhutils.h
M	source/blender/blenkernel/intern/bvhutils.c
M	source/blender/editors/transform/transform_snap_object.c

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

diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index d010f5dd836..a2d45625f42 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -93,19 +93,18 @@ typedef struct BVHTreeFromMesh {
  *
  * free_bvhtree_from_mesh should be called when the tree is no longer needed.
  */
-BVHTree *bvhtree_from_editmesh_verts(BVHTreeFromEditMesh *data,
-                                     struct BMEditMesh *em,
-                                     float epsilon,
-                                     int tree_type,
-                                     int axis,
-                                     BVHCache **bvh_cache);
+BVHTree *bvhtree_from_editmesh_verts(
+    BVHTreeFromEditMesh *data, struct BMEditMesh *em, float epsilon, int tree_type, int axis);
+
 BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data,
                                         struct BMEditMesh *em,
                                         const BLI_bitmap *mask,
                                         int verts_num_active,
                                         float epsilon,
                                         int tree_type,
-                                        int axis);
+                                        int axis,
+                                        const int bvh_cache_type,
+                                        BVHCache **bvh_cache);
 
 BVHTree *bvhtree_from_mesh_verts_ex(struct BVHTreeFromMesh *data,
                                     const struct MVert *vert,
@@ -119,19 +118,18 @@ BVHTree *bvhtree_from_mesh_verts_ex(struct BVHTreeFromMesh *data,
                                     const int bvh_cache_type,
                                     BVHCache **bvh_cache);
 
-BVHTree *bvhtree_from_editmesh_edges(BVHTreeFromEditMesh *data,
-                                     struct BMEditMesh *em,
-                                     float epsilon,
-                                     int tree_type,
-                                     int axis,
-                                     BVHCache **bvh_cache);
+BVHTree *bvhtree_from_editmesh_edges(
+    BVHTreeFromEditMesh *data, struct BMEditMesh *em, float epsilon, int tree_type, int axis);
+
 BVHTree *bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data,
                                         struct BMEditMesh *em,
                                         const BLI_bitmap *edges_mask,
                                         int edges_num_active,
                                         float epsilon,
                                         int tree_type,
-                                        int axis);
+                                        int axis,
+                                        const int bvh_cache_type,
+                                        BVHCache **bvh_cache);
 
 BVHTree *bvhtree_from_mesh_edges_ex(struct BVHTreeFromMesh *data,
                                     const struct MVert *vert,
@@ -161,12 +159,9 @@ BVHTree *bvhtree_from_mesh_faces_ex(struct BVHTreeFromMesh *data,
                                     const int bvh_cache_type,
                                     BVHCache **bvh_cache);
 
-BVHTree *bvhtree_from_editmesh_looptri(BVHTreeFromEditMesh *data,
-                                       struct BMEditMesh *em,
-                                       float epsilon,
-                                       int tree_type,
-                                       int axis,
-                                       BVHCache **bvhCache);
+BVHTree *bvhtree_from_editmesh_looptri(
+    BVHTreeFromEditMesh *data, struct BMEditMesh *em, float epsilon, int tree_type, int axis);
+
 BVHTree *bvhtree_from_editmesh_looptri_ex(BVHTreeFromEditMesh *data,
                                           struct BMEditMesh *em,
                                           const BLI_bitmap *mask,
@@ -174,7 +169,8 @@ BVHTree *bvhtree_from_editmesh_looptri_ex(BVHTreeFromEditMesh *data,
                                           float epsilon,
                                           int tree_type,
                                           int axis,
-                                          BVHCache **bvhCache);
+                                          const int bvh_cache_type,
+                                          BVHCache **bvh_cache);
 
 BVHTree *bvhtree_from_mesh_looptri_ex(struct BVHTreeFromMesh *data,
                                       const struct MVert *vert,
@@ -197,6 +193,12 @@ BVHTree *BKE_bvhtree_from_mesh_get(struct BVHTreeFromMesh *data,
                                    const int type,
                                    const int tree_type);
 
+BVHTree *BKE_bvhtree_from_editmesh_get(BVHTreeFromEditMesh *data,
+                                       struct BMEditMesh *em,
+                                       const int tree_type,
+                                       const int bvh_cache_type,
+                                       BVHCache **bvh_cache);
+
 /**
  * Frees data allocated by a call to bvhtree_from_mesh_*.
  */
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 1210e6f18ce..04e3b4ff2ae 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -425,11 +425,11 @@ static BVHTree *bvhtree_from_editmesh_verts_create_tree(float epsilon,
                                                         int tree_type,
                                                         int axis,
                                                         BMEditMesh *em,
-                                                        const int verts_num,
                                                         const BLI_bitmap *verts_mask,
                                                         int verts_num_active)
 {
   BM_mesh_elem_table_ensure(em->bm, BM_VERT);
+  const int verts_num = em->bm->totvert;
   if (verts_mask) {
     BLI_assert(IN_RANGE_INCL(verts_num_active, 0, verts_num));
   }
@@ -516,53 +516,53 @@ BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data,
                                         int verts_num_active,
                                         float epsilon,
                                         int tree_type,
-                                        int axis)
+                                        int axis,
+                                        const int bvh_cache_type,
+                                        BVHCache **bvh_cache)
 {
-  BVHTree *tree = bvhtree_from_editmesh_verts_create_tree(
-      epsilon, tree_type, axis, em, em->bm->totvert, verts_mask, verts_num_active);
-
-  if (tree) {
-    memset(data, 0, sizeof(*data));
-    data->tree = tree;
-    data->em = em;
-    data->nearest_callback = NULL;
-    data->raycast_callback = editmesh_verts_spherecast;
-  }
-
-  return tree;
-}
+  BVHTree *tree = NULL;
 
-BVHTree *bvhtree_from_editmesh_verts(BVHTreeFromEditMesh *data,
-                                     BMEditMesh *em,
-                                     float epsilon,
-                                     int tree_type,
-                                     int axis,
-                                     BVHCache **bvh_cache)
-{
   if (bvh_cache) {
     BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ);
-    data->cached = bvhcache_find(*bvh_cache, BVHTREE_FROM_EM_VERTS, &data->tree);
+    data->cached = bvhcache_find(*bvh_cache, bvh_cache_type, &data->tree);
     BLI_rw_mutex_unlock(&cache_rwlock);
 
     if (data->cached == false) {
       BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
-      data->cached = bvhcache_find(*bvh_cache, BVHTREE_FROM_EM_VERTS, &data->tree);
+      data->cached = bvhcache_find(*bvh_cache, bvh_cache_type, &data->tree);
       if (data->cached == false) {
-        data->tree = bvhtree_from_editmesh_verts_ex(data, em, NULL, -1, epsilon, tree_type, axis);
+        tree = bvhtree_from_editmesh_verts_create_tree(
+            epsilon, tree_type, axis, em, verts_mask, verts_num_active);
 
         /* Save on cache for later use */
         /* printf("BVHTree built and saved on cache\n"); */
-        bvhcache_insert(bvh_cache, data->tree, BVHTREE_FROM_EM_VERTS);
+        bvhcache_insert(bvh_cache, tree, bvh_cache_type);
         data->cached = true;
       }
       BLI_rw_mutex_unlock(&cache_rwlock);
     }
   }
   else {
-    data->tree = bvhtree_from_editmesh_verts_ex(data, em, NULL, -1, epsilon, tree_type, axis);
+    tree = bvhtree_from_editmesh_verts_create_tree(
+        epsilon, tree_type, axis, em, verts_mask, verts_num_active);
+  }
+
+  if (tree) {
+    memset(data, 0, sizeof(*data));
+    data->tree = tree;
+    data->em = em;
+    data->nearest_callback = NULL;
+    data->raycast_callback = editmesh_verts_spherecast;
+    data->cached = bvh_cache != NULL;
   }
 
-  return data->tree;
+  return tree;
+}
+
+BVHTree *bvhtree_from_editmesh_verts(
+    BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis)
+{
+  return bvhtree_from_editmesh_verts_ex(data, em, NULL, -1, epsilon, tree_type, axis, 0, NULL);
 }
 
 /**
@@ -628,11 +628,12 @@ static BVHTree *bvhtree_from_editmesh_edges_create_tree(float epsilon,
                                                         int tree_type,
                                                         int axis,
                                                         BMEditMesh *em,
-                                                        const int edges_num,
                                                         const BLI_bitmap *edges_mask,
                                                         int edges_num_active)
 {
   BM_mesh_elem_table_ensure(em->bm, BM_EDGE);
+  const int edges_num = em->bm->totedge;
+
   if (edges_mask) {
     BLI_assert(IN_RANGE_INCL(edges_num_active, 0, edges_num));
   }
@@ -732,55 +733,53 @@ BVHTree *bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data,
                                         int edges_num_active,
                                         float epsilon,
                                         int tree_type,
-                                        int axis)
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list