📄 particleemitter.h
字号:
#pragma once
#include "BaseHeader.h"
#include "ParticleAffector.h"
#include "ParticleSystem.h"
#include "Particle.h"
//发射器
// 一个渲染池最大具有512个粒子发射池
#define MAX_PARTICLE_POOL_LENGTH 512
// 最大只允许一个Emitter同时存在1024个粒子
#define MAX_EMIT_NUMBER 1024
class CParticleEmitter
{
public:
struct _UV
{
float u;
float v;
};
struct Vert_PDT1{
enum{
fvf = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1,
};
D3DVECTOR pos;
DWORD clr;
_UV tex;
};
public:
CParticleEmitter(LPDIRECT3DDEVICE9 device,CParticleSystem* sys , const string& name , long maxparticle , long emit_ps , float spd , float size , D3DCOLOR clr );
~CParticleEmitter();
void InitEmitIB();
/// 粒子队列
typedef list<CParticle*> ParticleList;
typedef vector<CParticle*> ParticleVector;
public:
/** 后备粒子池 */
ParticleList m_DisableList;
/** Active粒子池 */
ParticleList m_ActiveList;
/** 总粒子池 */
ParticleVector m_ParticlePool;
/** 粒子数据 */
Vert_PDT1 m_PartDatas[MAX_EMIT_NUMBER*4];
LPDIRECT3DVERTEXBUFFER9 m_vb;
LPDIRECT3DINDEXBUFFER9 m_ib;
LPDIRECT3DDEVICE9 m_pDevice;
LPDIRECT3DTEXTURE9 m_pTexture;
char* m_textureName;
public:
/** 父System */
CParticleSystem*m_pParentSystem;
string m_strName;
/** 相对System的位置,实际位置由相对位置和System本身的位置共同算出 */
D3DXVECTOR3 m_vecRelPos;
/** 是否被激活 */
bool m_bActive;
/** 单次发射的延续时间 */
float m_fElapsedTime;
/** 最大容许粒子数,这个值会受 MAX_EMIT_NUMBER 限制 */
long m_un32MaxParticleNum;
/** 发射多少时间后失效,0永恒发射(取值范围) */
float m_fMaxEmitTime;
float m_fMaxEmitTimeMin;
float m_fMaxEmitTimeVar;
/** 失效后多长时间重新启动(取值范围) */
float m_fRepeatDelay;
float m_fRepeatDelayMin;
float m_fRepeatDelayVar;
/// 基本状态
/** 粒子发射速率影响子
* 如无特殊,常时发射
* 如有特殊的发射速率需要,比如间隔发射、随机速率发射等等,可挂接已注册的特殊的速率影响子
*/
/** 每秒钟发射粒子数量 */
long m_un32EmitNumPerSec;
/** 内部变量,粒子发射的累积 */
float m_fEmitAccum;
/** 位置影响子
* 如无特殊,一般是指点影响子
* 如有特殊位置需要,比如Box、Circle、Cylinder、Sphere、Plane、Line、Curve,可挂接已注册的特殊的影响子。
*/
D3DXVECTOR3 m_vecLastPos;
D3DXVECTOR3 m_vecPos;
/** 位置配置是否需要插值 */
bool m_bInterpolation;
D3DXVECTOR3 m_vecInterpolatePos;
/** 速度(取值范围) */
D3DXVECTOR3 m_vecVelocityMin;
D3DXVECTOR3 m_vecVelocityVar;
/// 基本产生项目
/** 大小(取值范围) */
float m_fInitSizeMin;
float m_fInitSizeVar;
/** 最大生命值(取值范围) */
float m_fLifeSpanMin;
float m_fLifeSpanVar;
/** 初始颜色(取值范围) */
union
{
D3DCOLOR m_clrInitClrMin;
struct { UCHAR m_InitBMin , m_InitGMin , m_InitRMin , m_InitAMin; };
};
union
{
D3DCOLOR m_clrInitClrVar;
struct { UCHAR m_InitBVar , m_InitGVar , m_InitRVar , m_InitAVar; };
};
/// 影响子项目
// 对粒子产生时状态进行改变,如前面所列举的位置、方向、大小等等配置子
//
// 对运行时粒子状态进行改变,可能包括下面三种
// 色彩扰动因子
// 无此是线性取值
// 可能的选项有:离散取值或者闪烁
//
// 粒子外力状态的扰动因子
// 无此是无加速度的匀速运动
// 可能的选项有:指向某点的线性外力运动、非线性外力运动
//
// 粒子速度运动状态的扰动因子
// 无此则没有速度变化
// 可能的选项有:雪花(横向随机扰动)、螺旋运动(横向旋转扰动)等
//
/// 实际上,只要是粒子状态,原理上,都可以被影响
/// 注意这里的扰动和Affector(影响器)的作用还不同,这里的扰动只是描述了单一Emitter的行为,既不能影响PS,更不能影响其他Emitter。
/// 影响器描述的则是整个场景中的全局影响,它可以影响处于其影响范围内的所有PS。
typedef vector<CParticleAffector*> AffectorVector;
AffectorVector m_AffectorVector;
public:
string& GetName()
{ return m_strName; }
D3DXVECTOR3& GetAbsPosition()
{ return m_vecPos; }
bool GetActive()
{ return m_bActive; }
void SetPosInterpolation( bool setting )
{ m_bInterpolation = setting; }
bool GetPosInterpolation()
{ return m_bInterpolation; }
const D3DXVECTOR3& GetInterpolatePos()
{ return m_vecInterpolatePos; }
float RangeRandom ( float fLow , float fHigh )
{return ( fHigh - fLow ) * (float(rand()) / float(RAND_MAX)) + fLow;}
public:
virtual void UpdateMatrix();
/** 按设置生成粒子 */
virtual bool Initialize();
/** 生成粒子 */
virtual void Generate( float fElapsed );
virtual void GenerateSize( CParticle* particle );
virtual void GenerateVelocity( CParticle* particle );
virtual void GenerateLife( CParticle* particle );
virtual void GenerateColor( CParticle* particle );
/** 粒子逻辑 */
virtual void Update( float fElapsed );
virtual bool UpdateParticle( float fElapsed , CParticle* particle );
/** 渲染粒子 */
virtual void Render(D3DXVECTOR3 camDir);
virtual void RenderGeometry();
/** 销毁本Emitter */
virtual void Destroy();
public:
//设置粒子系统参数接口
virtual void SetParentSystem( CParticleSystem* sys );
virtual void SetMaxParticleNumber( long num );
virtual void SetEmitRate( long num_ps );
virtual void SetEmitRepeat( float emitmin , float delaymin , float emitvar = 0 , float delayvar = 0 );
virtual void SetRelativePos( const D3DXVECTOR3& rel );
virtual void SetSpeed( const D3DXVECTOR3& spd , const D3DXVECTOR3& var = D3DXVECTOR3(0,0,0) );
virtual void SetSize( float initmin , float initvar = 0 );
virtual void SetLifeSpan( float min , float var = 0 );
virtual void SetColor( const D3DCOLORVALUE& clr , const D3DCOLORVALUE& var = D3DXCOLOR(0,0,0,0) );
virtual void SetColor( D3DCOLOR clr , D3DCOLOR var = 0 );
virtual bool SetTexture(char *texName);
virtual void SetActive( bool setting = true );
virtual void SetPoolSize(unsigned int size);
virtual void SetName(string str);
public:
virtual void AddAffector( CParticleAffector* pAffector );//添加影响器
virtual void DestroyPlugs();
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -