[Bf-blender-cvs] [e78ef828271] master: BKE: bvhutils: Unifies static functions oh bvhtrees creation.

Germano noreply at git.blender.org
Fri May 4 16:15:30 CEST 2018


Commit: e78ef828271568fa8cc950e1bc7459d3b2123d0b
Author: Germano
Date:   Fri May 4 11:15:21 2018 -0300
Branches: master
https://developer.blender.org/rBe78ef828271568fa8cc950e1bc7459d3b2123d0b

BKE: bvhutils: Unifies static functions oh bvhtrees creation.

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

M	source/blender/blenkernel/intern/bvhutils.c

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

diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 440db911298..181afdcaf1e 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -499,61 +499,6 @@ BVHTree *bvhtree_from_editmesh_verts(
 	        epsilon, tree_type, axis);
 }
 
-/* Builds a bvh tree where nodes are the vertices of the given dm
- * and stores the BVHTree in dm->bvhCache */
-static BVHTree *bvhtree_from_mesh_verts(
-        BVHTreeFromMesh *data, DerivedMesh *dm,
-        float epsilon, int tree_type, int axis)
-{
-	BVHTree *tree;
-	MVert *vert;
-	bool vert_allocated;
-
-	BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ);
-	tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_VERTS);
-	BLI_rw_mutex_unlock(&cache_rwlock);
-
-	vert = DM_get_vert_array(dm, &vert_allocated);
-
-	/* Not in cache */
-	if (tree == NULL) {
-		BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
-		tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_VERTS);
-		if (tree == NULL) {
-
-			int vert_num = dm->getNumVerts(dm);
-			BLI_assert(vert_num != 0);
-
-			tree = bvhtree_from_mesh_verts_create_tree(
-				epsilon, tree_type, axis,
-				vert, vert_num, NULL, -1);
-
-			if (tree) {
-				/* Save on cache for later use */
-				/* printf("BVHTree built and saved on cache\n"); */
-				bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_VERTS);
-			}
-		}
-		BLI_rw_mutex_unlock(&cache_rwlock);
-	}
-	else {
-		/* printf("BVHTree is already build, using cached tree\n"); */
-	}
-
-	if (tree) {
-		/* Setup BVHTreeFromMesh */
-		bvhtree_from_mesh_verts_setup_data(
-		        data, tree, true, epsilon, vert, vert_allocated);
-	}
-	else {
-		if (vert_allocated) {
-			MEM_freeN(vert);
-		}
-		memset(data, 0, sizeof(*data));
-	}
-	return tree;
-}
-
 /**
  * Builds a bvh tree where nodes are the given vertices (note: does not copy given mverts!).
  * \param vert_allocated if true, vert freeing will be done when freeing data.
@@ -708,59 +653,6 @@ BVHTree *bvhtree_from_editmesh_edges(
 	        epsilon, tree_type, axis);
 }
 
-/* Builds a bvh tree where nodes are the edges of the given dm */
-static BVHTree *bvhtree_from_mesh_edges(
-        BVHTreeFromMesh *data, DerivedMesh *dm,
-        float epsilon, int tree_type, int axis)
-{
-	BVHTree *tree;
-	MVert *vert;
-	MEdge *edge;
-	bool vert_allocated, edge_allocated;
-
-	BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ);
-	tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_EDGES);
-	BLI_rw_mutex_unlock(&cache_rwlock);
-
-	vert = DM_get_vert_array(dm, &vert_allocated);
-	edge = DM_get_edge_array(dm, &edge_allocated);
-
-	/* Not in cache */
-	if (tree == NULL) {
-		BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
-		tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_EDGES);
-		if (tree == NULL) {
-			tree = bvhtree_from_mesh_edges_create_tree(
-			        vert, edge, dm->getNumEdges(dm),
-			        NULL, -1, epsilon, tree_type, axis);
-
-			/* Save on cache for later use */
-			/* printf("BVHTree built and saved on cache\n"); */
-			bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_EDGES);
-		}
-		BLI_rw_mutex_unlock(&cache_rwlock);
-	}
-	else {
-		/* printf("BVHTree is already build, using cached tree\n"); */
-	}
-
-	if (tree) {
-		/* Setup BVHTreeFromMesh */
-		bvhtree_from_mesh_edges_setup_data(
-		        data, tree, true, epsilon, vert, vert_allocated, edge, edge_allocated);
-	}
-	else {
-		if (vert_allocated) {
-			MEM_freeN(vert);
-		}
-		if (edge_allocated) {
-			MEM_freeN(edge);
-		}
-		memset(data, 0, sizeof(*data));
-	}
-	return tree;
-}
-
 /**
  * Builds a bvh tree where nodes are the given edges .
  * \param vert/edge_allocated if true, elem freeing will be done when freeing data.
@@ -858,63 +750,6 @@ static void bvhtree_from_mesh_faces_setup_data(
 	data->sphere_radius = epsilon;
 }
 
-/* Builds a bvh tree where nodes are the tesselated faces of the given dm */
-static BVHTree *bvhtree_from_mesh_faces(
-        BVHTreeFromMesh *data, DerivedMesh *dm,
-        float epsilon, int tree_type, int axis)
-{
-	BVHTree *tree;
-	MVert *vert = NULL;
-	MFace *face = NULL;
-	bool vert_allocated = false, face_allocated = false;
-
-	BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ);
-	tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_FACES);
-	BLI_rw_mutex_unlock(&cache_rwlock);
-
-	vert = DM_get_vert_array(dm, &vert_allocated);
-	face = DM_get_tessface_array(dm, &face_allocated);
-
-	/* Not in cache */
-	if (tree == NULL) {
-		BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
-		tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_FACES);
-		if (tree == NULL) {
-			int numFaces = dm->getNumTessFaces(dm);
-			BLI_assert(!(numFaces == 0 && dm->getNumPolys(dm) != 0));
-
-			tree = bvhtree_from_mesh_faces_create_tree(
-			        epsilon, tree_type, axis,
-			        vert, face, numFaces, NULL, -1);
-			if (tree) {
-				/* Save on cache for later use */
-				/* printf("BVHTree built and saved on cache\n"); */
-				bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_FACES);
-			}
-		}
-		BLI_rw_mutex_unlock(&cache_rwlock);
-	}
-	else {
-		/* printf("BVHTree is already build, using cached tree\n"); */
-	}
-
-	if (tree) {
-		/* Setup BVHTreeFromMesh */
-		bvhtree_from_mesh_faces_setup_data(
-		        data, tree, true, epsilon, vert, vert_allocated, face, face_allocated);
-	}
-	else {
-		if (vert_allocated) {
-			MEM_freeN(vert);
-		}
-		if (face_allocated) {
-			MEM_freeN(face);
-		}
-		memset(data, 0, sizeof(*data));
-	}
-	return tree;
-}
-
 /**
  * Builds a bvh tree where nodes are the given tessellated faces (note: does not copy given mfaces!).
  * \param vert_allocated: if true, vert freeing will be done when freeing data.
@@ -1125,83 +960,8 @@ BVHTree *bvhtree_from_editmesh_looptri(
 /**
  * Builds a bvh tree where nodes are the looptri faces of the given dm
  *
- * \note for editmesh this is currently a duplicate of bvhtree_from_mesh_faces
+ * \note for editmesh this is currently a duplicate of bvhtree_from_mesh_faces_ex
  */
