Blender  V2.59
ntl_bsptree.h
Go to the documentation of this file.
00001 
00004 /******************************************************************************
00005  *
00006  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
00007  * Copyright 2003-2006 Nils Thuerey
00008  *
00009  * Tree container for fast triangle intersects
00010  *
00011  *****************************************************************************/
00012 #ifndef NTL_TREE_H
00013 #define NTL_TREE_H
00014 
00015 #include "ntl_vector3dim.h"
00016 #include "ntl_ray.h"
00017 
00018 
00019 #define AXIS_X 0
00020 #define AXIS_Y 1
00021 #define AXIS_Z 2
00022 
00023 #define BSP_STACK_SIZE 50
00024 
00025 
00027 //  detailed definition unnecesseary here
00028 class BSPNode;
00029 class BSPStackElement;
00030 class BSPStack;
00031 class TriangleBBox;
00032 class ntlScene;
00033 class ntlTriangle;
00034 
00035 
00037 class ntlTree
00038 {
00039         public:
00040 
00042                 ntlTree();
00044                 ntlTree(int depth, int objnum, ntlScene *scene, int triFlagMask);
00046                 ~ntlTree();
00047 
00049                 void subdivide(BSPNode *node, int depth, int axis);
00050 
00052                 void intersect(const ntlRay &ray, gfxReal &distance, ntlVec3Gfx &normal, ntlTriangle *&tri, int flags, bool forceNonsmooth) const;
00054                 void intersectX(const ntlRay &ray, gfxReal &distance, ntlVec3Gfx &normal, ntlTriangle *&tri, int flags, bool forceNonsmooth) const;
00055 
00057                 int getCurrentNodes( void ) { return mCurrentNodes; }
00058 
00059         protected:
00060 
00061                 // check if a triangle is in a node
00062                 bool checkAABBTriangle(ntlVec3Gfx &min, ntlVec3Gfx &max, ntlTriangle *tri);
00063 
00064 
00065                 // VARs
00066 
00068                 gfxReal distanceToPlane(BSPNode *curr, ntlVec3Gfx plane, ntlRay ray) const;
00069 
00071                 void getChildren(BSPNode *curr, ntlVec3Gfx origin, BSPNode *&node_near, BSPNode *&node_far) const;
00072 
00074                 void deleteNode(BSPNode *curr);
00075 
00076                 //inline bool isLeaf(BSPNode *node) const { return (node->child[0] == NULL); }
00077 
00078 
00080                 ntlVec3Gfx mStart,mEnd;
00081 
00083                 int mMaxDepth;
00084 
00086                 int mMaxListLength;
00087 
00089                 BSPNode *mpRoot;
00091                 int mNumNodes;
00092                 int mAbortSubdiv;
00093 
00095                 BSPStack *mpNodeStack;
00096                 //stack<BSPNode *> nodestack;
00097 
00099                 vector<ntlVec3Gfx> *mpVertices;
00100 
00102                 vector<ntlVec3Gfx> *mpVertNormals;
00103 
00105                 vector<ntlTriangle> *mpTriangles;
00106                 vector<ntlTriangle *> *mppTriangles;
00107 
00109                 char *mpTriDist;
00110 
00112                 TriangleBBox *mpTBB;
00113 
00115                 int mTriangleMask;
00116 
00118                 int mCurrentDepth, mCurrentNodes;
00119 
00121                 int mTriDoubles; 
00122 
00123 };
00124 
00125 
00126 #endif
00127 
00128