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