www.pudn.com > fluid.rar > Substance2D.h, change:2006-10-28,size:2359b
#ifndef __Substance2D_H__
#define __Substance2D_H__
#include "DTKPrerequisite.h"
#include "DTKDeviceListener.h"
#include "DTKColorValue.h"
#include "Fluid.h"
namespace DTK
{
class Substance2D : public DeviceListener
{
public:
struct PointSource
{
PointSource(float r=0.05f, Vector2 pos_rt=Vector2(0.0,0.0), ColorValue s=ColorValue(0,0,0,0))
:m_r(r),m_pos_rt(pos_rt),m_s(s){}
float m_r; //substance source radius, (0,1)
Vector2 m_pos_rt; //substance center (0,1)
ColorValue m_s; //substance amount
};
Substance2D(uint uWidth =64,uint uHeight =64);
~Substance2D();
void reset();
void setUint(Vector2 unit);
void setDissipation(float dis);
void injectSource(const PointSource& src);
void timeStep(IDirect3DTexture9* pVelField,float dt);
IDirect3DTexture9* getSubstance();
void onCreateDevice( IDirect3DDevice9* pd3dDevice,
const D3DSURFACE_DESC* pBackBufferSurfaceDesc = NULL, void* pUserContext=NULL );
void onResetDevice( IDirect3DDevice9* pd3dDevice,
const D3DSURFACE_DESC* pBackBufferSurfaceDesc = NULL, void* pUserContext=NULL );
void onLostDevice( void* pUserContext=NULL );
void onDestroyDevice( void* pUserContext=NULL );
private:
uint m_uWidth;
uint m_uHeight;
uint m_uCurSrc;//used to indicate current active substance buffer
float m_dissipate;
Vector2 m_unit;// 1/( grid step size *velocity field texture size)
PointSource m_src;
bool m_bNeedInject;
IDirect3DDevice9* m_pD3DDevice;
static const int BUFFER_NUM = 2;
IDirect3DTexture9* m_apSubstanceTex[BUFFER_NUM];
IDirect3DSurface9* m_apSubstanceSurf[BUFFER_NUM];
ID3DXEffect* m_pShader;
D3DXHANDLE m_hSrcColor;
D3DXHANDLE m_hSrcPos;
D3DXHANDLE m_hSrcR;
D3DXHANDLE m_hUnit;
D3DXHANDLE m_hDis;
D3DXHANDLE m_hDt;
D3DXHANDLE m_hVelFieldTex;
D3DXHANDLE m_hSubstanceTex;
D3DXHANDLE m_hSTexSize;
D3DXHANDLE m_hSTexelSize;
D3DXHANDLE m_hVTexSize;
D3DXHANDLE m_hVTexelSize;
D3DXHANDLE m_hSubstanceTech;
private:
uint s0(){return m_uCurSrc;}
uint s1(){return (m_uCurSrc+1)%BUFFER_NUM;}
void loop_s0(uint uCurSrc){assert(uCurSrc/BUFFER_NUM==0); m_uCurSrc = uCurSrc;}
void createShader();
};
}
#endif //end ifndef __Substance2D_H__