forked from bartvdbraak/blender
Missed adding BVH callbacks in recent commit
This commit is contained in:
parent
0bf2b207e2
commit
748899a50a
@ -124,6 +124,29 @@ static void mesh_faces_nearest_point(void *userdata, int index, const float co[3
|
|||||||
|
|
||||||
} while (t2);
|
} while (t2);
|
||||||
}
|
}
|
||||||
|
/* copy of function above */
|
||||||
|
static void mesh_looptri_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
|
||||||
|
{
|
||||||
|
const BVHTreeFromMesh *data = (BVHTreeFromMesh *) userdata;
|
||||||
|
const MVert *vert = data->vert;
|
||||||
|
const MLoopTri *lt = &data->looptri[index];
|
||||||
|
const float *vtri_co[3] = {
|
||||||
|
vert[data->loop[lt->tri[0]].v].co,
|
||||||
|
vert[data->loop[lt->tri[1]].v].co,
|
||||||
|
vert[data->loop[lt->tri[2]].v].co,
|
||||||
|
};
|
||||||
|
float nearest_tmp[3], dist_sq;
|
||||||
|
|
||||||
|
closest_on_tri_to_point_v3(nearest_tmp, co, UNPACK3(vtri_co));
|
||||||
|
dist_sq = len_squared_v3v3(co, nearest_tmp);
|
||||||
|
|
||||||
|
if (dist_sq < nearest->dist_sq) {
|
||||||
|
nearest->index = index;
|
||||||
|
nearest->dist_sq = dist_sq;
|
||||||
|
copy_v3_v3(nearest->co, nearest_tmp);
|
||||||
|
normal_tri_v3(nearest->no, UNPACK3(vtri_co));
|
||||||
|
}
|
||||||
|
}
|
||||||
/* copy of function above (warning, should de-duplicate with editmesh_bvh.c) */
|
/* copy of function above (warning, should de-duplicate with editmesh_bvh.c) */
|
||||||
static void editmesh_faces_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
|
static void editmesh_faces_nearest_point(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
|
||||||
{
|
{
|
||||||
@ -190,6 +213,32 @@ static void mesh_faces_spherecast(void *userdata, int index, const BVHTreeRay *r
|
|||||||
|
|
||||||
} while (t2);
|
} while (t2);
|
||||||
}
|
}
|
||||||
|
/* copy of function above */
|
||||||
|
static void mesh_looptri_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
|
||||||
|
{
|
||||||
|
const BVHTreeFromMesh *data = (BVHTreeFromMesh *) userdata;
|
||||||
|
const MVert *vert = data->vert;
|
||||||
|
const MLoopTri *lt = &data->looptri[index];
|
||||||
|
const float *vtri_co[3] = {
|
||||||
|
vert[data->loop[lt->tri[0]].v].co,
|
||||||
|
vert[data->loop[lt->tri[1]].v].co,
|
||||||
|
vert[data->loop[lt->tri[2]].v].co,
|
||||||
|
};
|
||||||
|
float dist;
|
||||||
|
|
||||||
|
if (data->sphere_radius == 0.0f)
|
||||||
|
dist = bvhtree_ray_tri_intersection(ray, hit->dist, UNPACK3(vtri_co));
|
||||||
|
else
|
||||||
|
dist = sphereray_tri_intersection(ray, data->sphere_radius, hit->dist, UNPACK3(vtri_co));
|
||||||
|
|
||||||
|
if (dist >= 0 && dist < hit->dist) {
|
||||||
|
hit->index = index;
|
||||||
|
hit->dist = dist;
|
||||||
|
madd_v3_v3v3fl(hit->co, ray->origin, ray->direction, dist);
|
||||||
|
|
||||||
|
normal_tri_v3(hit->no, UNPACK3(vtri_co));
|
||||||
|
}
|
||||||
|
}
|
||||||
/* copy of function above (warning, should de-duplicate with editmesh_bvh.c) */
|
/* copy of function above (warning, should de-duplicate with editmesh_bvh.c) */
|
||||||
static void editmesh_faces_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
|
static void editmesh_faces_spherecast(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
|
||||||
{
|
{
|
||||||
@ -906,8 +955,8 @@ static void bvhtree_from_mesh_looptri_setup_data(
|
|||||||
data->raycast_callback = editmesh_faces_spherecast;
|
data->raycast_callback = editmesh_faces_spherecast;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
data->nearest_callback = mesh_faces_nearest_point;
|
data->nearest_callback = mesh_looptri_nearest_point;
|
||||||
data->raycast_callback = mesh_faces_spherecast;
|
data->raycast_callback = mesh_looptri_spherecast;
|
||||||
|
|
||||||
data->vert = vert;
|
data->vert = vert;
|
||||||
data->vert_allocated = vert_allocated;
|
data->vert_allocated = vert_allocated;
|
||||||
|
Loading…
Reference in New Issue
Block a user