[Bf-blender-cvs] [2e5e966536e] blender2.8-snapping_with_occlusion: BKE: bvhutils: Adds support for bvhtrees from loose verts.
Germano
noreply at git.blender.org
Mon May 7 01:08:57 CEST 2018
Commit: 2e5e966536e8e2cdebcbddc521cb9dbece75d797
Author: Germano
Date: Fri May 4 19:37:59 2018 -0300
Branches: blender2.8-snapping_with_occlusion
https://developer.blender.org/rB2e5e966536e8e2cdebcbddc521cb9dbece75d797
BKE: bvhutils: Adds support for bvhtrees from loose verts.
===================================================================
M source/blender/blenkernel/BKE_bvhutils.h
M source/blender/blenkernel/intern/bvhutils.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index 1b4bb08756b..ad7cd559f9e 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -182,7 +182,9 @@ enum {
BVHTREE_FROM_FACES = 2,
BVHTREE_FROM_LOOPTRI = 3,
- BVHTREE_FROM_EM_LOOPTRI = 4,
+ BVHTREE_FROM_LOOSEVERTS = 4,
+
+ BVHTREE_FROM_EM_LOOPTRI = 5,
};
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 0240bb4b624..e4f2ae83372 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -976,6 +976,32 @@ BVHTree *bvhtree_from_mesh_looptri_ex(
return tree;
}
+static BLI_bitmap *loose_verts_map_get(
+ const MEdge *medge, int edges_num,
+ const MVert *mvert, int verts_num,
+ int *r_loose_vert_num)
+{
+ BLI_bitmap *loose_verts_mask = BLI_BITMAP_NEW(verts_num, __func__);
+ BLI_BITMAP_SET_ALL(loose_verts_mask, true, verts_num);
+
+ const MEdge *e = medge;
+ int num_linked_verts = 0;
+ for (;edges_num--; e++) {
+ if (BLI_BITMAP_TEST(loose_verts_mask, e->v1)) {
+ BLI_BITMAP_DISABLE(loose_verts_mask, e->v1);
+ num_linked_verts++;
+ }
+ if (BLI_BITMAP_TEST(loose_verts_mask, e->v2)) {
+ BLI_BITMAP_DISABLE(loose_verts_mask, e->v2);
+ num_linked_verts++;
+ }
+ }
+
+ *r_loose_vert_num = verts_num - num_linked_verts;
+
+ return loose_verts_mask;
+}
+
/**
* Builds or queries a bvhcache for the cache bvhtree of the request type.
*/
@@ -1005,6 +1031,7 @@ BVHTree *bvhtree_from_mesh_get(
switch (type) {
case BVHTREE_FROM_VERTS:
+ case BVHTREE_FROM_LOOSEVERTS:
raycast_callback = mesh_verts_spherecast;
mvert = DM_get_vert_array(dm, &vert_allocated);
@@ -1012,17 +1039,40 @@ BVHTree *bvhtree_from_mesh_get(
if (tree == NULL) {
/* Not in cache */
BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
- tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_VERTS);
+ tree = bvhcache_find(dm->bvhCache, type);
+
if (tree == NULL) {
+ BLI_bitmap *loose_verts_mask = NULL;
+ int loose_vert_num = -1;
+ int verts_num = dm->getNumVerts(dm);
+
+ if (type == BVHTREE_FROM_LOOSEVERTS) {
+ medge = DM_get_edge_array(dm, &edge_allocated);
+
+ loose_verts_mask = loose_verts_map_get(
+ medge, dm->getNumEdges(dm), mvert, verts_num, &loose_vert_num);
+
+ if (edge_allocated) {
+ MEM_freeN(medge);
+ edge_allocated = false;
+ }
+ medge = NULL;
+ }
+
tree = bvhtree_from_mesh_verts_create_tree(
- 0.0, tree_type, 6, mvert, dm->getNumVerts(dm), NULL, -1);
+ 0.0, tree_type, 6, mvert, verts_num, loose_verts_mask, loose_vert_num);
+
+ if (loose_verts_mask != NULL) {
+ MEM_freeN(loose_verts_mask);
+ }
if (tree) {
/* Save on cache for later use */
/* printf("BVHTree built and saved on cache\n"); */
- bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_VERTS);
+ bvhcache_insert(&dm->bvhCache, tree, type);
}
}
+
BLI_rw_mutex_unlock(&cache_rwlock);
}
break;
More information about the Bf-blender-cvs
mailing list