From 40f10345a1a7d249b7300318afdad82ba5bab040 Mon Sep 17 00:00:00 2001 From: Sebastian Gaida <gaida@ca-digit.com> Date: Tue, 15 Jun 2021 13:18:39 +0200 Subject: [PATCH] [#69] change particleSystem for minimal input --- .../src/ParticleSystem.cpp | 35 +++++++++++++++---- .../src/ParticleSystem.hpp | 18 ++++++---- projects/particle_simulation/src/main.cpp | 19 +++------- 3 files changed, 44 insertions(+), 28 deletions(-) diff --git a/projects/particle_simulation/src/ParticleSystem.cpp b/projects/particle_simulation/src/ParticleSystem.cpp index 8b63207e..daf9a16d 100644 --- a/projects/particle_simulation/src/ParticleSystem.cpp +++ b/projects/particle_simulation/src/ParticleSystem.cpp @@ -1,7 +1,16 @@ #include "ParticleSystem.hpp" -ParticleSystem::ParticleSystem(){ - m_rdmVel = std::uniform_real_distribution<float> (-0.1f,0.1f); +ParticleSystem::ParticleSystem(uint32_t particleCount ,glm::vec3 minVelocity , glm::vec3 maxVelocity , glm::vec2 lifeTime ) +{ + m_rdmVel.resize(3); + m_rdmVel[0] = std::uniform_real_distribution<float>(minVelocity.x, maxVelocity.x); + m_rdmVel[1] = std::uniform_real_distribution<float>(minVelocity.y, maxVelocity.y); + m_rdmVel[2] = std::uniform_real_distribution<float>(minVelocity.z, maxVelocity.z); + m_rdmLifeTime = std::uniform_real_distribution<float>(lifeTime.x, lifeTime.y); + + for(uint32_t i = 0; i < particleCount ;i++ ){ + addParticle(Particle(m_respawnPos, getRandomVelocity(), getRandomLifeTime())); + } } const std::vector<Particle>& ParticleSystem::getParticles() const{ @@ -19,15 +28,29 @@ void ParticleSystem::updateParticles( const float deltaTime ){ for(Particle& particle :m_particles){ bool alive = particle.isAlive(); particle.setPosition( particle.getPosition() * static_cast<float>(alive) + static_cast<float>(!alive) * m_respawnPos ); - particle.setVelocity( particle.getVelocity() * static_cast<float>(alive) + static_cast<float>(!alive) * glm::vec3(m_rdmVel(m_rdmEngine), m_rdmVel(m_rdmEngine),0.0f)); - particle.setLifeTime( (particle.getLifeTime() * alive + !alive * m_maxLifeTime ) - deltaTime ); + particle.setVelocity( particle.getVelocity() * static_cast<float>(alive) + static_cast<float>(!alive) * getRandomVelocity()); + particle.setLifeTime( (particle.getLifeTime() * alive + !alive * getRandomLifeTime() ) - deltaTime ); particle.update(deltaTime); } } +glm::vec3 ParticleSystem::getRandomVelocity(){ + return glm::vec3(m_rdmVel[0](m_rdmEngine), m_rdmVel[1](m_rdmEngine),m_rdmVel[2](m_rdmEngine)); +} + +float ParticleSystem::getRandomLifeTime(){ + return m_rdmLifeTime(m_rdmEngine); +} + void ParticleSystem::setRespawnPos( const glm::vec3 respawnPos){ m_respawnPos = respawnPos; } -void ParticleSystem::setMaxLifeTime( const float respawnTime ){ - m_maxLifeTime = respawnTime; +void ParticleSystem::setRdmLifeTime( const glm::vec2 lifeTime ){ + m_rdmLifeTime = std::uniform_real_distribution<float> (lifeTime.x,lifeTime.y); +} + +void ParticleSystem::setRdmVelocity( glm::vec3 minVelocity, glm::vec3 maxVelocity ){ + m_rdmVel[0] = std::uniform_real_distribution<float> (minVelocity.x,maxVelocity.x); + m_rdmVel[1] = std::uniform_real_distribution<float> (minVelocity.y,maxVelocity.y); + m_rdmVel[2] = std::uniform_real_distribution<float> (minVelocity.z,maxVelocity.z); } diff --git a/projects/particle_simulation/src/ParticleSystem.hpp b/projects/particle_simulation/src/ParticleSystem.hpp index 4eb83ebb..cec4df93 100644 --- a/projects/particle_simulation/src/ParticleSystem.hpp +++ b/projects/particle_simulation/src/ParticleSystem.hpp @@ -7,19 +7,23 @@ class ParticleSystem { public: - ParticleSystem(); + ParticleSystem(uint32_t particleCount , glm::vec3 minVelocity = glm::vec3(0.f,0.f,0.f), glm::vec3 maxVelocity = glm::vec3(1.f,1.f,0.f), glm::vec2 lifeTime = glm::vec2(2.f,3.f)); const std::vector<Particle> &getParticles() const; - void addParticle( const Particle particle ); - void addParticles( const std::vector<Particle> particles ); void updateParticles( const float deltaTime ); void setRespawnPos( const glm::vec3 respawnPos ); - void setMaxLifeTime( const float respawnTime ); - + void setRdmLifeTime( const glm::vec2 lifeTime ); + void setRdmVelocity( glm::vec3 minVelocity, glm::vec3 maxVelocity ); private: + + void addParticle( const Particle particle ); + void addParticles( const std::vector<Particle> particles ); + glm::vec3 getRandomVelocity(); + float getRandomLifeTime(); + std::vector<Particle> m_particles; glm::vec3 m_respawnPos = glm::vec3(0.f); - float m_maxLifeTime = 1.f; - std::uniform_real_distribution<float> m_rdmVel; + std::vector<std::uniform_real_distribution<float>> m_rdmVel; + std::uniform_real_distribution<float> m_rdmLifeTime; std::default_random_engine m_rdmEngine; }; \ No newline at end of file diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp index 7e929d84..0315d45e 100644 --- a/projects/particle_simulation/src/main.cpp +++ b/projects/particle_simulation/src/main.cpp @@ -126,21 +126,10 @@ int main(int argc, const char** argv) { pos = glm::vec2(static_cast<float>(offsetX), static_cast<float>(offsetY)); }); - std::uniform_real_distribution<float> rdmVel(-0.1f,0.1f); - std::default_random_engine rdmEngine; - - ParticleSystem particleSystem; - particleSystem.setMaxLifeTime(3.f); - glm::vec3 vel0 = glm::vec3(rdmVel(rdmEngine) , rdmVel(rdmEngine), 0.0f); - glm::vec3 vel1 = glm::vec3(rdmVel(rdmEngine) , rdmVel(rdmEngine), 0.0f); - glm::vec3 vel2 = glm::vec3(rdmVel(rdmEngine) , rdmVel(rdmEngine), 0.0f); - particleSystem.addParticles({ - Particle(glm::vec3(0.f, 1.f, 0.0f), vel0, 1.f), - Particle(glm::vec3( 0.2f, 0.1f, 0.0f), vel1, 1.5f), - Particle(glm::vec3(0.15f, 0.f, 0.0f), vel2, 2.f), - Particle(glm::vec3(-0.15f, 0.1f, 0.0f), vel2, 2.5f), - Particle(glm::vec3(0.25f, 0.f, 0.0f), vel2, 3.f), - Particle(glm::vec3(-0.15f, 0.2f, 0.0f), vel2, 3.5f)}); + glm::vec3 minVelocity = glm::vec3(-0.5f,-0.5f,0.f); + glm::vec3 maxVelocity = glm::vec3(0.5f,0.5f,0.f); + glm::vec2 lifeTime = glm::vec2(0.f,5.f); + ParticleSystem particleSystem = ParticleSystem( 100 , minVelocity, maxVelocity, lifeTime); std::vector<glm::mat4> modelMatrices; std::vector<vkcv::DrawcallInfo> drawcalls; -- GitLab