test_pie/external/opencl/kernels/correspondences.cl

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;
}