initial commit of the fluid simulator.
[blender.git] / intern / elbeem / intern / ntl_scene.h
1 /******************************************************************************
2  *
3  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
4  * Copyright 2003,2004 Nils Thuerey
5  *
6  * Scene object, that contains and manages all geometry objects
7  *
8  *****************************************************************************/
9 #ifndef NTL_SCENE_HH
10 #define NTL_SCENE_HH
11
12 #include <sstream>
13 #include "ntl_vector3dim.h"
14 #include "ntl_material.h"
15 #include "ntl_geometryclass.h"
16 #include "ntl_triangle.h"
17 #include "ntl_bsptree.h"
18 class ntlRay;
19 class ntlGeometryObject;
20
21 /*! fluid geometry init types */
22 #define FGI_FLAGSTART 16
23 #define FGI_FLUID                       (1<<(FGI_FLAGSTART+0))
24 #define FGI_NO_FLUID    (1<<(FGI_FLAGSTART+1))
25 #define FGI_BNDNO                       (1<<(FGI_FLAGSTART+2))
26 #define FGI_BNDFREE             (1<<(FGI_FLAGSTART+3))
27 #define FGI_NO_BND              (1<<(FGI_FLAGSTART+4))
28 #define FGI_ACC                         (1<<(FGI_FLAGSTART+5))
29 #define FGI_NO_ACC              (1<<(FGI_FLAGSTART+6))
30 #define FGI_SPEEDSET            (1<<(FGI_FLAGSTART+7))
31 #define FGI_NO_SPEEDSET (1<<(FGI_FLAGSTART+8))
32
33 #define FGI_ALLBOUNDS (FGI_BNDNO | FGI_BNDFREE)
34
35 #define FGI_REFP1                       (1<<(FGI_FLAGSTART+0))
36 #define FGI_REFP2                       (1<<(FGI_FLAGSTART+1))
37 #define FGI_REFP3                       (1<<(FGI_FLAGSTART+2))
38
39 #define FGI_ALLREFS     (FGI_REFP1 | FGI_REFP2 | FGI_REFP3)
40
41
42 //! convenience macro for adding triangles
43 #define sceneAddTriangle(p1,p2,p3, pn1,pn2,pn3, trin, smooth)   {\
44         \
45         ntlTriangle tri;\
46         int tempVert;\
47   \
48         if(normals->size() != vertices->size()) {\
49                 errorOut("getTriangles Error for '"<<mName<<"': Vertices and normals sizes to not match!!!");\
50                 exit(1); }\
51   \
52         vertices->push_back( p1 ); \
53         normals->push_back( pn1 ); \
54         tempVert = normals->size()-1;\
55         tri.getPoints()[0] = tempVert;\
56   \
57         vertices->push_back( p2 ); \
58         normals->push_back( pn2 ); \
59         tempVert = normals->size()-1;\
60         tri.getPoints()[1] = tempVert;\
61   \
62         vertices->push_back( p3 ); \
63         normals->push_back( pn3 ); \
64         tempVert = normals->size()-1;\
65         tri.getPoints()[2] = tempVert;\
66   \
67         \
68         /* init flags */\
69         int flag = 0; \
70         if(getVisible()){ flag |= TRI_GEOMETRY; }\
71         if(getCastShadows() ) { \
72                 flag |= TRI_CASTSHADOWS; } \
73         if( (getMaterial()->getMirror()>0.0) ||  \
74                         (getMaterial()->getTransparence()>0.0) ||  \
75                         (getMaterial()->getFresnel()>0.0) ) { \
76                 flag |= TRI_MAKECAUSTICS; } \
77         else { \
78                 flag |= TRI_NOCAUSTICS; } \
79         \
80         /* init geo init id */\
81         int geoiId = getGeoInitId(); \
82         if(geoiId > 0) { \
83                 flag |= (1<< (geoiId+4)); \
84                 flag |= mGeoInitType; \
85         } \
86         \
87         tri.setFlags( flag );\
88         \
89         /* triangle normal missing */\
90         tri.setNormal( trin );\
91         tri.setSmoothNormals( smooth );\
92         tri.setObjectId( objectId );\
93         triangles->push_back( tri ); \
94         }\
95
96
97
98 class ntlScene
99 {
100 public:
101   /* CONSTRUCTORS */
102   /*! Default constructor */
103   ntlScene( ntlRenderGlobals *glob );
104   /*! Default destructor */
105    ~ntlScene();
106
107         /*! Add an object to the scene */
108         inline void addGeoClass(ntlGeometryClass *geo) { mGeos.push_back( geo ); }
109
110         /*! Acces a certain object */
111         inline ntlGeometryObject *getObject(int id) { 
112                 if(!mSceneBuilt) { errMsg("ntlScene::getObject","Scene not inited!"); exit(1); }
113                 return mObjects[id]; }
114
115         /*! Acces object array */
116         inline vector<ntlGeometryObject*> *getObjects() { 
117                 if(!mSceneBuilt) { errMsg("ntlScene::getObjects[]","Scene not inited!"); exit(1); }
118                 return &mObjects; }
119
120         /*! Acces geo class array */
121         inline vector<ntlGeometryClass*> *getGeoClasses() { 
122                 if(!mSceneBuilt) { errMsg("ntlScene::getGeoClasses[]","Scene not inited!"); exit(1); }
123                 return &mGeos; }
124
125         /*! draw scene with opengl */
126         //void draw();
127         
128         /*! Build the scene arrays */
129         void buildScene( void );
130         
131         //! Prepare the scene triangles and maps for raytracing
132         void prepareScene( void );
133         //! Do some memory cleaning, when frame is finished
134         void cleanupScene( void );
135
136         /*! Intersect a ray with the scene triangles */
137         void intersectScene(const ntlRay &r, gfxReal &distance, ntlVec3Gfx &normal, ntlTriangle *&tri, int flags) const;
138
139         /*! return a vertex */
140         ntlVec3Gfx getVertex(int index) { return mVertices[index]; } 
141
142         // for tree generation 
143         /*! return pointer to vertices vector */
144         vector<ntlVec3Gfx> *getVertexPointer( void ) { return &mVertices; }
145         /*! return pointer to vertices vector */
146         vector<ntlVec3Gfx> *getVertexNormalPointer( void ) { return &mVertNormals; }
147         /*! return pointer to vertices vector */
148         vector<ntlTriangle> *getTrianglePointer( void ) { return &mTriangles; }
149
150 private:
151
152         /*! Global settings */
153         ntlRenderGlobals *mpGlob;
154
155   /*! List of geometry classes */
156   vector<ntlGeometryClass *> mGeos;
157
158   /*! List of geometry objects */
159   vector<ntlGeometryObject *> mObjects;
160
161   /*! List of triangles */
162   vector<ntlTriangle> mTriangles;
163   /*! List of vertices */
164   vector<ntlVec3Gfx>  mVertices;
165   /*! List of normals */
166   vector<ntlVec3Gfx>  mVertNormals;
167   /*! List of triangle normals */
168   vector<ntlVec3Gfx>  mTriangleNormals;
169
170         /*! Tree to store quickly intersect triangles */
171         ntlTree *mpTree;
172
173         /*! id of dislpay list for raytracer stuff */
174         int mDisplayListId;
175
176         /*! was the scene successfully built? only then getObject(i) requests are valid */
177         bool mSceneBuilt;
178
179         /*! shader/obj initializations are only done on first init */
180         bool mFirstInitDone;
181
182 };
183
184
185 #endif
186