/* ZStandardParticleStorageAllocator.h Author: James Russell Purpose: Standard particle type allocator. Stores particle data as an array of structs containing particle data. Changelog 2011/09/11 - creation (jcrussell) */ #pragma once #ifndef _ZSTANDARDPARTICLESTORAGEALLOCATOR_H #define _ZSTANDARDPARTICLESTORAGEALLOCATOR_H #include //Struct containing our per-particle data struct ZStandardParticle { //Particle mass (sign indicates charge) int Mass; //Particle Energy (when zero or less, dead) int Energy; //Particle Position (offset from emitter transform) ZVector3f Position; //Particle Facing (only matters if not billboarding) ZVector3f Facing; //Particle Velocity ZVector3f Velocity; //Particle Scaling ZVector2f Scale; //Particle Color (per vertex, includes alpha) // 3 --- 2 // | | // 0 --- 1 ZVector4f Color[4]; //Texture data (U, V, texture width and height) ZVector3f TextureData; //Particle Id size_t Id; //Default Constructor ZStandardParticle() : Mass(1), Energy(0), Position(0, 0, 0), Facing(0, 0, 0), Velocity(0, 0, 0), Scale(0, 0), TextureData(0, 0, 0), Id(0) { for (int i = 0; i < 4; ++i) { Color[i].Data[0] = 0; Color[i].Data[1] = 0; Color[i].Data[2] = 0; Color[i].Data[3] = 0; } } }; class ZStandardParticleStorageAllocator : public ZParticleStorageAllocator { protected: //The next inactive particle int NextInactive; //The current particle group size_t CurrentGroup; //The current particle within the current group size_t CurrentParticle; //Array containing particle storage ZArray ParticleData; //Array containing indices for particles that have been activated (must be cleared manually) ZArray NewParticles; public: /* Constructor. */ ZStandardParticleStorageAllocator(); /* Destructor. */ virtual ~ZStandardParticleStorageAllocator(); /* public ZStandardParticleStorageAllocator::ActivateParticle Activates a particle contained in storage and returns the index of the activated particle. This sets the particle id. @param _group - the group number this particle is being activated with @return (int) - index to the activated particle @context (all) */ int ActivateParticle(size_t _group); /* public ZStandardParticleStorageAllocator::DeactivateParticle Deactivates a particle given the index to the particle in storage. @param _index - index to the particle in storage @return (void) @context (all) */ void DeactivateParticle(size_t _index); /* public ZStandardParticleStorageAllocator::GetActiveParticleCount Gets the number of currently active particles. So long as only the methods ActivateParticle and DeactivateParticle have been used, they are guaranteed to be sequential in the ParticleData array and starting at index 0. @return (int) - number of active particles @context (all) */ int GetActiveParticleCount(); /* public ZStandardParticleStorageAllocator::GetParticleData Gets a reference to the array containing particle data. @return (ZArray&) - the particle data array @context (all) */ ZArray& GetParticleData(); /* public ZStandardParticleStorageAllocator::GetNewParticles Gets an array containing indices that correspond to newly activated particles. Should be cleared by the spawn strategy when updated. @return (ZArray&) - list of indices to particles that have been activated @context (all) */ ZArray& GetNewParticles(); //Subclass Override virtual void AllocateParticleStorage( ZParticleEmitter* _emitter, size_t _maxParticles ); //Subclass Override virtual void DeallocateParticleStorage(); //Subclass Override virtual ZString GetParticleFormat(); //Subclass Override virtual void Update(ZParticleEffect *_effect, ZParticleEmitter *_emitter, size_t _dt); }; #endif