diff -r 79b516a3803d -r 76b7bd51d64a src/kdtree.h --- a/src/kdtree.h Fri Nov 30 00:44:51 2007 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -#ifndef KDTREE_H -#define KDTREE_H - -#include -#include -#include - -#include "scene.h" - -using namespace std; - -class ShapeList: public vector -{ -}; - -class Container -{ -protected: - BBox bbox; -public: - ShapeList shapes; - Container(): bbox(), shapes() {}; - virtual ~Container() {}; - virtual void addShape(Shape* aShape); - //void addShapeNoExtend(Shape* aShape) { shapes.push_back(aShape); }; - virtual Shape *nearest_intersection(const Shape *origin_shape, const Ray &ray, - float &nearest_distance); - virtual void optimize() {}; -}; - -class KdNode -{ - float split; - short axis; /* 0,1,2 => x,y,z; 3 => leaf */ -public: - union { - KdNode *children; - ShapeList *shapes; - }; - - KdNode() : axis(3) { shapes = new ShapeList(); }; - ~KdNode(); - - void setAxis(short aAxis) { axis = aAxis; }; - short getAxis() { return axis; }; - - void setSplit(float aSplit) { split = aSplit; }; - float getSplit() { return split; }; - - void setLeaf() { axis = 3; }; - bool isLeaf() { return axis == 3; }; - - KdNode *getLeftChild() { return children; }; - KdNode *getRightChild() { return children+1; }; - - void addShape(Shape* aShape) { shapes->push_back(aShape); }; - - void subdivide(BBox bbox, int depth); -}; - -class KdTree: public Container -{ - KdNode *root; - bool built; - int max_depth; -public: - KdTree() : Container(), root(NULL), built(false), max_depth(32) {}; - ~KdTree() { if (root) delete root; }; - void addShape(Shape* aShape) { Container::addShape(aShape); built = false; }; - Shape *nearest_intersection(const Shape *origin_shape, const Ray &ray, - float &nearest_distance); - void optimize() { build(); }; - void build(); - void save(ostream &str, KdNode *node = NULL); - void load(istream &str, KdNode *node = NULL); - void setMaxDepth(int md) { max_depth = md; }; -}; - -#endif