diff -r a5127346fbcd -r 09aedbf5f95f include/kdtree.h --- a/include/kdtree.h Sun Apr 20 19:27:59 2008 +0200 +++ b/include/kdtree.h Mon Apr 21 08:47:36 2008 +0200 @@ -29,6 +29,7 @@ #include #include +#include #include "container.h" #include "vector.h" @@ -42,29 +43,30 @@ class KdNode { Float split; - short axis; /* 0,1,2 => x,y,z; 3 => leaf */ -public: union { KdNode *children; ShapeList *shapes; + int flags; /* 0,1,2 => x,y,z; 3 => leaf */ }; - - KdNode() : axis(3) { shapes = new ShapeList(); }; +public: + KdNode() { shapes = new ShapeList(); assert((flags & 3) == 0); setLeaf(); }; ~KdNode(); - void setAxis(short aAxis) { axis = aAxis; }; - short getAxis() { return axis; }; + void setLeaf() { flags |= 3; }; + bool isLeaf() { return (flags & 3) == 3; }; + + void setAxis(int aAxis) { flags &= ~3; flags |= aAxis; }; + short getAxis() { return flags & 3; }; void setSplit(Float aSplit) { split = aSplit; }; Float getSplit() { return split; }; - void setLeaf() { axis = 3; }; - bool isLeaf() { return axis == 3; }; + void setChildren(KdNode *node) { children = node; assert((flags & 3) == 0); }; + KdNode *getLeftChild() { return (KdNode*)((off_t)children & ~3); }; + KdNode *getRightChild() { return (KdNode*)((off_t)children & ~3) + 1; }; - KdNode *getLeftChild() { return children; }; - KdNode *getRightChild() { return children+1; }; - - void addShape(Shape* aShape) { shapes->push_back(aShape); }; + ShapeList *getShapes() { return (ShapeList*)((off_t)shapes & ~3); }; + void addShape(Shape* aShape) { getShapes()->push_back(aShape); }; void subdivide(BBox bbox, int maxdepth); };