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