Eulerian Smoke Simulation on the GPU
|
00001 #ifndef __GAS_SOLVER_H__ 00002 #define __GAS_SOLVER_H__ 00003 00004 //----------------------------------------------------------- 00007 //----------------------------------------------------------- 00008 00009 #include <ngl/Vector.h> 00010 #include "ComputeEngine.h" 00011 #include "GLUtil.h" 00012 #include "ImageUnitStack.h" 00013 #include "Obstacle.h" 00014 #include "PingPongVolume.h" 00015 00024 class GasSolver 00025 { 00026 public: 00027 00029 enum DrivingFunction{ NONE, SIN, COS, TAN }; 00030 00036 GasSolver( 00037 int _w, 00038 int _h, 00039 int _d, 00040 ComputeEngine* _compute, 00041 ImageUnitStack* _imageUnitStack 00042 ); 00043 00045 ~GasSolver(); 00046 00048 void init(); 00049 00051 void update(); 00052 00054 void updateObstacleData(); 00055 00057 inline PingPongVolume* getVelocity() const {return m_velocityVol;} 00059 inline PingPongVolume* getPressure() const {return m_pressureVol;} 00061 inline PingPongVolume* getTemperature() const {return m_temperatureVol;} 00063 inline PingPongVolume* getDensity() const {return m_densityVol;} 00064 00066 inline Obstacle* getObstacles() const {return m_obstacles;} 00067 00070 inline void setCellSize( 00071 float _cellSize 00072 ) 00073 { 00074 m_cellSize = _cellSize; 00075 } 00076 00079 inline void setSplatRadius( 00080 float _splatRadius 00081 ) 00082 { 00083 m_splatRadius = _splatRadius; 00084 } 00085 00088 inline void setAmbientTemperature( 00089 float _ambientTemperature 00090 ) 00091 { 00092 m_ambientTemperature = _ambientTemperature; 00093 } 00094 00097 inline void setImpulseTemperature( 00098 float _impulseTemperature 00099 ) 00100 { 00101 m_impulseTemperature = _impulseTemperature; 00102 } 00103 00106 inline void setImpulseDensity( 00107 float _impulseDensity 00108 ) 00109 { 00110 m_impulseDensity = _impulseDensity; 00111 } 00112 00117 inline void setImpulsePosition( 00118 float _posX, 00119 float _posY, 00120 float _posZ 00121 ) 00122 { 00123 m_impulsePosition->set(ngl::Vector(_posX, _posY, _posZ)); 00124 } 00125 00128 inline void setPoissonIterations( 00129 int _numPoissonIterations 00130 ) 00131 { 00132 m_numPoissonIterations = _numPoissonIterations; 00133 } 00134 00137 inline void setTimestep( 00138 float _timestep 00139 ) 00140 { 00141 m_timestep = _timestep; 00142 } 00143 00146 inline void setBuoyancyLift( 00147 float _buoyancyLift 00148 ) 00149 { 00150 m_buoyancyLift = _buoyancyLift; 00151 } 00152 00157 inline void setBuoyancyDirection( 00158 float _dirX, 00159 float _dirY, 00160 float _dirZ 00161 ) 00162 { 00163 m_buoyancyDirection->set(ngl::Vector(_dirX, _dirY, _dirZ)); 00164 } 00165 00168 inline void togglePeriodicNoise( 00169 bool _enablePeriodicNoise 00170 ) 00171 { 00172 m_enablePeriodicNoise = _enablePeriodicNoise; 00173 } 00174 00179 inline void setNoiseVariance( 00180 float _noiseVarianceX, 00181 float _noiseVarianceY, 00182 float _noiseVarianceZ 00183 ) 00184 { 00185 m_noiseVarianceX = _noiseVarianceX; 00186 m_noiseVarianceY = _noiseVarianceY; 00187 m_noiseVarianceZ = _noiseVarianceZ; 00188 } 00189 00194 void setNoiseDrivingFunc( 00195 int _funcIndexX, 00196 int _funcIndexY, 00197 int _funcIndexZ 00198 ); 00199 00202 inline void setGasWeight( 00203 float _gasWeight 00204 ) 00205 { 00206 m_gasWeight = _gasWeight; 00207 } 00208 00211 inline void setTemperatureDissipation( 00212 float _temperatureDissipation 00213 ) 00214 { 00215 m_temperatureDissipation = _temperatureDissipation; 00216 } 00217 00220 inline void setDensityDissipation( 00221 float _densityDissipation 00222 ) 00223 { 00224 m_densityDissipation = _densityDissipation; 00225 } 00226 00229 inline void setVelocityDissipation( 00230 float _velocityDissipation 00231 ) 00232 { 00233 m_velocityDissipation = _velocityDissipation; 00234 } 00235 00236 private: 00238 int m_gridWidth; 00240 int m_gridHeight; 00242 int m_gridDepth; 00243 00245 size_t m_gridBytes; 00246 00248 ComputeEngine* m_compute; 00250 ImageUnitStack* m_imageUnitStack; 00251 00253 float m_cellSize; 00255 float m_splatRadius; 00256 00258 float m_ambientTemperature; 00260 float m_impulseTemperature; 00262 float m_impulseDensity; 00264 int m_numPoissonIterations; 00266 float m_timestep; 00268 float m_buoyancyLift; 00270 float m_gasWeight; 00272 ngl::Vector* m_buoyancyDirection; 00273 00275 bool m_enablePeriodicNoise; 00277 float m_noiseVarianceX; 00279 float m_noiseVarianceY; 00281 float m_noiseVarianceZ; 00282 00284 DrivingFunction m_drivingFunctionX; 00286 DrivingFunction m_drivingFunctionY; 00288 DrivingFunction m_drivingFunctionZ; 00289 00291 float m_gradientScale; 00293 float m_temperatureDissipation; 00295 float m_velocityDissipation; 00297 float m_densityDissipation; 00299 ngl::Vector* m_impulsePosition; 00300 00302 PingPongVolume* m_velocityVol; 00304 PingPongVolume* m_pressureVol; 00306 PingPongVolume* m_temperatureVol; 00308 PingPongVolume* m_densityVol; 00310 Obstacle* m_obstacles; 00311 00312 private: 00319 void advection( 00320 cl_mem _fieldW, 00321 cl_mem _fieldR, 00322 float _dissipation, 00323 size_t* _globalDim, 00324 size_t* _localDim 00325 ); 00326 00330 void buoyancyApplication( 00331 size_t* _globalDim, 00332 size_t* _localDim 00333 ); 00334 00338 void impulseApplication( 00339 size_t* _globalDim, 00340 size_t* _localDim 00341 ); 00342 00346 void pressureProjection( 00347 size_t* _globalDim, 00348 size_t* _localDim 00349 ); 00350 00352 void periodicNoise(); 00353 00355 void attachGLBuffers(); 00356 00358 void detachGLBuffers(); 00359 }; 00360 00361 #endif // __GAS_SOLVER_H__