equal
  deleted
  inserted
  replaced
  
    
    
     1 #ifndef KDTREE_H  | 
     1 #ifndef KDTREE_H  | 
     2 #define KDTREE_H  | 
     2 #define KDTREE_H  | 
     3   | 
     3   | 
     4 #include <vector>  | 
     4 #include <vector>  | 
         | 
     5 #include <iostream>  | 
         | 
     6 #include <fstream>  | 
     5   | 
     7   | 
     6 #include "scene.h"  | 
     8 #include "scene.h"  | 
     7   | 
     9   | 
     8 using namespace std;  | 
    10 using namespace std;  | 
     9   | 
    11   | 
    42 class SplitPos  | 
    44 class SplitPos  | 
    43 { | 
    45 { | 
    44 public:  | 
    46 public:  | 
    45 	float pos;  | 
    47 	float pos;  | 
    46 	int lnum, rnum;  | 
    48 	int lnum, rnum;  | 
    47 	SplitPos(float &aPos): pos(aPos) {}; | 
    49 	SplitPos(): pos(0.0), lnum(0), rnum(0) {}; | 
         | 
    50 	SplitPos(float &aPos): pos(aPos), lnum(0), rnum(0) {}; | 
    48 	friend bool operator<(const SplitPos& a, const SplitPos& b)  | 
    51 	friend bool operator<(const SplitPos& a, const SplitPos& b)  | 
    49 		{ return a.pos < b.pos; }; | 
    52 		{ return a.pos < b.pos; }; | 
         | 
    53 	friend bool operator==(const SplitPos& a, const SplitPos& b)  | 
         | 
    54 		{ return a.pos == b.pos; }; | 
    50 };  | 
    55 };  | 
    51   | 
    56   | 
    52 class SplitList: public vector<SplitPos>  | 
    57 class SplitList: public vector<SplitPos>  | 
    53 { | 
    58 { | 
    54 };  | 
    59 };  | 
    55   | 
    60   | 
    56 class Container  | 
    61 class Container  | 
    57 { | 
    62 { | 
    58 protected:  | 
    63 protected:  | 
    59 	ShapeList shapes;  | 
         | 
    60 	BBox bbox;  | 
    64 	BBox bbox;  | 
    61 public:  | 
    65 public:  | 
    62 	Container(): shapes(), bbox() {}; | 
    66 	ShapeList shapes;  | 
    63 	void addShape(Shape* aShape);  | 
    67 	Container(): bbox(), shapes() {}; | 
         | 
    68 	virtual void addShape(Shape* aShape);  | 
    64 	//void addShapeNoExtend(Shape* aShape) { shapes.push_back(aShape); }; | 
    69 	//void addShapeNoExtend(Shape* aShape) { shapes.push_back(aShape); }; | 
         | 
    70 	virtual void optimize() {}; | 
    65 };  | 
    71 };  | 
    66   | 
    72   | 
    67 class KdNode  | 
    73 class KdNode  | 
    68 { | 
    74 { | 
    69 	float split;  | 
    75 	float split;  | 
    93 };  | 
    99 };  | 
    94   | 
   100   | 
    95 class KdTree: public Container  | 
   101 class KdTree: public Container  | 
    96 { | 
   102 { | 
    97 	KdNode *root;  | 
   103 	KdNode *root;  | 
         | 
   104 	bool built;  | 
    98 public:  | 
   105 public:  | 
    99 	KdTree() {}; | 
   106 	KdTree() : Container(), built(false) {}; | 
   100 	void build();  | 
   107 	void addShape(Shape* aShape) { Container::addShape(aShape); built = false; }; | 
         | 
   108 	void optimize(); // build kd-tree  | 
         | 
   109 	void save(ostream &str, KdNode *node = NULL);  | 
   101 };  | 
   110 };  | 
   102   | 
   111   | 
   103 #endif  | 
   112 #endif  |