diff --git a/projects/particle_simulation/shaders/comp1.spv b/projects/particle_simulation/shaders/comp1.spv
index e328ebb349371bff7bebebd787f04a2ffca07f24..ab40b1dac97d20bd5fa078460e8297edfd3e9acc 100644
Binary files a/projects/particle_simulation/shaders/comp1.spv and b/projects/particle_simulation/shaders/comp1.spv differ
diff --git a/projects/particle_simulation/shaders/frag.spv b/projects/particle_simulation/shaders/frag.spv
index a37f971964481b32a05bafc7efcf0c7b4b25671e..43a80b0da3b74e4cb9617da580d9000b0b68eaf6 100644
Binary files a/projects/particle_simulation/shaders/frag.spv and b/projects/particle_simulation/shaders/frag.spv differ
diff --git a/projects/particle_simulation/shaders/shader.frag b/projects/particle_simulation/shaders/shader.frag
index 1c228be035b77c2eeaec55c328b333576fa41810..7acc2c603f2e918307a56dabed7c7a77ff2aa746 100644
--- a/projects/particle_simulation/shaders/shader.frag
+++ b/projects/particle_simulation/shaders/shader.frag
@@ -2,6 +2,7 @@
 #extension GL_ARB_separate_shader_objects : enable
 
 layout(location = 1) in vec3 passVelocity;
+layout(location = 2) in float passlifeTime;
 
 layout(location = 0) out vec4 outColor;
 
@@ -16,7 +17,10 @@ layout(set=0,binding=1) uniform uPosition{
 void main()
 {
 	vec2 mouse = vec2(Position.position.x, Position.position.y);
-		outColor = vec4(1,0,0,0);
-		//outColor = float(distance(gl_FragCoord.xy, mouse) < 100) * vec4(0,0,1,0) +
-		// 		   float(distance(gl_FragCoord.xy, mouse) >= 100) * Color.color;
+		outColor = float(distance(gl_FragCoord.xy, vec2(400,300)) <= 30) * vec4(1,1,1,0) +
+				  float(distance(gl_FragCoord.xy, vec2(400,300)) > 30) *
+				   (float(passlifeTime < 1) * vec4(1,1,0,0) +
+				   float(passlifeTime < 2 && passlifeTime > 1) * vec4(1,passlifeTime * 0.5,0,0) +
+				   float(passlifeTime >= 2 && passlifeTime < 2.5f) * vec4(passlifeTime * 0.5,passlifeTime * 0.5,0,0) +
+				   float(passlifeTime >= 2.5f) * vec4(1,0,0,0));
 }
\ No newline at end of file
diff --git a/projects/particle_simulation/shaders/shader.vert b/projects/particle_simulation/shaders/shader.vert
index d68f087f90f6dd56589b71060a102bf42c2b9c2a..16c860df72a8c9ae5cb73b15440d358b81d8679b 100644
--- a/projects/particle_simulation/shaders/shader.vert
+++ b/projects/particle_simulation/shaders/shader.vert
@@ -9,6 +9,8 @@ struct Particle
     float lifeTime;
     vec3 velocity;
     float padding_2;
+    vec3 reset_velocity;
+    float padding_3;
 };
 
 layout(std430, binding = 2) coherent buffer buffer_inParticle
@@ -21,11 +23,13 @@ layout( push_constant ) uniform constants{
 };
 
 layout(location = 1) out vec3 passVelocity;
+layout(location = 2) out float passlifeTime;
 
 void main()
 {
     int id = gl_InstanceIndex;
     passVelocity = inParticle[id].velocity;
+    passlifeTime = inParticle[id].lifeTime;
     vec3 moved_particle = particle + inParticle[id].position;
 	gl_Position =   mvp * vec4(moved_particle, 1.0);
 }
\ No newline at end of file
diff --git a/projects/particle_simulation/shaders/shader1.comp b/projects/particle_simulation/shaders/shader1.comp
index 38abe941ec42bd6f20bb704763cc38a650cfc814..7ce0b5c39ba93dbdc1fe80991b1bef4fbd6fd1a8 100644
--- a/projects/particle_simulation/shaders/shader1.comp
+++ b/projects/particle_simulation/shaders/shader1.comp
@@ -17,8 +17,8 @@ layout(std430, binding = 0) coherent buffer buffer_inParticle
 };
 
 layout( push_constant ) uniform constants{
-    vec3 respawnPos;
     float deltaTime;
+    float rand;
 };
 
 vec3 attraction(vec3 pos, vec3 attractPos)
