#pragma once #include "../lib/mathlib.h" #include "../platform/gl.h" #include "trace.h" namespace PT { template class BVH { public: BVH() = default; BVH(std::vector&& primitives, size_t max_leaf_size = 1); void build(std::vector&& primitives, size_t max_leaf_size = 1); BVH(BVH&& src) = default; BVH& operator=(BVH&& src) = default; BVH(const BVH& src) = delete; BVH& operator=(const BVH& src) = delete; BBox bbox() const; Trace hit(const Ray& ray) const; BVH copy() const; size_t visualize(GL::Lines& lines, GL::Lines& active, size_t level, const Mat4& trans) const; std::vector destructure(); void clear(); private: class Node { BBox bbox; size_t start, size, l, r; // A node is a leaf if l == r, since all interior nodes must have distinct children bool is_leaf() const; friend class BVH; }; size_t new_node(BBox box = {}, size_t start = 0, size_t size = 0, size_t l = 0, size_t r = 0); std::vector nodes; std::vector primitives; size_t root_idx = 0; }; } // namespace PT #ifdef SCOTTY3D_BUILD_REF #include "../reference/bvh.inl" #else #include "../student/bvh.inl" #endif