62 lines
2.1 KiB
C++
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
|