[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