// NatureParticle.h: interface for the CNatureParticle class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_NATUREPARTICLE_H__C5B07131_294F_4F5B_8093_CA560472DB64__INCLUDED_) #define AFX_NATUREPARTICLE_H__C5B07131_294F_4F5B_8093_CA560472DB64__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include #include "Texture.h" #define PI 3.1415926535897932384626433832795f #define PIOVER180 0.0174532925199432957692369076848861f #define PIUNDER180 57.2957795130823208767981548141052f //#define EPSILON 1.0e-8 #define SMALL 1.0e-4f #define BIG 1.0e+10f #define RANDOM_FLOAT ( ( ( float )rand( ) )/RAND_MAX ) #define DEG_TO_RAD( angle ) ( ( angle )*PIOVER180 ) #define RAD_TO_DEG( radians ) ( ( radians )*PIUNDER180 ) class CNatureParticle { public: class CParticleNode { public: float m_fLife; D3DXVECTOR3 m_vecPos; D3DXVECTOR3 m_vecBeforePos; D3DXVECTOR3 m_vecVelocity; D3DXVECTOR3 m_vecSize; D3DXVECTOR3 m_vecSizeUnit; float m_fMass; D3DXVECTOR3 m_vecColor; D3DXVECTOR3 m_vecColorUnit; float m_fVisible; float m_fVisibleUnit; float m_fFraction; float m_fExtension[3]; CParticleNode() { m_fLife = -1.0f; m_vecPos = D3DXVECTOR3(0.0f,0.0f,0.0f); m_vecBeforePos = D3DXVECTOR3(0.0f,0.0f,0.0f); m_vecVelocity = D3DXVECTOR3(0.0f,0.0f,0.0f); m_vecSize = D3DXVECTOR3(0.0f,0.0f,0.0f); m_vecSizeUnit = D3DXVECTOR3(0.0f,0.0f,0.0f); m_vecColor = D3DXVECTOR3(1.0f,1.0f,1.0f); m_vecColorUnit = D3DXVECTOR3(0.0f,0.0f,0.0f); m_fVisible = 0.0f; m_fVisibleUnit =0.0f; m_fExtension[0] = m_fExtension[1] = m_fExtension[2] = 0.0f; } ~CParticleNode(){} }; CNatureParticle(); virtual ~CNatureParticle(); inline float RangedRandom( float f1, float f2 ) { return ( f1+( f2-f1 )*((float)rand()/(float)RAND_MAX) ); } void CreateInUseNode(float fVelocityX,float fVelocityY,float fVelocityZ,int RandValue = 0); bool InitParticle(int iNodesNum,char *strTexture); void Release(); void Update(float fStep = 1.0f,float fHeight = 0.0f); void Explode(float fMag,int iNodesNums); void CreateRain(float fMinRangeX,float fMinRangeY,float fMinRangeZ, float fMaxRangeX,float fMaxRangeY,float fMaxRangeZ, int iDropSpeed,int iNumDrops); void CreateChristmasParticle(float fX,float fY,float fZ,int iDropSpeed,int iNumDrops, float fRightX,float fRightY,float fRightZ,float fUpX,float fUpY,float fUpZ,bool bForce = false); void SetMaxLife(float fLife) { m_fMaxLife = fLife;} void SetBasePosition(float fX,float fY,float fZ) { m_vecPos = D3DXVECTOR3(fX,fY,fZ);} void SetBaseMass(float fMass) { m_fMass = fMass;} void SetSize(float fStartWidth,float fStartHeight, float fEndWidth,float fEndHeight) { m_vecStartSize = D3DXVECTOR3(fStartWidth,0.0f,fStartHeight); m_vecEndSize = D3DXVECTOR3(fEndWidth,0.0f,fEndHeight); } void SetColor(float fStartColorR,float fStartColorG,float fStartColorB, float fEndColorR,float fEndColorG,float fEndColorB) { m_vecStartColor = D3DXVECTOR3(fStartColorR,fStartColorG,fStartColorB); m_vecEndColor = D3DXVECTOR3(fEndColorR,fEndColorG,fEndColorB); } void SetFraction(float fFraction) { m_fFraction = fFraction;} void SetVisible(float fStartVisible,float fEndVisible) { m_fStartVisible = fStartVisible; m_fEndVisible = fEndVisible; } void SetGravity(float fX,float fY,float fZ) { m_vecGravity = D3DXVECTOR3(fX,fY,fZ);} int GetScreenNodesNum() { return m_iScreenNodesNum;} virtual void Init(int iNodesNum,char *strTexture) = 0; virtual void UpdateBuffer(float fStep = 1.0f) = 0; virtual void Render() = 0; void SetParticlePosition(BYTE *pImage,DWORD dwWidth,DWORD dwHeight); void SetExtUse(bool bFlag) { m_bExtUse = bFlag; m_bExtUse2 = bFlag;} void SetEnd(bool bFlag) { m_bEnd = bFlag;} bool GetEnd() { return m_bEnd;} int m_iImageParticleNum; bool m_bStart; bool m_bFirst; int m_iExtCount; protected: CParticleNode *m_pNodes; int m_iNodesNum; int m_iScreenNodesNum; D3DXVECTOR3 m_vecGravity; CTexture *m_pParticleTexture; CTexture *m_pExtTexture; float m_fMaxLife; D3DXVECTOR3 m_vecPos; D3DXVECTOR3 m_vecStartSize; D3DXVECTOR3 m_vecEndSize; float m_fMass; D3DXVECTOR3 m_vecStartColor; D3DXVECTOR3 m_vecEndColor; float m_fFraction; float m_fStartVisible; float m_fEndVisible; LPDIRECT3DDEVICE8 m_pDevice; int m_iVertexBufferNum; int m_iIndexBufferNum; bool m_bExtUse; bool m_bExtUse2; bool m_bEnd; /* LPDIRECT3DVERTEXBUFFER8 m_pVertexBuffer; LPDIRECT3DINDEXBUFFER8 m_pIndexBuffer; */ }; #endif // !defined(AFX_NATUREPARTICLE_H__C5B07131_294F_4F5B_8093_CA560472DB64__INCLUDED_)