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