-static BVHTree *bvhtree_from_mesh_looptri(
-        BVHTreeFromMesh *data, DerivedMesh *dm,
-        float epsilon, int tree_type, int axis)
-{
-	BVHTree *tree;
-	MVert *mvert = NULL;
-	MLoop *mloop = NULL;
-	const MLoopTri *looptri = NULL;
-	bool vert_allocated = false;
-	bool loop_allocated = false;
-
-	BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ);
-	tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_LOOPTRI);
-	BLI_rw_mutex_unlock(&cache_rwlock);
-
-	MPoly *mpoly;
-	bool poly_allocated = false;
-
-	mvert = DM_get_vert_array(dm, &vert_allocated);
-	mpoly = DM_get_poly_array(dm, &poly_allocated);
-
-	mloop = DM_get_loop_array(dm, &loop_allocated);
-	looptri = dm->getLoopTriArray(dm);
-
-	if (poly_allocated) {
-		MEM_freeN(mpoly);
-	}
-
-	/* Not in cache */
-	if (tree == NULL) {
-		BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
-		tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_LOOPTRI);
-		if (tree == NULL) {
-			int looptri_num = dm->getNumLoopTri(dm);
-
-			/* this assert checks we have looptris,
-			 * if not caller should use DM_ensure_looptri() */
-			BLI_assert(!(looptri_num == 0 && dm->getNumPolys(dm) != 0));
-
-			tree = bvhtree_from_mesh_looptri_create_tree(
-			        epsilon, tree_type, axis,
-			        mvert, mloop, looptri, looptri_num, NULL, -1);
-			if (tree) {
-				/* Save on cache for later use */
-				/* printf("BVHTree built and saved on cache\n"); */
-				bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_LOOPTRI);
-			}
-		}
-		BLI_rw_mutex_unlock(&cache_rwlock);
-	}
-	else {
-		/* printf("BVHTree is already build, using cached tree\n"); */
-	}
-
-	if (tree) {
-		/* Setup BVHTreeFromMesh */
-		bvhtree_from_mesh_looptri_setup_data(
-		        data, tree, true, epsilon,
-		        mvert, vert_allocated,
-		        mloop, loop_allocated,
-		        looptri, false);
-	}
-	else {
-		if (vert_allocated) {
-			MEM_freeN(mvert);
-		}
-		if (loop_allocated) {
-			MEM_freeN(mloop);
-		}
-		memset(data, 0, sizeof(*data));
-	}
-
-	return tree;
-}
-
 BVHTree *bvhtree_from_mesh_looptri_ex(
         BVHTreeFromMesh *data,
         const struct MVert *vert, const bool vert_allocated,
@@ -1229,29 +989,186 @@ BVHTree *bvhtree_from_mesh_looptri_ex(
  * Builds or queries a bvhcache for the cache bvhtree of the request type.
  */
 BVHTree *bvhtree_from_mesh_get(
-        struct BVHTreeFromMesh *data, struct DerivedMesh *mesh,
+        struct BVHTreeFromMesh *data, struct DerivedMesh *dm,
         const int type, const int tree_type)
 {
 	BVHTree *tree = NULL;
+
+	BVHTree_NearestPointCallback nearest_callback = NULL;
+	BVHTree_RayCastCallback raycast_callback = NULL;
+
+	MVert *mvert = NULL;
+	MEdge *medge = NULL;
+	MFace *mface = NULL;
+	MLoop *mloop = NULL;
+	const MLoopTri *looptri = NULL;
+	bool vert_allocated = false;
+	bool edge_allocated = false;
+	bool face_allocated = false;
+	bool loop_allocated = false;
+	bool looptri_allocated = false;
+
+	BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ);
+	tree = bvhcache_find(dm->bvhCache, type);
+	BLI_rw_mutex_unlock(&cache_rwlock);
+
 	switch (type) {
 		case BVHTREE_FROM_VERTS:
-			tree = bvhtree_from_mesh_verts(data, mesh, 0.0f, tree_type, 6);
+			raycast_callback = mesh_verts_spherecast;
+
+			mvert = DM_get_vert_array(dm, &vert_allocated);
+
+			if (tree == NULL) {
+				/* Not in cache */
+				BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
+				tree = bvhcache_find(dm->bvhCache, BVHTREE_FROM_VERTS);
+				if (tree == NULL) {
+					tree = bvhtree_from_mesh_verts_create_tree(
+					        0.0, tree_type, 6, mvert, dm->getNumVerts(dm), NULL, -1);
+
+					if (tree) {
+						/* Save on cache for later use */
+						/* printf("BVHTree built and saved on cache\n"); */
+						bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_VERTS);
+					}
+				}
+				BLI_rw_mutex_unlock(&cache_rwlock);
+			}
 			break;
+
 		case BVHTREE_FROM_EDGES:
-			tree = bvhtree_from_mesh_edges(data, mesh, 0.0f, tree_type, 6);
+			nearest_callback = mesh_edges_nearest_point;
+			raycast_callback = mesh_edges_spherecast;
+
+			mvert = DM_get_vert_array(dm, &vert_allocated);
+			medge = DM_get_edge_array(dm, &edge_allocated);
+
+			if (tree == NULL) {
+				/* Not in cache */
+				BLI_rw_mutex_lock(&cache_rwlock, THREAD_LO

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list