#pragma once #include #include #include #include #include #include using namespace Eigen; using Verts = Matrix; using Trigs = Matrix; namespace cubvh { // abstract class of raytracer class cuBVH { public: cuBVH() {} virtual ~cuBVH() {} virtual void ray_trace(at::Tensor rays_o, at::Tensor rays_d, at::Tensor positions, at::Tensor face_id, at::Tensor depth) = 0; virtual void unsigned_distance(at::Tensor positions, at::Tensor distances, at::Tensor face_id, at::optional uvw) = 0; virtual void signed_distance(at::Tensor positions, at::Tensor distances, at::Tensor face_id, at::optional uvw, uint32_t mode) = 0; virtual std::tuple export_state() const = 0; }; // function to create an implementation of cuBVH cuBVH* create_cuBVH(Ref vertices, Ref triangles); cuBVH* create_cuBVH_from_state(at::Tensor triangle_vertices, at::Tensor triangle_ids, at::Tensor node_mins, at::Tensor node_maxs, at::Tensor node_children); std::tuple build_cuBVH_state(Ref vertices, Ref triangles); // floodfill at::Tensor floodfill(at::Tensor grid); // sparse marching cubes std::tuple sparse_marching_cubes(at::Tensor coords, at::Tensor corners, double iso_d, bool ensure_consistency = false); // GPU ND integer hash table (default D=3) - abstract interface class cuHashTable { public: cuHashTable() {} virtual ~cuHashTable() {} virtual void set_num_dims(int d) = 0; virtual int get_num_dims() const = 0; virtual void resize(int capacity) = 0; virtual void prepare() = 0; virtual void insert(at::Tensor coords) = 0; virtual void build(at::Tensor coords) = 0; virtual at::Tensor search(at::Tensor queries) const = 0; }; // Factory to create an implementation of cuHashTable cuHashTable* create_cuHashTable(); } // namespace cubvh