~diresu/blender/blender-command-port

« back to all changes in this revision

Viewing changes to intern/elbeem/intern/ntl_bsptree.h

  • Committer: theeth
  • Date: 2008-10-14 16:52:04 UTC
  • Revision ID: vcs-imports@canonical.com-20081014165204-r32w2gm6s0osvdhn
copy back trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************************
 
2
 *
 
3
 * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
 
4
 * Copyright 2003-2006 Nils Thuerey
 
5
 *
 
6
 * Tree container for fast triangle intersects
 
7
 *
 
8
 *****************************************************************************/
 
9
#ifndef NTL_TREE_H
 
10
#define NTL_TREE_H
 
11
 
 
12
#include "ntl_vector3dim.h"
 
13
#include "ntl_ray.h"
 
14
 
 
15
 
 
16
#define AXIS_X 0
 
17
#define AXIS_Y 1
 
18
#define AXIS_Z 2
 
19
 
 
20
#define BSP_STACK_SIZE 50
 
21
 
 
22
 
 
23
//! bsp tree stack classes, defined in ntl_bsptree.cpp,
 
24
//  detailed definition unnecesseary here
 
25
class BSPNode;
 
26
class BSPStackElement;
 
27
class BSPStack;
 
28
class TriangleBBox;
 
29
class ntlScene;
 
30
class ntlTriangle;
 
31
 
 
32
 
 
33
//! Class for a bsp tree for triangles
 
34
class ntlTree
 
35
{
 
36
        public:
 
37
 
 
38
                //! Default constructor
 
39
                ntlTree();
 
40
                //! Constructor with init
 
41
                ntlTree(int depth, int objnum, ntlScene *scene, int triFlagMask);
 
42
                //! Destructor
 
43
                ~ntlTree();
 
44
 
 
45
                //! subdivide tree
 
46
                void subdivide(BSPNode *node, int depth, int axis);
 
47
 
 
48
                //! intersect ray with BSPtree
 
49
                void intersect(const ntlRay &ray, gfxReal &distance, ntlVec3Gfx &normal, ntlTriangle *&tri, int flags, bool forceNonsmooth) const;
 
50
                //! intersect along +X ray
 
51
                void intersectX(const ntlRay &ray, gfxReal &distance, ntlVec3Gfx &normal, ntlTriangle *&tri, int flags, bool forceNonsmooth) const;
 
52
 
 
53
                //! Returns number of nodes
 
54
                int getCurrentNodes( void ) { return mCurrentNodes; }
 
55
 
 
56
        protected:
 
57
 
 
58
                // check if a triangle is in a node
 
59
                bool checkAABBTriangle(ntlVec3Gfx &min, ntlVec3Gfx &max, ntlTriangle *tri);
 
60
 
 
61
 
 
62
                // VARs
 
63
 
 
64
                //! distance to plane function for nodes
 
65
                gfxReal distanceToPlane(BSPNode *curr, ntlVec3Gfx plane, ntlRay ray) const;
 
66
 
 
67
                //! return ordering of children nodes relatice to origin point
 
68
                void getChildren(BSPNode *curr, ntlVec3Gfx origin, BSPNode *&node_near, BSPNode *&node_far) const;
 
69
 
 
70
                //! delete a node of the tree with all sub nodes, dont delete root members
 
71
                void deleteNode(BSPNode *curr);
 
72
 
 
73
                //inline bool isLeaf(BSPNode *node) const { return (node->child[0] == NULL); }
 
74
 
 
75
 
 
76
                //! AABB for tree
 
77
                ntlVec3Gfx mStart,mEnd;
 
78
 
 
79
                //! maximum depth of tree
 
80
                int mMaxDepth;
 
81
 
 
82
                //! maximum number of objects in one node
 
83
                int mMaxListLength;
 
84
 
 
85
                //! root node pointer
 
86
                BSPNode *mpRoot;
 
87
                //! count no. of node
 
88
                int mNumNodes;
 
89
                int mAbortSubdiv;
 
90
 
 
91
                //! stack for the node pointers
 
92
                BSPStack *mpNodeStack;
 
93
                //stack<BSPNode *> nodestack;
 
94
 
 
95
                //! pointer to vertex array
 
96
                vector<ntlVec3Gfx> *mpVertices;
 
97
 
 
98
                //! pointer to vertex array
 
99
                vector<ntlVec3Gfx> *mpVertNormals;
 
100
 
 
101
                //! vector for all the triangles
 
102
                vector<ntlTriangle> *mpTriangles;
 
103
                vector<ntlTriangle *> *mppTriangles;
 
104
 
 
105
                //! temporary array for triangle distribution to nodes
 
106
                char *mpTriDist;
 
107
 
 
108
                //! temporary array for triangle bounding boxes
 
109
                TriangleBBox *mpTBB;
 
110
 
 
111
                //! triangle mask - include only triangles that match mask
 
112
                int mTriangleMask;
 
113
 
 
114
                //! Status vars (max depth, # of current nodes)
 
115
                int mCurrentDepth, mCurrentNodes;
 
116
 
 
117
                //! duplicated triangles, inited during subdivide 
 
118
                int mTriDoubles; 
 
119
 
 
120
};
 
121
 
 
122
 
 
123
#endif
 
124
 
 
125