58 bool do_lock = r_locked;
62 if (*bvh_cache_p ==
nullptr) {
69 if (*bvh_cache_p ==
nullptr) {
101 if (bvh_cache ==
nullptr) {
115 BVHCache *cache = MEM_cnew<BVHCache>(__func__);
140 item->
tree =
nullptr;
177 const float UNUSED(m_dist),
184 #ifdef USE_KDOPBVH_WATERTIGHT
211 return idist * m_dist;
236 const float *t0, *t1, *t2, *t3;
237 t0 = vert[face->
v1].
co;
238 t1 = vert[face->
v2].
co;
239 t2 = vert[face->
v3].
co;
240 t3 = face->
v4 ? vert[face->
v4].
co :
nullptr;
243 float nearest_tmp[3], dist_sq;
248 if (dist_sq < nearest->dist_sq) {
249 nearest->
index = index;
270 const float *vtri_co[3] = {
275 float nearest_tmp[3], dist_sq;
280 if (dist_sq < nearest->dist_sq) {
281 nearest->
index = index;
297 const float *t0, *t1, *t2;
303 float nearest_tmp[3], dist_sq;
308 if (dist_sq < nearest->dist_sq) {
309 nearest->
index = index;
332 const float *t0, *t1, *t2, *t3;
333 t0 = vert[face->
v1].
co;
334 t1 = vert[face->
v2].
co;
335 t2 = vert[face->
v3].
co;
336 t3 = face->
v4 ? vert[face->
v4].
co :
nullptr;
340 if (ray->
radius == 0.0f) {
347 if (dist >= 0 && dist < hit->dist) {
370 const float *vtri_co[3] = {
377 if (ray->
radius == 0.0f) {
384 if (dist >= 0 && dist < hit->dist) {
402 const float *t0, *t1, *t2;
416 if (dist >= 0 && dist < hit->dist) {
440 float nearest_tmp[3], dist_sq;
442 const float *t0, *t1;
443 t0 = vert[edge->v1].
co;
444 t1 = vert[edge->v2].
co;
449 if (dist_sq < nearest->dist_sq) {
450 nearest->
index = index;
503 const float *
v =
data->vert[index].co;
525 const float *
v1, *
v2, *r1;
526 float r2[3],
i1[3], i2[3];
527 v1 = vert[edge->v1].
co;
528 v2 = vert[edge->v2].
co;
546 else if (e_fac > 1.0f) {
576 const float (*vert_normals)[3],
579 memset(r_data, 0,
sizeof(*r_data));
590 switch (bvh_cache_type) {
627 memset(r_data, 0,
sizeof(*r_data));
633 switch (bvh_cache_type) {
671 int verts_num_active)
679 verts_num_active = verts_num;
685 for (
int i = 0; i < verts_num; i++) {
704 int verts_num_active)
712 verts_num_active = verts_num;
715 if (verts_num_active) {
719 for (
int i = 0; i < verts_num; i++) {
735 int verts_num_active,
742 epsilon, tree_type, axis, em, verts_mask, verts_num_active);
763 int verts_num_active,
770 epsilon, tree_type, axis, vert, verts_num, verts_mask, verts_num_active);
794 int edges_num_active)
803 edges_num_active = edges_num;
832 int edges_num_active,
843 edges_num_active = edge_num;
846 if (edges_num_active) {
850 for (
int i = 0; i < edge_num; i++) {
869 int edges_num_active,
876 epsilon, tree_type, axis, em, edges_mask, edges_num_active);
898 int edges_num_active,
905 vert, edge, edges_num, edges_mask, edges_num_active,
epsilon, tree_type, axis);
931 int faces_num_active)
940 faces_num_active = faces_num;
948 for (
int i = 0; i < faces_num; i++) {
982 int looptri_num_active)
985 const int looptri_num = em->
tottri;
992 looptri_num_active = looptri_num;
1005 for (
int i = 0; i < looptri_num; i++) {
1006 const BMLoop **ltri = looptris[i];
1032 const int looptri_num,
1034 int looptri_num_active)
1042 looptri_num_active = looptri_num;
1045 if (looptri_num_active) {
1050 if (vert && looptri) {
1051 for (
int i = 0; i < looptri_num; i++) {
1057 copy_v3_v3(co[0], vert[mloop[looptri[i].tri[0]].
v].co);
1058 copy_v3_v3(co[1], vert[mloop[looptri[i].tri[1]].
v].co);
1059 copy_v3_v3(co[2], vert[mloop[looptri[i].tri[2]].
v].co);
1074 int looptri_num_active,
1084 epsilon, tree_type, axis, em, looptri_mask, looptri_num_active);
1101 const struct MVert *vert,
1102 const struct MLoop *mloop,
1104 const int looptri_num,
1106 int looptri_num_active,
1120 looptri_num_active);
1137 int *r_loose_vert_num)
1143 int num_linked_verts = 0;
1144 for (; edges_num--;
e++) {
1155 *r_loose_vert_num = verts_num - num_linked_verts;
1157 return loose_verts_mask;
1161 const int edges_len,
1162 int *r_loose_edge_len)
1166 int loose_edges_len = 0;
1168 for (
int i = 0; i < edges_len; i++,
e++) {
1178 *r_loose_edge_len = loose_edges_len;
1180 return loose_edges_mask;
1184 const int looptri_len,
1185 int *r_looptri_active_len)
1189 int looptri_no_hidden_len = 0;
1190 int looptri_iter = 0;
1192 while (looptri_iter != looptri_len) {
1193 int mp_totlooptri = mpoly[i_poly].
totloop - 2;
1194 const MPoly &mp = mpoly[i_poly];
1196 looptri_iter += mp_totlooptri;
1199 while (mp_totlooptri--) {
1202 looptri_no_hidden_len++;
1208 *r_looptri_active_len = looptri_no_hidden_len;
1210 return looptri_mask;
1216 const int tree_type)
1222 int looptri_len = 0;
1239 bool lock_started =
false;
1241 bvh_cache_p, bvh_cache_type, &
data->tree, &lock_started, mesh_eval_mutex);
1253 int mask_bits_act_len = -1;
1255 switch (bvh_cache_type) {
1301 if (
mask !=
nullptr) {
1310 data->cached =
true;
1315 if (
data->tree !=
nullptr) {
1317 printf(
"tree_type %d obtained instead of %d\n",
1329 const int tree_type,
1334 bool lock_started =
false;
1340 bvh_cache_p, bvh_cache_type, &
data->tree, &lock_started, mesh_eval_mutex);
1348 switch (bvh_cache_type) {
1376 data->cached =
true;
1382 if (
data->tree !=
nullptr) {
1384 printf(
"tree_type %d obtained instead of %d\n",
1403 if (!
data->cached) {
1427 const int tree_type)
1438 for (
const int i :
positions.index_range()) {
1446 data->nearest_callback =
nullptr;
typedef float(TangentPoint)[2]
@ BVHTREE_FROM_LOOSEEDGES
@ BVHTREE_FROM_LOOSEVERTS
@ BVHTREE_FROM_EM_LOOPTRI
@ BVHTREE_FROM_LOOPTRI_NO_HIDDEN
const float(* BKE_mesh_vertex_normals_ensure(const struct Mesh *mesh))[3]
const struct MLoopTri * BKE_mesh_runtime_looptri_ensure(const struct Mesh *mesh)
int BKE_mesh_runtime_looptri_len(const struct Mesh *mesh)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#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)
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)
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])
float 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_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])
bool isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], float radius, const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float ipoint[3])
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[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], float epsilon)
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_task_isolate(void(*func)(void *userdata), void *userdata)
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_mesh_edges_ex(BVHTreeFromMesh *data, const MVert *vert, const MEdge *edge, const int edges_num, const BLI_bitmap *edges_mask, int edges_num_active, float epsilon, int tree_type, int axis)
BVHTree * bvhtree_from_editmesh_looptri(BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis)
BVHTree * bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data, const MVert *vert, const int verts_num, const BLI_bitmap *verts_mask, int verts_num_active, 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)
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)
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)
void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data)
void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data)
static void bvhtree_from_editmesh_setup_data(BVHTree *tree, const BVHCacheType bvh_cache_type, struct BMEditMesh *em, BVHTreeFromEditMesh *r_data)
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)
static void mesh_looptri_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
BVHTree * BKE_bvhtree_from_mesh_get(struct BVHTreeFromMesh *data, const struct Mesh *mesh, const BVHCacheType bvh_cache_type, const int tree_type)
static void mesh_faces_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
static void bvhtree_balance_isolated(void *userdata)
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 * 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])
BVHTree * bvhtree_from_mesh_looptri_ex(BVHTreeFromMesh *data, const struct MVert *vert, const struct MLoop *mloop, const struct MLoopTri *looptri, const int looptri_num, const BLI_bitmap *looptri_mask, int looptri_num_active, float epsilon, int tree_type, int axis)
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 editmesh_looptri_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static void bvhtree_from_mesh_setup_data(BVHTree *tree, const BVHCacheType bvh_cache_type, const MVert *vert, const MEdge *edge, const MFace *face, const MLoop *loop, const MLoopTri *looptri, const float(*vert_normals)[3], BVHTreeFromMesh *r_data)
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_balance(BVHTree *tree, const bool isolate)
BVHCache * bvhcache_init()
BVHTree * bvhtree_from_editmesh_edges(BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis)
static void editmesh_verts_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
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_editmesh_edges_ex(BVHTreeFromEditMesh *data, BMEditMesh *em, const BLI_bitmap *edges_mask, int edges_num_active, float epsilon, int tree_type, int axis)
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)
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])
GVArray lookup_or_default(const AttributeIDRef &attribute_id, const eAttrDomain domain, const eCustomDataType data_type, const void *default_value=nullptr) const
void(* MEM_freeN)(void *vmemh)
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
Insertion insert(const float3 &point_prev, const float3 &handle_prev, const float3 &handle_next, const float3 &point_next, float parameter)
AttributeAccessor pointcloud_attributes(const PointCloud &pointcloud)
vec_base< float, 3 > float3
MutableSpan< float3 > positions
struct BMLoop *(* looptris)[3]
BVHCacheItem items[BVHTREE_MAX_ITEM]
BVHTree_NearestPointCallback nearest_callback
BVHTree_RayCastCallback raycast_callback
BVHTree_RayCastCallback raycast_callback
const struct MFace * face
const struct MEdge * edge
const float(* vert_normals)[3]
const struct MLoop * loop
const struct MVert * vert
BVHTree_NearestPointCallback nearest_callback
const struct MLoopTri * looptri
struct IsectRayPrecalc * isect_precalc
struct BVHCache * bvh_cache