Cleanup: remove redundant doxygen \file argument
[blender.git] / intern / elbeem / intern / simulation_object.h
1 /** \file \ingroup elbeem
2  */
3 /******************************************************************************
4  *
5  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
6  * Copyright 2003-2006 Nils Thuerey
7  *
8  * Basic interface for all simulation modules
9  *
10  *****************************************************************************/
11
12 #ifndef SIMULATION_OBJECT_H
13 #define SIMULATION_OBJECT_H
14
15
16 #define USE_GLUTILITIES
17 #include "ntl_geometryshader.h"
18 #include "parametrizer.h"
19
20 #ifdef WITH_CXX_GUARDEDALLOC
21 #  include "MEM_guardedalloc.h"
22 #endif
23
24 class LbmSolverInterface;
25 class CellIdentifierInterface;
26 class ntlTree;
27 class ntlRenderGlobals;
28 class ntlRenderGlobals;
29 class ParticleTracer;
30 struct elbeemSimulationSettings;
31
32
33 //! type fluid geometry init 
34 //  warning : should match typeslbm.h values!
35 const int cFgiFlagstart = 16;
36 typedef enum {
37         fgiFluid     = (1<<(cFgiFlagstart+0)),
38         fgiNoFluid   = (1<<(cFgiFlagstart+1)),
39         fgiSlipNo    = (1<<(cFgiFlagstart+2)),
40         fgiSlipFree  = (1<<(cFgiFlagstart+3)),
41         fgiNoBnd     = (1<<(cFgiFlagstart+4)),
42         fgiAcc       = (1<<(cFgiFlagstart+5)),
43         fgiNoAcc     = (1<<(cFgiFlagstart+6)),
44
45         fgiBndAll    = (fgiSlipNo | fgiSlipFree)
46 } FgiFlagType;
47
48
49 /*! interface for different simluation models to visualize */
50 class SimulationObject :
51         public ntlGeometryShader {
52
53         public:
54
55                 /*! Constructor */
56                 SimulationObject();
57                 /*! Destructor */
58                 virtual ~SimulationObject();
59                 /*! for init from API */
60                 void copyElbeemSettings(elbeemSimulationSettings *settings);
61
62
63                 /*! init tree for certain geometry init */
64                 void initGeoTree();
65                 /*! destroy tree etc. when geometry init done */
66                 void freeGeoTree();
67                 /*! get fluid init type at certain position */
68                 int geoInitGetPointType(ntlVec3Gfx org, int &OId);
69                 /*! check for a certain flag type at position org */
70                 bool geoInitCheckPointInside(ntlVec3Gfx org, int flags, int &OId);
71
72                 // access functions
73
74                 /*! get current (max) simulation time */
75                 double getCurrentTime( void ) { return mTime; }
76                 /*! set geometry generation start point */
77                 virtual void setGeoStart(ntlVec3Gfx set) { mGeoStart = set; }
78                 /*! set geometry generation end point */
79                 virtual void setGeoEnd(ntlVec3Gfx set) { mGeoEnd = set; }
80
81                 /*! set sim panic flag */
82                 void setPanic(bool set) { mPanic = set; }
83                 /*! get sim panic flag */
84                 bool getPanic( void ) { return mPanic; }
85
86                 /*! simluation interface: initialize simulation */
87                 int initializeLbmSimulation(ntlRenderGlobals *glob);
88
89                 /*! set current frame */
90                 void setFrameNum(int num);
91
92                 /*! Do geo etc. init */
93                 virtual int postGeoConstrInit(ntlRenderGlobals *glob) { return initializeLbmSimulation(glob); };
94                 virtual int initializeShader() { /* ... */ return true; };
95                 /*! notify object that dump is in progress (e.g. for field dump) */
96                 virtual void notifyShaderOfDump(int dumptype, int frameNr,char *frameNrStr,string outfilename);
97                 /*! simluation interface: draw the simulation with OpenGL */
98                 virtual void draw( void ) {};
99                 virtual vector<ntlGeometryObject *>::iterator getObjectsBegin();
100                 virtual vector<ntlGeometryObject *>::iterator getObjectsEnd();
101
102
103                 /*! simluation interface: advance simulation another step (whatever delta time that might be) */
104                 virtual void step( void );
105                 /*! prepare visualization of simulation for e.g. raytracing */
106                 virtual void prepareVisualization( void );
107
108                 /*! GUI - display debug info */
109                 virtual void drawDebugDisplay();
110                 /*! GUI - display interactive info  */
111                 virtual void drawInteractiveDisplay();
112                 /*! GUI - handle mouse movement for selection  */
113                 virtual void setMousePos(int x,int y, ntlVec3Gfx org, ntlVec3Gfx dir);
114                 virtual void setMouseClick();
115
116                 /*! get current start simulation time */
117                 double getStartTime( void );
118                 /*! get time for a single animation frame */
119                 double getFrameTime( int frame );
120                 /*! get time for a single time step in the simulation */
121                 double getTimestep( void );
122
123                 //! access solver
124                 LbmSolverInterface *getSolver(){ return mpLbm; }
125
126         protected:
127
128                 /*! current time in the simulation */
129                 double mTime;
130
131                 /*! for display - start and end vectors for geometry */
132                 ntlVec3Gfx mGeoStart, mGeoEnd;
133
134                 /*! geometry init id */
135                 //? int mGeoInitId;
136                 /*! tree object for geomerty initialization */
137                 ntlTree *mpGiTree;
138                 /*! object vector for geo init */
139                 vector<ntlGeometryObject*> *mpGiObjects;
140                 /*! remember globals */
141                 ntlRenderGlobals *mpGlob;
142                 
143                 /*! simulation panic on/off */
144                 bool mPanic;
145
146                 /*! debug info to display */
147                 int mDebugType;
148
149                 /*! pointer to the lbm solver */
150                 LbmSolverInterface *mpLbm;
151
152                 /*! parametrizer for lbm solver */
153                 Parametrizer *mpParam;
154
155                 /*! particle tracing object */
156                 ParticleTracer *mpParts;
157
158                 /*! show parts of the simulation toggles */
159                 bool mShowSurface;
160                 bool mShowParticles;
161
162                 /*! debug display settings */
163                 int mDebDispSetting;
164
165                 /*! pointer to identifier of selected node */
166                 CellIdentifierInterface *mSelectedCid;
167
168                 /*! storage of API settings */
169                 elbeemSimulationSettings *mpElbeemSettings;
170
171         public:
172
173                 // debug display setting funtions
174
175                 /*! set type of info to display */
176                 inline void setDebugDisplay(int disp) { mDebugType = disp; }
177                 inline int getDebugDisplay() { return mDebugType; }
178
179                 /* miscelleanous access functions */
180
181                 /*! init parametrizer for anim step length */
182                 void initParametrizer(Parametrizer *set) { mpParam = set; }
183                 /*! init parametrizer for anim step length */
184                 Parametrizer *getParametrizer() { return mpParam; }
185
186                 /*! check status (e.g. stop/abort) from calling program, returns !=0 if sth. happened... */
187                 // parameters same as elbeem runsimCallback
188                 int checkCallerStatus(int status, int frame);
189
190                 /*! get bounding box of fluid for GUI */
191                 virtual inline ntlVec3Gfx *getBBStart()         { return &mGeoStart; }
192                 virtual inline ntlVec3Gfx *getBBEnd()           { return &mGeoEnd; }
193
194
195 private:
196 #ifdef WITH_CXX_GUARDEDALLOC
197         MEM_CXX_CLASS_ALLOC_FUNCS("ELBEEM:SimulationObject")
198 #endif
199 };
200
201
202 #endif
203
204
205