#pragma once #include "ZLMath.h" #include "Renderer.h" #include "TextureManager.h" #include #include namespace ZL { struct SparkParticle { Vector3f position; Vector3f velocity; float scale; float lifeTime; float maxLifeTime; bool active; int emitterIndex; SparkParticle() : position({ 0,0,0 }), velocity({ 0,0,0 }), scale(1.0f), lifeTime(0), maxLifeTime(1000.0f), active(false), emitterIndex(0) { } }; class SparkEmitter { private: std::vector particles; std::vector emissionPoints; std::chrono::steady_clock::time_point lastEmissionTime; float emissionRate; bool isActive; std::vector drawPositions; std::vector drawTexCoords; bool drawDataDirty; VertexRenderStruct sparkQuad; std::shared_ptr texture; int maxParticles; void prepareDrawData(); public: SparkEmitter(); SparkEmitter(const std::vector& positions, float rate = 100.0f); SparkEmitter(const std::vector& positions, std::shared_ptr tex, float rate = 100.0f); void setEmissionPoints(const std::vector& positions); void setTexture(std::shared_ptr tex); void update(float deltaTimeMs); void emit(); void draw(Renderer& renderer, float zoom, int screenWidth, int screenHeight); const std::vector& getParticles() const; size_t getActiveParticleCount() const; private: void initParticle(SparkParticle& particle, int emitterIndex); Vector3f getRandomVelocity(int emitterIndex); }; } // namespace ZL