Eulerian Smoke Simulation on the GPU
include/GasSolver.h
Go to the documentation of this file.
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__
 All Classes Files Functions Variables