/* ** Haaf's Game Engine 1.7 ** Copyright (C) 2003-2007, Relish Games ** hge.relishgames.com ** ** hgeParticleSystem helper class header */ #ifndef HGEPARTICLE_H #define HGEPARTICLE_H //#include "hge.h" //#include "hgesprite.h" #include "hgevector.h" #include "hgecolor.h" #include "hgerect.h" #include #include class JQuad; #define MAX_PARTICLES 500 #define MAX_PSYSTEMS 100 struct hgeParticle { hgeVector vecLocation; hgeVector vecVelocity; float fGravity; float fRadialAccel; float fTangentialAccel; float fSpin; float fSpinDelta; float fSize; float fSizeDelta; hgeColor colColor; // + alpha hgeColor colColorDelta; float fAge; float fTerminalAge; }; struct hgeParticleSystemInfo { JQuad* sprite; // texture + blend mode int nEmission; // particles per sec float fLifetime; float fParticleLifeMin; float fParticleLifeMax; float fDirection; float fSpread; bool bRelative; float fSpeedMin; float fSpeedMax; float fGravityMin; float fGravityMax; float fRadialAccelMin; float fRadialAccelMax; float fTangentialAccelMin; float fTangentialAccelMax; float fSizeStart; float fSizeEnd; float fSizeVar; float fSpinStart; float fSpinEnd; float fSpinVar; hgeColor colColorStart; // + alpha hgeColor colColorEnd; float fColorVar; float fAlphaVar; }; class hgeParticleSystem { public: hgeParticleSystemInfo info; hgeParticleSystem(const char *filename, JQuad *sprite); hgeParticleSystem(hgeParticleSystemInfo *psi); hgeParticleSystem(const hgeParticleSystem &ps); ~hgeParticleSystem() { } hgeParticleSystem& operator= (const hgeParticleSystem &ps); void Render(); void FireAt(float x, float y); void Fire(); void Stop(bool bKillParticles=false); void Update(float fDeltaTime); void MoveTo(float x, float y, bool bMoveParticles=false); void Transpose(float x, float y) { fTx=x; fTy=y; } void TrackBoundingBox(bool bTrack) { bUpdateBoundingBox=bTrack; } int GetParticlesAlive() const { return nParticlesAlive; } float GetAge() const { return fAge; } void GetPosition(float *x, float *y) const { *x=vecLocation.x; *y=vecLocation.y; } void GetTransposition(float *x, float *y) const { *x=fTx; *y=fTy; } hgeRect* GetBoundingBox(hgeRect *rect) const { memcpy(rect, &rectBoundingBox, sizeof(hgeRect)); return rect; } private: hgeParticleSystem(); //static HGE *hge; float fAge; float fEmissionResidue; hgeVector vecPrevLocation; hgeVector vecLocation; float fTx, fTy; int nParticlesAlive; hgeRect rectBoundingBox; bool bUpdateBoundingBox; typedef std::list ParticleBuffer; ParticleBuffer mParticleBuffer; float mTimer; }; class hgeParticleManager { public: hgeParticleManager(); ~hgeParticleManager(); void Update(float dt); void Render(); hgeParticleSystem* SpawnPS(hgeParticleSystemInfo *psi, float x, float y); bool IsPSAlive(hgeParticleSystem *ps) const; void Transpose(float x, float y); void GetTransposition(float *dx, float *dy) const {*dx=tX; *dy=tY;} void KillPS(hgeParticleSystem *ps); void KillAll(); private: hgeParticleManager(const hgeParticleManager &); hgeParticleManager& operator= (const hgeParticleManager &); int nPS; float tX; float tY; hgeParticleSystem* psList[MAX_PSYSTEMS]; }; #endif