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__