@@ -64,8 +64,9 @@ void main() {
 //    vel += repulsion(pos, respawnPos) * 0.05;
 
 
-    if((pos.x < -1.0) || (pos.x > 1.0) || (pos.y < -1.0) || (pos.y > 1.0)|| (pos.z < -1.0) || (pos.z > 1.0))
-        vel = (-vel * 0.1) + attraction(pos, respawnPos) * 12;
+    //if((pos.x < -1.0) || (pos.x > 1.0) || (pos.y < -1.0) || (pos.y > 1.0)|| (pos.z < -1.0) || (pos.z > 1.0))
+    if((pos.x < -1.0) || (pos.x > 1.0))
+        vel = (-vel * 0.1);
 
     pos += normalize(vel) * deltaTime;
     inParticle[id].position = pos;
diff --git a/projects/particle_simulation/shaders/vert.spv b/projects/particle_simulation/shaders/vert.spv
index bdfc6c77e59f2b2a73ea0c4ec9a44086a438d15e..2487c41569e344770c3a15c5266099a2cb234de6 100644
Binary files a/projects/particle_simulation/shaders/vert.spv and b/projects/particle_simulation/shaders/vert.spv differ
diff --git a/projects/particle_simulation/src/Particle.cpp b/projects/particle_simulation/src/Particle.cpp
index 3a051c5be15e90a9bb428c55940b406cf6c28cc1..387728eb366430e4373282da785bbff47de17e7a 100644
--- a/projects/particle_simulation/src/Particle.cpp
+++ b/projects/particle_simulation/src/Particle.cpp
@@ -4,7 +4,8 @@
 Particle::Particle(glm::vec3 position, glm::vec3 velocity, float lifeTime)
 : m_position(position),
 m_velocity(velocity),
-m_lifeTime(lifeTime)
+m_lifeTime(lifeTime),
+m_reset_velocity(velocity)
 {}
 
 const glm::vec3& Particle::getPosition()const{
diff --git a/projects/particle_simulation/src/Particle.hpp b/projects/particle_simulation/src/Particle.hpp
index 721d9bf8eff6d703c481a01ce5a2b0747800ce87..268e4bcf5bba34720e66a5424bd817499ba294a6 100644
--- a/projects/particle_simulation/src/Particle.hpp
+++ b/projects/particle_simulation/src/Particle.hpp
@@ -29,4 +29,6 @@ private:
     float m_lifeTime;
     glm::vec3 m_velocity;
     float padding_2 = 0.f;
+    glm::vec3 m_reset_velocity;
+    float padding_3 = 0.f;
 };
diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index a0dc40127808a9e98d8537f31db9ce3f4d501fc8..7e4a6f2273551aebc1f87ad72ce2954a680366b1 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -6,6 +6,7 @@
 #include "ParticleSystem.hpp"
 #include <random>
 #include <glm/gtc/matrix_access.hpp>
+#include <time.h>
 
 int main(int argc, const char **argv) {
     const char *applicationName = "Particlesystem";
@@ -120,10 +121,10 @@ int main(int argc, const char **argv) {
             1
     );
 
-    glm::vec3 minVelocity = glm::vec3(-0.1f,-0.1f,0.f);
-    glm::vec3 maxVelocity = glm::vec3(0.1f,0.1f,0.f);
+    glm::vec3 minVelocity = glm::vec3(-0.1f,-0.1f,-0.1f);
+    glm::vec3 maxVelocity = glm::vec3(0.1f,0.1f,0.1f);
     glm::vec2 lifeTime = glm::vec2(-1.f,8.f);
-    ParticleSystem particleSystem = ParticleSystem( 10000 , minVelocity, maxVelocity, lifeTime);
+    ParticleSystem particleSystem = ParticleSystem( 100000 , minVelocity, maxVelocity, lifeTime);
 
     vkcv::Buffer<Particle> particleBuffer = core.createBuffer<Particle>(
             vkcv::BufferType::STORAGE,
@@ -181,7 +182,7 @@ int main(int argc, const char **argv) {
         //std::cout << "Front: " << cameraManager.getCamera().getFront().x << ", " << cameraManager.getCamera().getFront().z << ", " << cameraManager.getCamera().getFront().z << std::endl;
         glm::mat4 viewmat = cameraManager.getCamera(0).getView();
         spawnPosition = glm::vec3(pos.x, pos.y, 0.f);
-        tempPosition = viewmat * glm::vec4(spawnPosition, 1.0f);
+        tempPosition = glm::vec4(spawnPosition, 1.0f);
         spawnPosition = glm::vec3(tempPosition.x, tempPosition.y, tempPosition.z);
         particleSystem.setRespawnPos(glm::vec3(-spawnPosition.x, spawnPosition.y, spawnPosition.z));
 //        std::cout << "respawn pos: " << spawnPosition.x << ", " << spawnPosition.y << ", " << spawnPosition.z << std::endl;
@@ -201,6 +202,7 @@ int main(int argc, const char **argv) {
     cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, -2.0f));
     cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));
 
+    srand((unsigned)time(NULL));
     while (window.isWindowOpen()) {
         window.pollEvents();
 
@@ -223,10 +225,11 @@ int main(int argc, const char **argv) {
         mvp.push_back( cameraManager.getCamera(1).getMVP());
 
         auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
+        float random = static_cast<float> (rand()) / (static_cast<float> (RAND_MAX/2.5f));
+        std::cout << random << std::endl;
+        glm::vec2 pushData = glm::vec2(deltatime, random);
 
-        glm::vec4 pushData = glm::vec4(particleSystem.getRespawnPos(),deltatime);
-
-        vkcv::PushConstantData pushConstantDataCompute( &pushData, sizeof(glm::vec4));
+        vkcv::PushConstantData pushConstantDataCompute( &pushData, sizeof(glm::vec2));
         uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/256.f)),1,1};
         core.recordComputeDispatchToCmdStream(cmdStream,
                                               computePipeline,