基于Direct3D实现简单的粒子系统

      这是一个基于D3D的基本的粒子系统,能够实现一些基本的效果,如:雨、雪、烟花等。代码很少,只有一个头文件和一个CPP文件,便于研究粒子系统的原理。

EpParticleSystem.h:

#ifndef _EPPARTICLESYSTEM_H_
#define _EPPARTICLESYSTEM_H_

#include
#include

struct EpParticle
{
    D3DXVECTOR3 pos ;
    float psize ;
    D3DCOLORVALUE color ;
    D3DXVECTOR3     velo ;
};

struct stParticleVertex
{
    D3DVECTOR pos ;
    float psize ;
    D3DCOLOR color ;
};

#define D3DFVF_PARTICLE (D3DFVF_XYZ | D3DFVF_PSIZE | D3DFVF_DIFFUSE)

//生成随机数
inline float rangeRand ( float min , float max );
//float->DWORD
inline DWORD FtoDW ( float val ) { return * (( DWORD * ) & val ); }

class EpParticleSystem
{
public :
    EpParticleSystem ( D3DVECTOR position , D3DVECTOR range , D3DVECTOR acceleration ,
        D3DVECTOR emitterPositionMin , D3DVECTOR emitterPositionMax ,
        D3DVECTOR velocityMin , D3DVECTOR velocityMax ,
        D3DCOLORVALUE colorMin , D3DCOLORVALUE colorMax ,
        float psizeMin , float psizeMax ,
        int maxCount , int emitCount , float emitInterval ,
        LPDIRECT3DDEVICE9 device , LPDIRECT3DTEXTURE9 texture );
    virtual ~ EpParticleSystem ();
    bool Initialize ();
    void Update ( float delta );
    bool Render ();

protected :
    void emit ( int emitCount );

protected :
    D3DXVECTOR3 m_Pos ;        //位置
    D3DXVECTOR3 m_Range ;    //范围
    D3DXVECTOR3 m_Accel ;    //加速度
    D3DXVECTOR3 m_EmiPosMin , m_EmiPosMax ;    //发射器位置
    D3DXVECTOR3 m_VeloMin , m_VeloMax ;        //粒子速度
    D3DCOLORVALUE m_ColorMin , m_ColorMax ;    //颜色
    float m_PSizeMin , m_PSizeMax ;            //粒子大小
    int m_Count , m_MaxCount ;        //粒子数量及上限
    int m_EmiCount ; float m_EmiInterval ;            //发射数量,发射间隔时间
    float m_Interval ;            //累计时间

    EpParticle * m_Particles ;        //粒子池

    LPDIRECT3DDEVICE9 m_pDevice ;    //设备对象
    LPDIRECT3DTEXTURE9 m_pTexture ;    //纹理
    LPDIRECT3DVERTEXBUFFER9 m_pVB ;    //顶点缓冲区

    D3DXMATRIX m_WorldMat ;        //世界转换矩阵
};
#endif

EpParticleSystem.cpp:

#include "EpParticleSystem.h"
#include
#include


EpParticleSystem :: EpParticleSystem ( D3DVECTOR position , D3DVECTOR range ,
    D3DVECTOR acceleration , D3DVECTOR emitterPositionMin , D3DVECTOR emitterPositionMax ,
    D3DVECTOR velocityMin , D3DVECTOR velocityMax , D3DCOLORVALUE colorMin ,
    D3DCOLORVALUE colorMax , float psizeMin , float psizeMax ,
    int maxCount , int emitCount , float emitInterval ,
    LPDIRECT3DDEVICE9 device , LPDIRECT3DTEXTURE9 texture )
{
    m_Pos = position ;
    m_Range = range ;
    m_Accel = acceleration ;
    m_EmiPosMin = emitterPositionMin ;
    m_EmiPosMax = emitterPositionMax ;
    m_VeloMin = velocityMin ;
    m_VeloMax = velocityMax ;
    m_ColorMin = colorMin ;
    m_ColorMax = colorMax ;
    m_PSizeMin = psizeMin ;
    m_PSizeMax = psizeMax ;
    m_Count     = 0 ;
    m_MaxCount = maxCount ;
    m_EmiCount = emitCount ;
    m_EmiInterval = emitInterval ;
    m_Interval = 0.0f ;
    m_pDevice = device ;
    m_pTexture = texture ;
    m_Particles = NULL ;
    m_pVB = NULL ;
    //随机数种子
    srand ( ( unsigned ) time ( NULL ) );
    //计算世界矩阵
    D3DXMatrixTranslation ( & m_WorldMat , m_Pos . x , m_Pos . y , m_Pos . z );
}

<

你可能感兴趣的:(DirectX,学习日记,direct3d,null,float,winapi,class,parameters)