www.pudn.com > snow.rar > pSystem.h
#ifndef __pSystemH__ #define __pSystemH__ #include "d3dUtility.h" #include "camera.h" #includenamespace psys { struct Particle { D3DXVECTOR3 _position; D3DCOLOR _color; static const DWORD FVF; }; struct Attribute { Attribute() { _lifeTime = 0.0f; _age = 0.0f; _isAlive = true; } D3DXVECTOR3 _position; D3DXVECTOR3 _velocity; D3DXVECTOR3 _acceleration; float _lifeTime; // how long the particle lives for before dying float _age; // current age of the particle D3DXCOLOR _color; // current color of the particle D3DXCOLOR _colorFade; // how the color fades with respect to time bool _isAlive; }; class PSystem { public: PSystem(); virtual ~PSystem(); virtual bool init(IDirect3DDevice9* device, char* texFileName); virtual void reset(); virtual void resetParticle(Attribute* attribute) = 0; virtual void addParticle(); virtual void update(float timeDelta) = 0; virtual void preRender(); virtual void render(); virtual void postRender(); bool isEmpty(); bool isDead(); protected: virtual void removeDeadParticles(); protected: IDirect3DDevice9* _device; D3DXVECTOR3 _origin; d3d::BoundingBox _boundingBox; float _emitRate; // rate new particles are added to system float _size; // size of particles IDirect3DTexture9 * _tex; IDirect3DVertexBuffer9* _vb; std::list
_particles; int _maxParticles; // max allowed particles system can have // // Following three data elements used for rendering the p-system efficiently // DWORD _vbSize; // size of vb DWORD _vbOffset; // offset in vb to lock DWORD _vbBatchSize; // number of vertices to lock starting at _vbOffset }; class Snow : public PSystem { public: Snow(d3d::BoundingBox* boundingBox, int numParticles); void resetParticle(Attribute* attribute); void update(float timeDelta); }; class Firework : public PSystem { public: Firework(D3DXVECTOR3* origin, int numParticles); void resetParticle(Attribute* attribute); void update(float timeDelta); void preRender(); void postRender(); }; class ParticleGun : public PSystem { public: ParticleGun(Camera* camera); void resetParticle(Attribute* attribute); void update(float timeDelta); private: Camera* _camera; }; } #endif