#ifndef RAYTRYCPP_KDTREE_H #define RAYTRYCPP_KDTREE_H #include "AABB.h" #include "KDAxis.h" #include "KDLeaf.h" #include "KDNode.h" #include "Triangle.h" #include #include namespace raytry::KD { typedef std::vector> triangleValueVector; struct AxisData { AxisData() = default; ~AxisData() = default; AABB boundaries{}; std::array mins{triangleValueVector{}, triangleValueVector{}, triangleValueVector{}}; std::array maxs{triangleValueVector{}, triangleValueVector{}, triangleValueVector{}}; }; class Tree { public: Tree() = default; Tree(const Tree &); ~Tree() = default; Tree &operator=(Tree other); static Tree build(const std::vector &triangles); const std::vector &getNodes(); const std::vector &getLeafs(); const AABB &getBounds(); private: static constexpr unsigned int maxDepth{7}; static constexpr size_t randomSamples{101}; static constexpr float traversalCost{5}; static void insertSorted(triangleValueVector &sortedTriangles, float value, const Triangle &triangle); static void insertSortedReversed(triangleValueVector &sortedTriangles, float value, const Triangle &triangle); static float calculateCost(float costConstant, float bndMin, float bndMax, unsigned int count); static void separateAxisData(AxisData &data, std::array &separatingData, std::array &otherData, Axis axis, float tVal, bool separatorIsEnd); float probeBestT(const Axis &axis, const AxisData &data); unsigned int recursiveNodeBuild(unsigned int depthLeft, Axis axis, const AxisData &axisData); std::vector nodes{}; std::vector leafs{}; AABB boundaries{}; std::random_device randomDevice{}; std::mt19937 randomGenerator{randomDevice()}; unsigned int randomProbes{0}; }; }// namespace raytry::KD #endif//RAYTRYCPP_KDTREE_H