accelerated-raytracer/src/KDTree.h

62 lines
2.1 KiB
C++

#ifndef RAYTRYCPP_KDTREE_H
#define RAYTRYCPP_KDTREE_H
#include "AABB.h"
#include "KDAxis.h"
#include "KDLeaf.h"
#include "KDNode.h"
#include "Triangle.h"
#include <random>
#include <vector>
namespace raytry::KD {
typedef std::vector<std::pair<float, const Triangle *>> triangleValueVector;
struct AxisData {
AxisData() = default;
~AxisData() = default;
AABB boundaries{};
std::array<triangleValueVector, Z + 1> mins{triangleValueVector{}, triangleValueVector{}, triangleValueVector{}};
std::array<triangleValueVector, Z + 1> maxs{triangleValueVector{}, triangleValueVector{}, triangleValueVector{}};
};
class Tree {
public:
Tree() = default;
Tree(const Tree &);
~Tree() = default;
Tree &operator=(Tree other);
static Tree build(const std::vector<Triangle> &triangles);
const std::vector<KD::Node> &getNodes();
const std::vector<KD::Leaf> &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<triangleValueVector, Z + 1> &separatingData, std::array<triangleValueVector, Z + 1> &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<KD::Node> nodes{};
std::vector<KD::Leaf> leafs{};
AABB boundaries{};
std::random_device randomDevice{};
std::mt19937 randomGenerator{randomDevice()};
unsigned int randomProbes{0};
};
}// namespace raytry::KD
#endif//RAYTRYCPP_KDTREE_H