20 #ifndef __OPC_OPTIMIZEDTREE_H__
21 #define __OPC_OPTIMIZEDTREE_H__
24 #define IMPLEMENT_IMPLICIT_NODE(base_class, volume) \
27 inline_ base_class() : mData(0) {} \
28 inline_ ~base_class() {} \
30 inline_ bool IsLeaf() const { return mData&1; } \
32 inline_ const base_class* GetPos() const { return (base_class*)mData; } \
33 inline_ const base_class* GetNeg() const { return ((base_class*)mData)+1; } \
34 inline_ udword GetPrimitive() const { return (udword)(mData>>1); } \
36 inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \
42 #define IMPLEMENT_NOLEAF_NODE(base_class, volume) \
45 inline_ base_class() : mPosData(0), mNegData(0) {} \
46 inline_ ~base_class() {} \
48 inline_ bool HasPosLeaf() const { return mPosData&1; } \
49 inline_ bool HasNegLeaf() const { return mNegData&1; } \
51 inline_ const base_class* GetPos() const { return (base_class*)mPosData; } \
52 inline_ const base_class* GetNeg() const { return (base_class*)mNegData; } \
53 inline_ udword GetPosPrimitive() const { return (udword)(mPosData>>1); } \
54 inline_ udword GetNegPrimitive() const { return (udword)(mNegData>>1); } \
56 inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \
66 inline_ float GetVolume()
const {
return mAABB.mExtents.x * mAABB.mExtents.y * mAABB.mExtents.z; }
67 inline_ float GetSize()
const {
return mAABB.mExtents.SquareMagnitude(); }
72 if(Bits[1]>Max) Max = Bits[1];
73 if(Bits[2]>Max) Max = Bits[2];
92 const uword* Bits = mAABB.mExtents;
94 if(Bits[1]>Max) Max = Bits[1];
95 if(Bits[2]>Max) Max = Bits[2];
113 #define IMPLEMENT_COLLISION_TREE(base_class, node) \
117 virtual ~base_class(); \
119 override(AABBOptimizedTree) bool Build(AABBTree* tree); \
121 override(AABBOptimizedTree) bool Refit(const MeshInterface* mesh_interface); \
123 override(AABBOptimizedTree) bool Walk(GenericWalkingCallback callback, void* user_data) const; \
125 inline_ const node* GetNodes() const { return mNodes; } \
127 override(AABBOptimizedTree) udword GetUsedBytes() const { return mNbNodes*sizeof(node); } \
148 virtual bool Build(
AABBTree* tree) = 0;
171 virtual udword GetUsedBytes()
const = 0;
206 #endif // __OPC_OPTIMIZEDTREE_H__