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,