150 lines
3.7 KiB
Common Lisp
150 lines
3.7 KiB
Common Lisp
__kernel void ps2mesh(
|
|
__global float* in_mesh_face_barycenters,
|
|
//__global float* in_mesh_normals,
|
|
//__global unsigned int* in_mesh_indices,
|
|
__global float* in_ps_points,
|
|
//__global float* in_ps_normals,
|
|
unsigned int num_faces,
|
|
unsigned int num_points,
|
|
__global unsigned int* out_closest_indices
|
|
)
|
|
{
|
|
size_t tid = get_global_id(0);
|
|
|
|
if (tid >= num_points)
|
|
return;
|
|
|
|
float3 p,vtx;
|
|
float d,dist = FLT_MAX;
|
|
unsigned int closest_idx, i;
|
|
|
|
p = (float3)(in_ps_points[tid*3+0], in_ps_points[tid*3+1], in_ps_points[tid*3+2]);
|
|
|
|
for (i=0; i < num_faces; ++i)
|
|
{
|
|
vtx = (float3)(in_mesh_face_barycenters[i*3+0], in_mesh_face_barycenters[i*3+1], in_mesh_face_barycenters[i*3+2]);
|
|
d = distance(vtx, p);
|
|
|
|
if (d < dist)
|
|
{
|
|
dist = d;
|
|
closest_idx = i;
|
|
}
|
|
}
|
|
|
|
out_closest_indices[tid] = closest_idx;
|
|
}
|
|
|
|
|
|
//__kernel void ps2mesh(
|
|
// __global float* in_mesh_vertices,
|
|
// //__global float* in_mesh_normals,
|
|
// //__global unsigned int* in_mesh_indices,
|
|
// __global float* in_ps_points,
|
|
// //__global float* in_ps_normals,
|
|
// unsigned int num_vertices,
|
|
// unsigned int num_points,
|
|
// __global unsigned int* out_closest_indices
|
|
// )
|
|
//{
|
|
// size_t tid = get_global_id(0);
|
|
//
|
|
// if (tid >= num_points)
|
|
// return;
|
|
//
|
|
// float3 p,vtx;
|
|
// float d,dist = FLT_MAX;
|
|
// unsigned int closest_idx, i;
|
|
//
|
|
// p = (float3)(in_ps_points[tid*3+0], in_ps_points[tid*3+1], in_ps_points[tid*3+2]);
|
|
//
|
|
// for (i=0; i < num_vertices; ++i)
|
|
// {
|
|
// vtx = (float3)(in_mesh_vertices[i*3+0], in_mesh_vertices[i*3+1], in_mesh_vertices[i*3+2]);
|
|
// d = distance(vtx, p);
|
|
//
|
|
// if (d < dist)
|
|
// {
|
|
// dist = d;
|
|
// closest_idx = i;
|
|
// }
|
|
// }
|
|
//
|
|
// out_closest_indices[tid] = closest_idx;
|
|
//}
|
|
|
|
__kernel void mesh2ps(
|
|
__global float* in_mesh_vertices,
|
|
//__global float* in_mesh_normals,
|
|
//__global unsigned int* in_mesh_indices,
|
|
__global float* in_ps_points,
|
|
//__global float* in_ps_normals,
|
|
unsigned int num_vertices,
|
|
unsigned int num_points,
|
|
__global unsigned int* out_closest_indices,
|
|
__global unsigned int* out_closest_distance
|
|
)
|
|
{
|
|
size_t tid = get_global_id(0);
|
|
|
|
if (tid >= num_vertices)
|
|
return;
|
|
|
|
float3 p,vtx;
|
|
float d,dist = FLT_MAX;
|
|
unsigned int closest_idx, i;
|
|
|
|
//p = (float3)(in_ps_points[tid*3+0], in_ps_points[tid*3+1], in_ps_points[tid*3+2]);
|
|
p = (float3)(in_mesh_vertices[tid*3+0], in_mesh_vertices[tid*3+1], in_mesh_vertices[tid*3+2]);
|
|
|
|
for (i=0; i < num_points; ++i)
|
|
{
|
|
vtx = (float3)(in_ps_points[i*3+0], in_ps_points[i*3+1], in_ps_points[i*3+2]);
|
|
d = distance(vtx, p);
|
|
|
|
if (d < dist)
|
|
{
|
|
dist = d;
|
|
closest_idx = i;
|
|
}
|
|
}
|
|
|
|
out_closest_indices[tid] = closest_idx;
|
|
out_closest_distance[tid] = dist;
|
|
}
|
|
|
|
|
|
__kernel void ps2ps(
|
|
__global float* src_points,
|
|
__global float* tar_points,
|
|
unsigned int num_src_points,
|
|
unsigned int num_tar_points,
|
|
__global unsigned int* out_closest_indices
|
|
)
|
|
{
|
|
size_t tid = get_global_id(0);
|
|
|
|
if (tid >= num_src_points)
|
|
return;
|
|
|
|
float3 p_src,p_tar;
|
|
float d,dist = FLT_MAX;
|
|
unsigned int closest_idx, i;
|
|
|
|
p_src = (float3)(src_points[tid*3+0], src_points[tid*3+1], src_points[tid*3+2]);
|
|
|
|
for (i=0; i < num_tar_points; ++i)
|
|
{
|
|
p_tar = (float3)(tar_points[i*3+0], tar_points[i*3+1], tar_points[i*3+2]);
|
|
d = distance(p_tar, p_src);
|
|
|
|
if (d < dist)
|
|
{
|
|
dist = d;
|
|
closest_idx = i;
|
|
}
|
|
}
|
|
|
|
out_closest_indices[tid] = closest_idx;
|
|
}
|