#pragma once #include #include #include #include using namespace Eigen; using Verts = Matrix; using Trigs = Matrix; namespace cubvh { class cuBVHImpl : public cuBVH { public: // accept numpy array (cpu) to init cuBVHImpl(Ref vertices, Ref triangles) : cuBVH() { const size_t n_vertices = vertices.rows(); const size_t n_triangles = triangles.rows(); triangles_cpu.resize(n_triangles); for (size_t i = 0; i < n_triangles; i++) { triangles_cpu[i] = {vertices.row(triangles(i, 0)), vertices.row(triangles(i, 1)), vertices.row(triangles(i, 2)), (int64_t)i}; } if (!triangle_bvh) { triangle_bvh = TriangleBvh::make(); } triangle_bvh->build(triangles_cpu, 8); triangles_gpu.resize_and_copy_from_host(triangles_cpu); // TODO: need OPTIX // triangle_bvh->build_optix(triangles_gpu, m_inference_stream); } void ray_trace(at::Tensor rays_o, at::Tensor rays_d, at::Tensor positions, at::Tensor face_id, at::Tensor depth) { const uint32_t n_elements = rays_o.size(0); cudaStream_t stream = at::cuda::getCurrentCUDAStream(); triangle_bvh->ray_trace_gpu(n_elements, rays_o.data_ptr(), rays_d.data_ptr(), positions.data_ptr(), face_id.data_ptr(), depth.data_ptr(), triangles_gpu.data(), stream); } void unsigned_distance(at::Tensor positions, at::Tensor distances, at::Tensor face_id, at::optional uvw) { const uint32_t n_elements = positions.size(0); cudaStream_t stream = at::cuda::getCurrentCUDAStream(); triangle_bvh->unsigned_distance_gpu(n_elements, positions.data_ptr(), distances.data_ptr(), face_id.data_ptr(), uvw.has_value() ? uvw.value().data_ptr() : nullptr, triangles_gpu.data(), stream); } void signed_distance(at::Tensor positions, at::Tensor distances, at::Tensor face_id, at::optional uvw, uint32_t mode) { const uint32_t n_elements = positions.size(0); cudaStream_t stream = at::cuda::getCurrentCUDAStream(); triangle_bvh->signed_distance_gpu(n_elements, mode, positions.data_ptr(), distances.data_ptr(), face_id.data_ptr(), uvw.has_value() ? uvw.value().data_ptr() : nullptr, triangles_gpu.data(), stream); } std::vector triangles_cpu; GPUMemory triangles_gpu; std::shared_ptr triangle_bvh; }; cuBVH* create_cuBVH(Ref vertices, Ref triangles) { return new cuBVHImpl{vertices, triangles}; } } // namespace cubvh