72 bool do_lock = r_locked;
76 if (*bvh_cache_p ==
NULL) {
83 if (*bvh_cache_p ==
NULL) {
115 if (bvh_cache ==
NULL) {
171 const float UNUSED(m_dist),
178 #ifdef USE_KDOPBVH_WATERTIGHT
204 return idist * m_dist;
225 const float *t0, *t1, *t2, *t3;
226 t0 = vert[face->
v1].
co;
227 t1 = vert[face->
v2].
co;
228 t2 = vert[face->
v3].
co;
232 float nearest_tmp[3], dist_sq;
237 if (dist_sq < nearest->dist_sq) {
238 nearest->
index = index;
259 const float *vtri_co[3] = {
264 float nearest_tmp[3], dist_sq;
269 if (dist_sq < nearest->dist_sq) {
270 nearest->
index = index;
286 const float *t0, *t1, *t2;
292 float nearest_tmp[3], dist_sq;
297 if (dist_sq < nearest->dist_sq) {
298 nearest->
index = index;
317 const float *t0, *t1, *t2, *t3;
318 t0 = vert[face->
v1].
co;
319 t1 = vert[face->
v2].
co;
320 t2 = vert[face->
v3].
co;
325 if (ray->
radius == 0.0f) {
332 if (dist >= 0 && dist < hit->dist) {
355 const float *vtri_co[3] = {
362 if (ray->
radius == 0.0f) {
369 if (dist >= 0 && dist < hit->dist) {
387 const float *t0, *t1, *t2;
401 if (dist >= 0 && dist < hit->dist) {
421 float nearest_tmp[3], dist_sq;
423 const float *t0, *t1;
424 t0 = vert[edge->
v1].
co;
425 t1 = vert[edge->
v2].
co;
430 if (dist_sq < nearest->dist_sq) {
431 nearest->
index = index;
480 const float *
v =
data->vert[index].co;
498 const float *
v1, *
v2, *r1;
499 float r2[3],
i1[3], i2[3];
519 else if (e_fac > 1.0f) {
547 int verts_num_active)
555 verts_num_active = verts_num;
561 for (
int i = 0; i < verts_num; i++) {
581 int verts_num_active)
589 verts_num_active = verts_num;
592 if (verts_num_active) {
596 for (
int i = 0; i < verts_num; i++) {
612 const bool is_cached,
614 const bool vert_allocated)
619 data->cached = is_cached;
627 data->vert_allocated = vert_allocated;
634 int verts_num_active,
645 bool lock_started =
false;
647 bvh_cache_p, bvh_cache_type, &
data->tree, &lock_started, mesh_eval_mutex);
649 if (
data->cached ==
false) {
651 epsilon, tree_type, axis, em, verts_mask, verts_num_active);
662 epsilon, tree_type, axis, em, verts_mask, verts_num_active);
694 const bool vert_allocated,
696 int verts_num_active,
704 bool in_cache =
false;
705 bool lock_started =
false;
708 in_cache =
bvhcache_find(bvh_cache_p, bvh_cache_type, &
tree, &lock_started, mesh_eval_mutex);
711 if (in_cache ==
false) {
713 epsilon, tree_type, axis, vert, verts_num, verts_mask, verts_num_active);
745 int edges_num_active)
754 edges_num_active = edges_num;
784 int edges_num_active,
795 edges_num_active = edge_num;
798 if (edges_num_active) {
802 for (
int i = 0; i < edge_num; i++) {
821 const bool is_cached,
823 const bool vert_allocated,
825 const bool edge_allocated)
831 data->cached = is_cached;
837 data->vert_allocated = vert_allocated;
839 data->edge_allocated = edge_allocated;
846 int edges_num_active,
857 bool lock_started =
false;
859 bvh_cache_p, bvh_cache_type, &
data->tree, &lock_started, mesh_eval_mutex);
861 if (
data->cached ==
false) {
863 epsilon, tree_type, axis, em, edges_mask, edges_num_active);
874 epsilon, tree_type, axis, em, edges_mask, edges_num_active);
906 const bool vert_allocated,
909 const bool edge_allocated,
911 int edges_num_active,
919 bool in_cache =
false;
920 bool lock_started =
false;
923 in_cache =
bvhcache_find(bvh_cache_p, bvh_cache_type, &
tree, &lock_started, mesh_eval_mutex);
926 if (in_cache ==
false) {
928 vert, edge, edges_num, edges_mask, edges_num_active,
epsilon, tree_type, axis);
945 data,
tree, in_cache, vert, vert_allocated, edge, edge_allocated);
963 int faces_num_active)
972 faces_num_active = faces_num;
980 for (
int i = 0; i < faces_num; i++) {
1006 const bool is_cached,
1008 const bool vert_allocated,
1010 const bool face_allocated)
1015 data->cached = is_cached;
1021 data->vert_allocated = vert_allocated;
1023 data->face_allocated = face_allocated;
1037 const bool vert_allocated,
1040 const bool face_allocated,
1042 int faces_num_active,
1050 bool in_cache =
false;
1051 bool lock_started =
false;
1054 in_cache =
bvhcache_find(bvh_cache_p, bvh_cache_type, &
tree, &lock_started, mesh_eval_mutex);
1057 if (in_cache ==
false) {
1059 epsilon, tree_type, axis, vert, face, numFaces, faces_mask, faces_num_active);
1064 BVHCache *bvh_cache = *bvh_cache_p;
1076 data,
tree, in_cache, vert, vert_allocated, face, face_allocated);
1092 int looptri_num_active)
1095 const int looptri_num = em->
tottri;
1102 looptri_num_active = looptri_num;
1115 for (
int i = 0; i < looptri_num; i++) {
1116 const BMLoop **ltri = looptris[i];
1143 const int looptri_num,
1145 int looptri_num_active)
1153 looptri_num_active = looptri_num;
1156 if (looptri_num_active) {
1161 if (vert && looptri) {
1162 for (
int i = 0; i < looptri_num; i++) {
1168 copy_v3_v3(co[0], vert[mloop[looptri[i].tri[0]].
v].co);
1169 copy_v3_v3(co[1], vert[mloop[looptri[i].tri[1]].
v].co);
1170 copy_v3_v3(co[2], vert[mloop[looptri[i].tri[2]].
v].co);
1185 const bool is_cached,
1187 const bool vert_allocated,
1189 const bool loop_allocated,
1191 const bool looptri_allocated)
1196 data->cached = is_cached;
1202 data->vert_allocated = vert_allocated;
1204 data->loop_allocated = loop_allocated;
1205 data->looptri = looptri;
1206 data->looptri_allocated = looptri_allocated;
1215 int looptri_num_active,
1228 bool lock_started =
false;
1230 bvh_cache_p, bvh_cache_type, &
tree, &lock_started, mesh_eval_mutex);
1231 BVHCache *bvh_cache = *bvh_cache_p;
1233 if (in_cache ==
false) {
1235 epsilon, tree_type, axis, em, looptri_mask, looptri_num_active);
1245 epsilon, tree_type, axis, em, looptri_mask, looptri_num_active);
1253 data->cached = bvh_cache_p !=
NULL;
1271 const struct MVert *vert,
1272 const bool vert_allocated,
1273 const struct MLoop *mloop,
1274 const bool loop_allocated,
1276 const int looptri_num,
1277 const bool looptri_allocated,
1279 int looptri_num_active,
1287 bool in_cache =
false;
1288 bool lock_started =
false;
1291 in_cache =
bvhcache_find(bvh_cache_p, bvh_cache_type, &
tree, &lock_started, mesh_eval_mutex);
1294 if (in_cache ==
false) {
1304 looptri_num_active);
1307 BVHCache *bvh_cache = *bvh_cache_p;
1335 int *r_loose_vert_num)
1341 int num_linked_verts = 0;
1342 for (; edges_num--;
e++) {
1353 *r_loose_vert_num = verts_num - num_linked_verts;
1355 return loose_verts_mask;
1359 const int edges_len,
1360 int *r_loose_edge_len)
1364 int loose_edges_len = 0;
1366 for (
int i = 0; i < edges_len; i++,
e++) {
1376 *r_loose_edge_len = loose_edges_len;
1378 return loose_edges_mask;
1382 const int looptri_len,
1383 int *r_looptri_active_len)
1387 int looptri_no_hidden_len = 0;
1388 int looptri_iter = 0;
1389 const MPoly *mp = mpoly;
1390 while (looptri_iter != looptri_len) {
1391 int mp_totlooptri = mp->
totloop - 2;
1393 looptri_iter += mp_totlooptri;
1396 while (mp_totlooptri--) {
1399 looptri_no_hidden_len++;
1405 *r_looptri_active_len = looptri_no_hidden_len;
1407 return looptri_mask;
1416 const int tree_type)
1429 switch (bvh_cache_type) {
1432 if (is_cached ==
false) {
1434 int loose_vert_len = -1;
1455 if (loose_verts_mask !=
NULL) {
1467 if (is_cached ==
false) {
1469 int loose_edges_len = -1;
1491 if (loose_edges_mask !=
NULL) {
1503 if (is_cached ==
false) {
1531 if (is_cached ==
false) {
1535 int looptri_mask_active_len = -1;
1539 mesh->
mpoly, looptri_len, &looptri_mask_active_len);
1551 looptri_mask_active_len,
1559 if (looptri_mask !=
NULL) {
1581 printf(
"tree_type %d obtained instead of %d\n",
1601 const int tree_type,
1607 bool is_cached =
false;
1620 data->cached = is_cached;
1622 switch (bvh_cache_type) {
1624 if (is_cached ==
false) {
1626 data, em,
NULL, -1, 0.0f, tree_type, 6, bvh_cache_type, bvh_cache_p, mesh_eval_mutex);
1635 if (is_cached ==
false) {
1637 data, em,
NULL, -1, 0.0f, tree_type, 6, bvh_cache_type, bvh_cache_p, mesh_eval_mutex);
1647 if (is_cached ==
false) {
1649 data, em,
NULL, -1, 0.0f, tree_type, 6, bvh_cache_type, bvh_cache_p, mesh_eval_mutex);
1672 printf(
"tree_type %d obtained instead of %d\n",
1693 if (!
data->cached) {
1707 if (
data->vert_allocated) {
1710 if (
data->edge_allocated) {
1713 if (
data->face_allocated) {
1716 if (
data->loop_allocated) {
1719 if (
data->looptri_allocated) {
1734 const int tree_type)
1741 for (
int i = 0; i < pointcloud->
totpoint; i++) {
1747 data->coords = pointcloud->
co;
@ BVHTREE_FROM_LOOSEEDGES
@ BVHTREE_FROM_LOOSEVERTS
@ BVHTREE_FROM_EM_LOOPTRI
@ BVHTREE_FROM_LOOPTRI_NO_HIDDEN
const struct MLoopTri * BKE_mesh_runtime_looptri_ensure(struct Mesh *mesh)
int BKE_mesh_runtime_looptri_len(const struct Mesh *mesh)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_DISABLE(_bitmap, _index)
#define BLI_BITMAP_TEST_BOOL(_bitmap, _index)
#define BLI_BITMAP_NEW(_tot, _alloc_string)
void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits)
int BLI_bvhtree_get_tree_type(const BVHTree *tree)
void BLI_bvhtree_balance(BVHTree *tree)
BVHTree * BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
void BLI_bvhtree_free(BVHTree *tree)
void BLI_bvhtree_insert(BVHTree *tree, int index, const float co[3], int numpoints)
int BLI_bvhtree_get_len(const BVHTree *tree)
void BLI_kdtree_nd_() insert(KDTree *tree, int index, const float co[KD_DIMS]) ATTR_NONNULL(1
MINLINE float square_f(float a)
int isect_line_line_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float r_i1[3], float r_i2[3])
bool isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], const float radius, const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float ipoint[3])
bool isect_ray_tri_watertight_v3(const float ray_origin[3], const struct IsectRayPrecalc *isect_precalc, const float v0[3], const float v1[3], const float v2[3], float *r_dist, float r_uv[2])
void closest_on_tri_to_point_v3(float r[3], const float p[3], const float v1[3], const float v2[3], const float v3[3])
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
void closest_to_line_segment_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3])
bool isect_ray_tri_epsilon_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2], const float epsilon)
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float r[3])
MINLINE float dot_v3v3v3(const float p[3], const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool equals_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
void BLI_mutex_end(ThreadMutex *mutex)
void BLI_mutex_init(ThreadMutex *mutex)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
pthread_mutex_t ThreadMutex
#define IN_RANGE_INCL(a, b, c)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint i1
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
BVHTree * bvhtree_from_editmesh_looptri(BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis)
bool bvhcache_has_tree(const BVHCache *bvh_cache, const BVHTree *tree)
static void mesh_faces_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static BLI_bitmap * loose_edges_map_get(const MEdge *medge, const int edges_len, int *r_loose_edge_len)
static BVHTree * bvhtree_from_mesh_faces_create_tree(float epsilon, int tree_type, int axis, const MVert *vert, const MFace *face, const int faces_num, const BLI_bitmap *faces_mask, int faces_num_active)
BVHTree * BKE_bvhtree_from_mesh_get(struct BVHTreeFromMesh *data, struct Mesh *mesh, const BVHCacheType bvh_cache_type, const int tree_type)
BVHTree * bvhtree_from_editmesh_looptri_ex(BVHTreeFromEditMesh *data, BMEditMesh *em, const BLI_bitmap *looptri_mask, int looptri_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
static void mesh_looptri_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
static BVHTree * bvhtree_from_mesh_verts_create_tree(float epsilon, int tree_type, int axis, const MVert *vert, const int verts_num, const BLI_bitmap *verts_mask, int verts_num_active)
static BVHTree * bvhtree_from_mesh_looptri_create_tree(float epsilon, int tree_type, int axis, const MVert *vert, const MLoop *mloop, const MLoopTri *looptri, const int looptri_num, const BLI_bitmap *looptri_mask, int looptri_num_active)
BVHTree * BKE_bvhtree_from_editmesh_get(BVHTreeFromEditMesh *data, struct BMEditMesh *em, const int tree_type, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
BVHCache * bvhcache_init(void)
void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data)
void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data)
struct BVHCacheItem BVHCacheItem
static void mesh_looptri_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static void mesh_faces_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
static BVHTree * bvhtree_from_editmesh_looptri_create_tree(float epsilon, int tree_type, int axis, BMEditMesh *em, const BLI_bitmap *looptri_mask, int looptri_num_active)
static void bvhcache_insert(BVHCache *bvh_cache, BVHTree *tree, BVHCacheType type)
static void mesh_verts_spherecast_do(int index, const float v[3], const BVHTreeRay *ray, BVHTreeRayHit *hit)
BVHTree * bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data, const MVert *vert, const int verts_num, const bool vert_allocated, const BLI_bitmap *verts_mask, int verts_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
BVHTree * BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data, const PointCloud *pointcloud, const int tree_type)
float bvhtree_ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), const float v0[3], const float v1[3], const float v2[3])
static void bvhtree_from_mesh_verts_setup_data(BVHTreeFromMesh *data, BVHTree *tree, const bool is_cached, const MVert *vert, const bool vert_allocated)
static BLI_bitmap * looptri_no_hidden_map_get(const MPoly *mpoly, const int looptri_len, int *r_looptri_active_len)
static BVHTree * bvhtree_from_editmesh_verts_create_tree(float epsilon, int tree_type, int axis, BMEditMesh *em, const BLI_bitmap *verts_mask, int verts_num_active)
static void bvhtree_from_mesh_faces_setup_data(BVHTreeFromMesh *data, BVHTree *tree, const bool is_cached, const MVert *vert, const bool vert_allocated, const MFace *face, const bool face_allocated)
static void editmesh_looptri_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
BVHTree * bvhtree_from_mesh_looptri_ex(BVHTreeFromMesh *data, const struct MVert *vert, const bool vert_allocated, const struct MLoop *mloop, const bool loop_allocated, const struct MLoopTri *looptri, const int looptri_num, const bool looptri_allocated, const BLI_bitmap *looptri_mask, int looptri_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
static BVHTree * bvhtree_from_editmesh_edges_create_tree(float epsilon, int tree_type, int axis, BMEditMesh *em, const BLI_bitmap *edges_mask, int edges_num_active)
static void bvhtree_from_mesh_looptri_setup_data(BVHTreeFromMesh *data, BVHTree *tree, const bool is_cached, const MVert *vert, const bool vert_allocated, const MLoop *mloop, const bool loop_allocated, const MLoopTri *looptri, const bool looptri_allocated)
BVHTree * bvhtree_from_editmesh_edges(BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis)
BVHTree * bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data, BMEditMesh *em, const BLI_bitmap *verts_mask, int verts_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
static void bvhtree_from_mesh_edges_setup_data(BVHTreeFromMesh *data, BVHTree *tree, const bool is_cached, const MVert *vert, const bool vert_allocated, const MEdge *edge, const bool edge_allocated)
static void editmesh_verts_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
BVHTree * bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data, BMEditMesh *em, const BLI_bitmap *edges_mask, int edges_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
BVHTree * bvhtree_from_editmesh_verts(BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis)
static void mesh_edges_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static bool bvhcache_find(BVHCache **bvh_cache_p, BVHCacheType type, BVHTree **r_tree, bool *r_locked, ThreadMutex *mesh_eval_mutex)
static BVHTree * bvhtree_from_mesh_edges_create_tree(const MVert *vert, const MEdge *edge, const int edge_num, const BLI_bitmap *edges_mask, int edges_num_active, float epsilon, int tree_type, int axis)
static void bvhcache_unlock(BVHCache *bvh_cache, bool lock_started)
BVHTree * bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data, const MVert *vert, const bool vert_allocated, const MEdge *edge, const int edges_num, const bool edge_allocated, const BLI_bitmap *edges_mask, int edges_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
void free_bvhtree_from_editmesh(struct BVHTreeFromEditMesh *data)
static BLI_bitmap * loose_verts_map_get(const MEdge *medge, int edges_num, const MVert *UNUSED(mvert), int verts_num, int *r_loose_vert_num)
static void mesh_edges_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
void bvhcache_free(BVHCache *bvh_cache)
BVHTree * bvhtree_from_mesh_faces_ex(BVHTreeFromMesh *data, const MVert *vert, const bool vert_allocated, const MFace *face, const int numFaces, const bool face_allocated, const BLI_bitmap *faces_mask, int faces_num_active, float epsilon, int tree_type, int axis, const BVHCacheType bvh_cache_type, BVHCache **bvh_cache_p, ThreadMutex *mesh_eval_mutex)
static void mesh_verts_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static void editmesh_looptri_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
float bvhtree_sphereray_tri_intersection(const BVHTreeRay *ray, float radius, const float m_dist, const float v0[3], const float v1[3], const float v2[3])
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
struct BMLoop *(* looptris)[3]
BVHCacheItem items[BVHTREE_MAX_ITEM]
struct IsectRayPrecalc * isect_precalc
struct BVHCache * bvh_cache