From 374b1d31b0fa9980d662d45b59551398b3618d3f Mon Sep 17 00:00:00 2001
From: Sebastian Gaida <gaida@ca-digit.com>
Date: Tue, 22 Jun 2021 15:02:55 +0200
Subject: [PATCH] [#69] added gravity points and other forces

---
 .../particle_simulation/shaders/comp1.spv     | Bin 2112 -> 5272 bytes
 .../particle_simulation/shaders/shader1.comp  |  46 ++++++++++++++++--
 projects/particle_simulation/src/main.cpp     |  10 ++--
 3 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/projects/particle_simulation/shaders/comp1.spv b/projects/particle_simulation/shaders/comp1.spv
index c82562d6735289dd7f7ba2dbeb2243817034d47d..386bd33749f3e09b1fa3bf76fff23812fd7f87c1 100644
GIT binary patch
literal 5272
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
RNF3CM{l~z>0OEtv0RUI43Sa;L

literal 2112
zcmZQ(Qf6mhU}WH8;AL=UfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e
z3~UUn3=9k`3=9mpiJ5sI32p`k1_1^(u$UkN1A_wt$OZ^zW?*JuVqjo6#0b*E$>8o2
z?-=A1Uz}QySd>_j8eg1|n37r)pP!VKnp{#0Qo{vO<L>Y8?&BJtTu=~STvC~n8lRJy
zml~gvS(KVwl3A7tQpbU$E;BDVr!)mw0V@Lw*gY^evNA9;a4;}1WTr4MurhEkfZUv(
z6YrjrpOl#6nOBydoLG{XpXceq0Fq~A5Mp3p2uLg{$xO~k1^JPUfekDMVi)8WXMz-i
z*f4QW_~m4#rG{kYqNoS?y(~2+KRL6c5?MVcL<<sAQZn<><Bh;}vNMP<Ffb&QrlqA8
z#b@RrSq`!TBnQ%uECKS97)TJTpOrzHfq@}8Kd-nXF%J}!3?O|VF_4m?)Z&7~^1Oij
zVg|T4$jvFKIVFiuM}y3h1u14=U~p$(0f!MNoMadn7(5stVFHp?1`$YNAag)sJV;_7
ze}lvXki<ZK28n^p1DP+(0CEchg92C$3)uf4qs75|RyZG|2PE#!zzh}xnFG=f^1Bj9
z0_t86UlGa&xfkYln0}ZTvU@>hg4BWB3o_FUoDUcnBpDbOgc+E?X;+Z}l!_U^Y*7Xl
z1~vwWn?Y77Ft9MNGcbTLNL-wOg@F_5FOWMy@?6mT01~%mU||69LE#E=hc?taP}srD
z<AtgRnJ31;%m4~QP#A&C2IVghA7r*1G)=<9V6-d)GXp4WL1|bH8fG9q$StA_5PyKu
z6UZ$fJ}BHk{s;LD6!svyU~U8PB|r{iU|;~b6~vc<x=)UQ1)Sz!_JYg@#VyF6pfClQ
z58{K;6i5stFUP<D4j+&oKzvYqf$RqHLFR*KO{je$3``7KP<uh*`e1Pf2arBco&lK&
zvKz!Vh58G`2blwMryW!b#0P~XC~t$xCK%rp>JJ?THn5vOaSu`h5(i;323ByKgUULP
z)u1r{!N3GA|3H2N#XG1>0nv^OtPG%d<AbIjP<+}#<CdR+fdM3L2Q7m@e3%?4oq@~%
z=?8_4JOcv*D7-*n3{nH~Hz+<p;*JdL4507=rFl@Cf#L<EA6YFZt%Ky78Cb#TMumZa
z0VD=81Eyb<fq?;CKgew$agchDy`b<?V_*Q6nJ|6oNcuo>$o6V5Fff4RcQCL*<BWj;
zBnFDh?+nZgx}X4LU|{&gz`~%-z`&rxzyKBlg(rv&vr`YvPEZ8|b1O&=WGBe2AaPK7
zfax=Y>tkgAr43_fID*0mqz05OOc)p#K;j_(fYOT@l7B$@L25x}gTz5<e=;z^-3W3&
z$Q)3(m_zM?@hzZyn7Nin=7Quv=7Q9M++fAPzyOkm#kV!oogjaK)PUmKhJk?rBo5+(
z?6XBP-yX?)kQ^wTgVch|2c>V2d>;cV1BmYkt&c%wHbTXm7#J8p?f}Wb-0X~GCdhvv
UH-o|gBo0#lmw}PNf`O3%06Wx|(f|Me

diff --git a/projects/particle_simulation/shaders/shader1.comp b/projects/particle_simulation/shaders/shader1.comp
index eea7fe7b..7b58b55f 100644
--- a/projects/particle_simulation/shaders/shader1.comp
+++ b/projects/particle_simulation/shaders/shader1.comp
@@ -1,7 +1,7 @@
 #version 450 core
 #extension GL_ARB_separate_shader_objects : enable
 
-layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+layout(local_size_x = 256) in;
 
 struct Particle
 {
@@ -21,14 +21,54 @@ layout( push_constant ) uniform constants{
     float deltaTime;
 };
 
+vec3 attraction(vec3 pos, vec3 attractPos)
+{
+    vec3 delta = attractPos - pos;
+    const float damp = 0.5;
+    float dDampedDot = dot(delta, delta) + damp;
+    float invDist = 1.0f / sqrt(dDampedDot);
+    float invDistCubed = invDist*invDist*invDist;
+    return delta * invDistCubed * 0.0035;
+}
+
+vec3 repulsion(vec3 pos, vec3 attractPos)
+{
+    vec3 delta = attractPos - pos;
+    float targetDistance = sqrt(dot(delta, delta));
+    return delta * (1.0 / (targetDistance * targetDistance * targetDistance)) * -0.000035;
+}
+
+const int n = 3;
+vec3 gravity = vec3(0,-9.8,0);
+vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0),vec3(0.5, 0.5, 0),vec3(0, -0.5, 0));
+
 void main() {
     uint id = gl_GlobalInvocationID.x;
     inParticle[id].lifeTime -= deltaTime;
+    vec3 pos = inParticle[id].position;
+    vec3 vel = inParticle[id].velocity;
     if(inParticle[id].lifeTime < 0.f)
     {
         inParticle[id].lifeTime = 3.f;
-        inParticle[id].position = respawnPos;
+        pos = vec3(0);
     }
+//    inParticle[id].position += deltaTime * -normalize(max(2 - distance(inParticle[id].position,respawnPos),0.0) * respawnPos - inParticle[id].position);
+
+    for(int i = 0; i < n; i++)
+    {
+        pos += deltaTime * deltaTime * normalize(max(2 - distance(pos,gravityPoint[i]),0.1) * gravityPoint[i] - pos);
+    }
+
+//    vec3 delta = respawnPos - pos;
+//    float targetDistane = sqrt(dot(delta,delta));
+//    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;
+
+    pos += normalize(vel) * deltaTime;
+    inParticle[id].position = pos;
 
-    inParticle[id].position = (inParticle[id].position + deltaTime * inParticle[id].velocity);
+    inParticle[id].velocity = vel;
 }
diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index e4c4bc9a..17104ddf 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -201,8 +201,8 @@ int main(int argc, const char **argv) {
     uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 
     cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -2));
-    cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, 0.0f));
-    cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, -1.0f));
+    cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, -2.0f));
+    cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));
 
     while (window.isWindowOpen()) {
         window.pollEvents();
@@ -218,19 +218,19 @@ int main(int argc, const char **argv) {
         auto end = std::chrono::system_clock::now();
         float deltatime = 0.000001 * static_cast<float>( std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() );
         start = end;
-        particleSystem.updateParticles(deltatime);
+//        particleSystem.updateParticles(deltatime);
 
         cameraManager.update(deltatime);
         std::vector<glm::mat4> mvp;
         mvp.clear();
-        mvp.push_back( cameraManager.getCamera(0).getMVP());
+        mvp.push_back( cameraManager.getCamera(1).getMVP());
 
         auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
 
         glm::vec4 pushData = glm::vec4(particleSystem.getRespawnPos(),deltatime);
 
         vkcv::PushConstantData pushConstantDataCompute( &pushData, sizeof(glm::vec4));
-        uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/64.f)),1,1};
+        uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/256.f)),1,1};
         core.recordComputeDispatchToCmdStream(cmdStream,
                                               computePipeline,
                                               computeDispatchCount,
-- 
GitLab