37 const bool cos_cage_free)
43 const Span<std::array<BMLoop *, 3>> looptris,
46 const bool cos_cage_free,
47 bool (*test_fn)(
BMFace *,
void *user_data),
51 const float epsilon = FLT_EPSILON * 2.0f;
58 BMFace *f_test, *f_test_prev;
78 f_test_prev =
nullptr;
82 for (
const int i : looptris.index_range()) {
83 f_test = looptris[i][0]->f;
84 if (f_test != f_test_prev) {
85 test_fn_ret = test_fn(f_test, user_data);
95 tottri = looptris.size();
100 f_test_prev =
nullptr;
103 for (
const int i : looptris.index_range()) {
106 f_test = looptris[i][0]->f;
107 if (f_test != f_test_prev) {
108 test_fn_ret = test_fn(f_test, user_data);
109 f_test_prev = f_test;
147 const Span<std::array<BMLoop *, 3>> looptris,
150 const bool cos_cage_free)
152 bool (*test_fn)(
BMFace *,
void *user_data);
192 const std::array<BMLoop *, 3> <ri,
195 if (cos_cage ==
nullptr) {
196 cos[0] = ltri[0]->v->co;
197 cos[1] = ltri[1]->v->co;
198 cos[2] = ltri[2]->v->co;
230 const std::array<BMLoop *, 3> <ri = bmtree->
looptris[hit->index];
246 return bmtree->
looptris[hit->index][0]->f;
252 const std::array<BMLoop *, 3> <ri = bmcb_data->
looptris[index];
254 const float *tri_cos[3];
260 (ray->radius > 0.0f ?
269#ifdef USE_KDOPBVH_WATERTIGHT
271 ray->origin, ray->isect_precalc, tri_cos[0], tri_cos[1], tri_cos[2], &dist, uv));
274 ray->origin, ray->direction, tri_cos[0], tri_cos[1], tri_cos[2], &dist, uv));
277 if (isect && dist < hit->dist) {
299 const float dist = r_dist ? *r_dist :
FLT_MAX;
314 if (hit.index != -1 && hit.dist != dist) {
341 const std::array<BMLoop *, 3> <ri = bmcb_data->
looptris[index];
355 void *filter_userdata)
361 const float dist = r_dist ? *r_dist :
FLT_MAX;
379 if (hit.index != -1 && hit.dist != dist) {
405 const std::array<BMLoop *, 3> <ri = bmcb_data->
looptris[index];
408 const float *tri_cos[3];
411 for (
int i = 0; i < 3; i++) {
413 if (dist_sq < hit->dist_sq && dist_sq < dist_max_sq) {
417 hit->dist_sq = dist_sq;
426 const float dist_max)
430 const float dist_max_sq = dist_max * dist_max;
436 hit.dist_sq = dist_max_sq;
444 if (hit.index != -1) {
445 const std::array<BMLoop *, 3> <ri = bmtree->
looptris[hit.index];
467 const std::array<BMLoop *, 3> <ri = bmcb_data->
looptris[index];
470 const float *tri_cos[3];
477 if (dist_sq < hit->dist_sq && dist_sq < dist_max_sq) {
480 hit->dist_sq = dist_sq;
487 const float dist_max)
491 const float dist_max_sq = dist_max * dist_max;
497 hit.dist_sq = dist_max_sq;
505 if (hit.index != -1) {
506 const std::array<BMLoop *, 3> <ri = bmtree->
looptris[hit.index];
524 const BMBVHTree *bmtree_a = data->tree_pair[0];
525 const BMBVHTree *bmtree_b = data->tree_pair[1];
527 const std::array<BMLoop *, 3> <ri_a = bmtree_a->
looptris[index_a];
528 const std::array<BMLoop *, 3> <ri_b = bmtree_b->
looptris[index_b];
529 const float *tri_a_co[3] = {ltri_a[0]->v->co, ltri_a[1]->v->co, ltri_a[2]->v->co};
530 const float *tri_b_co[3] = {ltri_b[0]->v->co, ltri_b[1]->v->co, ltri_b[2]->v->co};
532 int verts_shared = 0;
535 if (
UNLIKELY(ltri_a[0]->f == ltri_b[0]->f)) {
543 if (verts_shared >= 2) {
550 ((verts_shared == 0) || (
len_squared_v3v3(ix_pair[0], ix_pair[1]) > data->epsilon)));
560 data.tree_pair[1] = bmtree_b;
570 if (index_a < index_b) {
581 data.tree_pair[1] = bmtree;
bool(* BMBVHTree_FaceFilter)(struct BMFace *f, void *userdata)
BVHTree * BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
void BLI_bvhtree_balance(BVHTree *tree)
void BLI_bvhtree_free(BVHTree *tree)
void BLI_bvhtree_insert(BVHTree *tree, int index, const float co[3], int numpoints)
int BLI_bvhtree_find_nearest(const BVHTree *tree, const float co[3], BVHTreeNearest *nearest, BVHTree_NearestPointCallback callback, void *userdata)
float BLI_bvhtree_get_epsilon(const BVHTree *tree)
int BLI_bvhtree_ray_cast(const BVHTree *tree, const float co[3], const float dir[3], float radius, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata)
BVHTreeOverlap * BLI_bvhtree_overlap(const BVHTree *tree1, const BVHTree *tree2, unsigned int *r_overlap_num, BVHTree_OverlapCallback callback, void *userdata)
MINLINE float max_ff(float a, float b)
bool isect_ray_tri_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])
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_tri_tri_v3(const float t_a0[3], const float t_a1[3], const float t_a2[3], const float t_b0[3], const float t_b1[3], const float t_b2[3], float r_i1[3], float r_i2[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_lambda, float r_uv[2])
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_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
void interp_v3_v3v3v3_uv(float p[3], const float v1[3], const float v2[3], const float v3[3], const float uv[2])
Read Guarded memory(de)allocation.
#define BM_elem_index_get(ele)
#define BM_elem_flag_test(ele, hflag)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
ATTR_WARN_UNUSED_RESULT const BMVert * v
void BKE_bmbvh_free(BMBVHTree *bmtree)
BMBVHTree * BKE_bmbvh_new(BMesh *bm, const Span< std::array< BMLoop *, 3 > > looptris, int flag, const blender::float3 *cos_cage, const bool cos_cage_free)
BMFace * BKE_bmbvh_ray_cast(const BMBVHTree *bmtree, const float co[3], const float dir[3], const float radius, float *r_dist, float r_hitout[3], float r_cagehit[3])
static bool bm_face_is_select(BMFace *f, void *)
BMBVHTree * BKE_bmbvh_new_from_editmesh(BMEditMesh *em, int flag, const blender::float3 *cos_cage, const bool cos_cage_free)
static void bmbvh_ray_cast_cb_filter(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static bool bm_face_is_not_hidden(BMFace *f, void *)
static bool bmbvh_overlap_cb(void *userdata, int index_a, int index_b, int)
BMVert * BKE_bmbvh_find_vert_closest(const BMBVHTree *bmtree, const float co[3], const float dist_max)
static BMFace * bmbvh_ray_cast_handle_hit(const BMBVHTree *bmtree, RayCastUserData *bmcb_data, const BVHTreeRayHit *hit, float *r_dist, float r_hitout[3], float r_cagehit[3])
BVHTree * BKE_bmbvh_tree_get(BMBVHTree *bmtree)
BVHTreeOverlap * BKE_bmbvh_overlap_self(const BMBVHTree *bmtree, uint *r_overlap_tot)
static bool bmbvh_overlap_self_cb(void *userdata, int index_a, int index_b, int thread)
static void bmbvh_tri_from_face(const float *cos[3], const std::array< BMLoop *, 3 > <ri, const blender::float3 *cos_cage)
BMFace * BKE_bmbvh_find_face_closest(const BMBVHTree *bmtree, const float co[3], const float dist_max)
BMFace * BKE_bmbvh_ray_cast_filter(const BMBVHTree *bmtree, const float co[3], const float dir[3], const float radius, float *r_dist, float r_hitout[3], float r_cagehit[3], BMBVHTree_FaceFilter filter_cb, void *filter_userdata)
static void bmbvh_ray_cast_cb(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
static void bmbvh_find_face_closest_cb(void *userdata, int index, const float co[3], BVHTreeNearest *hit)
BVHTreeOverlap * BKE_bmbvh_overlap(const BMBVHTree *bmtree_a, const BMBVHTree *bmtree_b, uint *r_overlap_tot)
BMBVHTree * BKE_bmbvh_new_ex(BMesh *bm, const Span< std::array< BMLoop *, 3 > > looptris, int flag, const blender::float3 *cos_cage, const bool cos_cage_free, bool(*test_fn)(BMFace *, void *user_data), void *user_data)
static void bmbvh_find_vert_closest_cb(void *userdata, int index, const float co[3], BVHTreeNearest *hit)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
ccl_device_inline float3 cos(float3 v)
const BMBVHTree * tree_pair[2]
Span< std::array< BMLoop *, 3 > > looptris
const blender::float3 * cos_cage
blender::Array< std::array< BMLoop *, 3 > > looptris
Span< std::array< BMLoop *, 3 > > looptris
const blender::float3 * cos_cage
RayCastUserData bmcb_data
BMBVHTree_FaceFilter filter_cb
const blender::float3 * cos_cage
Span< std::array< BMLoop *, 3 > > looptris
const blender::float3 * cos_cage
Span< std::array< BMLoop *, 3 > > looptris