#pragma once #include #include #include #include "glclasses.hpp" //class VertexAttribute { // std::string nameInShader; // Guint attributeIndex; // Type type; // modifictaion // void *dataSource; //}; namespace endofthejedi { class ParticleBatch { public: ParticleBatch(size_t id, size_t numParticles, float particleRadius, float halfAge); // deallocate opengl stuff on destroy ~ParticleBatch(); size_t numParticles() const { return m_numParticles; } void setParticle(size_t index, const glm::vec3 &p, const glm::vec3 &v, float maxDistance); void setCenter(const glm::vec3 ¢er); void setMaxVelocity(float maxVelocity); void setup(Shader *shader); void bind(); void upload(); void render(Shader *shader); void tick(float dt); float ageNormalized() const { return m_age / (m_maxNumHalfAges*m_halfAge); } float age() const { return m_age; } bool done() const; size_t id() const { return m_id; } const glm::vec3 &explosionCenter() const { return m_center; } private: size_t dataSizeForIndex(size_t index); void *dataSourceForIndex(size_t index); private: // id of explosion size_t m_id; // uniforms for the shader size_t m_numParticles; float m_particleRadius; float m_age; const float m_halfAge; const float m_maxNumHalfAges; float m_maxVelocity; glm::vec3 m_center; // meta data size_t m_num_vertex_buffers; std::vector m_data_vbos; std::vector m_attr_locations; // vertex attributes std::vector m_data_geometry; std::vector m_data_position; std::vector m_data_velocity; std::vector m_data_max_distance; }; }