nuclear@0: #ifndef _PARTICLES_H_ nuclear@0: #define _PARTICLES_H_ nuclear@0: nuclear@0: #include nuclear@0: #include "n3dmath.h" nuclear@0: #include "3dgeom.h" nuclear@0: #include "objects.h" nuclear@0: nuclear@0: enum BlendingFactor; nuclear@0: nuclear@0: class Particle { nuclear@0: public: nuclear@0: Vector3 pos; nuclear@0: Vector3 vel; nuclear@0: unsigned int life; nuclear@0: nuclear@0: Particle(int life=0); nuclear@0: Particle(const Vector3 &pos, int life=0); nuclear@0: Particle(const Vector3 &pos, const Vector3 &vel, int life=0); nuclear@0: nuclear@0: void Update(const Vector3 &forces, float friction=0); nuclear@0: }; nuclear@0: nuclear@0: class ParticleSystem { nuclear@0: private: nuclear@0: GraphicsContext *gc; nuclear@0: bool FixedUpdateRate; nuclear@0: float UpdateRate; nuclear@0: float LastUpdate; nuclear@0: nuclear@0: BlendingFactor SourceBlend, DestBlend; nuclear@0: nuclear@0: Vector3 pos, prevpos; // position of the emmiter (world space) nuclear@0: Vector3 ShootDirection; // an initial velocity vector for the particles nuclear@0: std::list particles; // a list of particles nuclear@0: Vertex pquad[4]; // the basic particle quad vertices nuclear@0: Triangle ptris[2]; // the basic particle quad triangles nuclear@0: float size; // size of the particles nuclear@0: float friction; // friction impeding particle movement nuclear@0: int SpawnRate; // rate of particle generation nuclear@0: float SpawnRadius; // spawning radius around the emmiter nuclear@0: float GravForce; // Gravitual force nuclear@0: float DispRads; nuclear@0: int life; // particle life nuclear@0: bool EmmiterAffectsParticleTrajectory; // ehm ... yeah nuclear@0: float SpawnDiffDispersion; nuclear@0: int SpawnRateChange; // if 0 then spawn rate constant nuclear@0: nuclear@0: float StartRed, StartGreen, StartBlue; nuclear@0: float EndRed, EndGreen, EndBlue; nuclear@0: nuclear@0: int VertsToRender, TrianglesToRender; nuclear@0: int vbsize, ibsize, maxprimitives; nuclear@0: Texture *texture; // the particles' texture nuclear@0: Object *obj; // the particles' mesh object (if present don't render quads) nuclear@0: Vertex *varray; // secondary vertex array (ease of development) nuclear@0: Triangle *tarray; // the triangles nuclear@0: nuclear@0: int VertexCount, IndexCount, TriCount, ParticleCount; nuclear@0: nuclear@0: public: nuclear@0: Matrix4x4 Translation, OrbitRot; nuclear@0: nuclear@0: ParticleSystem(GraphicsContext *gc); nuclear@0: ~ParticleSystem(); nuclear@0: nuclear@0: void SetGraphicsContext(GraphicsContext *gc); nuclear@0: void SetParticleSize(float psize); nuclear@0: void SetParticleLife(int life); nuclear@0: void SetFriction(float friction); nuclear@0: void SetSpawnRate(float spawnrate); nuclear@0: void SetSpawnRadius(float radius); nuclear@0: void SetTexture(Texture *texture); nuclear@0: void SetObject(Object *obj); nuclear@0: void SetPosition(const Vector3 &pos); nuclear@0: void SetShootDirection(const Vector3 &dir); nuclear@0: void SetGravitualForce(float grav); nuclear@0: void SetEmmiterDependence(bool dep); nuclear@0: void SetMaxDispersionAngle(float maxdisp); nuclear@0: void SetInitialColor(float r, float g, float b); nuclear@0: void SetDeathColor(float r, float g, float b); nuclear@0: void SetBlendingMode(BlendingFactor src, BlendingFactor dest); nuclear@0: void SetSpawningDifferenceDispersion(float val); nuclear@0: void SetSpawnRateChange(int change); nuclear@0: nuclear@0: void Translate(float x, float y, float z); nuclear@0: void Rotate(float x, float y, float z); nuclear@0: void Rotate(const Vector3 &axis, float angle); nuclear@0: void ResetTranslation(); nuclear@0: void ResetRotation(); nuclear@0: nuclear@0: int CountParticles(); nuclear@0: nuclear@0: void Update(float t = 0.0f); nuclear@0: void Render(); nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: #endif // _PARTICLES_H_