From a17a3cfef8bf3bd7d84740a8cbf944046b6d8e56 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Katharina=20Kr=C3=A4mer?= <kkraemer4@uni-koblenz.de>
Date: Wed, 9 Jun 2021 20:24:31 +0200
Subject: [PATCH] [#69]added vertexbuffer and vertex attribute array

and funny blue circle c:
---
 projects/first_mesh/src/main.cpp              |   4 +-
 projects/particle_simulation/shaders/frag.spv | Bin 832 -> 1540 bytes
 .../particle_simulation/shaders/shader.frag   |   5 +-
 .../particle_simulation/shaders/shader.vert   |  10 +-
 projects/particle_simulation/shaders/vert.spv | Bin 1496 -> 1184 bytes
 projects/particle_simulation/src/main.cpp     | 123 +++++++++++-------
 6 files changed, 86 insertions(+), 56 deletions(-)

diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp
index 599eae46..95c81ba0 100644
--- a/projects/first_mesh/src/main.cpp
+++ b/projects/first_mesh/src/main.cpp
@@ -89,6 +89,7 @@ int main(int argc, const char** argv) {
 	triangleShaderProgram.reflectShader(vkcv::ShaderStage::FRAGMENT);
 	
 	auto& attributes = mesh.vertexGroups[0].vertexBuffer.attributes;
+
 	
 	std::sort(attributes.begin(), attributes.end(), [](const vkcv::VertexAttribute& x, const vkcv::VertexAttribute& y) {
 		return static_cast<uint32_t>(x.type) < static_cast<uint32_t>(y.type);
@@ -108,7 +109,8 @@ int main(int argc, const char** argv) {
 		{ core.getDescriptorSet(descriptorSet).layout },
 		true);
 	vkcv::PipelineHandle trianglePipeline = core.createGraphicsPipeline(trianglePipelineDefinition);
-	
+
+
 	if (!trianglePipeline) {
 		std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl;
 		return EXIT_FAILURE;
diff --git a/projects/particle_simulation/shaders/frag.spv b/projects/particle_simulation/shaders/frag.spv
index 2bda54b389e0b6a615e819f05c1ac07bbd714f86..fdf98514955a63d0e54791970d2f1867ca3c5375 100644
GIT binary patch
literal 1540
zcmZQ(Qf6mhU}WH8;AJppfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e
z4D1Xn3=CkLo0ypgl8|CxV31*8U=Uzn28**ZFfcGPFf%YQFfbfq1gYg@aQBIK404Ju
zPAy0*N-Rl@FV09zNiB-cPs&P7E-417;R2~~_xE@Aag9$dD2OjEsmw`@&&kY7jZeue
zN=+`wEK3Ec<3LiEnU|bXnu4r=m4OB92AJDGd`<=ihTQzp;#39(237`E1}+8$hSGri
z;>?oFe2@p&7}&sKAioqKgu!Zg7#J9kl!C=T{>?8fan8@lF9PXdWncsQKRqYjttc_w
zIX}NB1tQMEpbxSOs*;U?70d_8B||lX+-JzZzyMXk-~n|XNR2XxU|?WyXJ7`q4-}s6
z3@i*FHz~p8AbdpzP^^N~vM_+$Cx;{tiW_bQ1_pix2C(@cH-V&)%?F9W%m=v#*?bTm
zWIjlbFar}fUKPPH%m8MKF)%Z*F)%PFFfcHPGq5m#;vd8ZnWw<O!ob1602Tv@%R&7D
zVuR#B?gFU;#fdco3j>G`@*hY{l!1kT7iumjeQHDbd?1G~Fff4RL4E?+3laj!gZKg<
z4p<)xgCGOMjUe~H<VB!i1#+td0|VIYpfn9~k0dzlGBAL|LGA(ZLE#C?0U&v4s9u;n
zhz|;1nEOEXK*H*TlL!M711KCp_JYJ!pzeb4Rl)oQdmRRLuzl(b3=AMOAPkZN(V*}G
z#SO?lko}+x2?`sK7|4AfJ}7=bVjy`VsDDA~%@|n0@dNT3$SRN@elRdGure?(fb@dm
z1(Y{HapB0o1`aDB1_p5Y0);Us9Bmm`z~Ljzz`y{KgQ*imQU?l8m^v|Vyf82XFtCE-
zT%3V{0i+isZpXmP0J0Ax22u}lqb#)S@MmBLs|Tf9kQfMq+zbj=kXn!%<rx^j`gs`G
z!EOS@J4oJ{fq?;}4<x^XffXF)ptKE=2gSuo22c)XU{GUVU;v53!nTir6&&sw3=9mQ
zum{P5>;kz<6U|*(3=9k)F%U*~mo}Qabf9Sj<Svjtko-QVyL1^C7(nvK?$TpmU;v53
z+~vr?$^eQ-V+IBWP~3vz0_H9g1_lO@ILz&)3=9k)F_0OJQ2&@QFff4p1d;=VIVk;t
O#QricGFUJ$G5`P*lWw{I

delta 425
zcmZqSIl#ut%%sfDz`)4B#lXuTHj&p<n2mvjfdPzj6EpJ|7#J8hCq~XxXJz1IU|`5E
zEpg7z$u9y4vof$Sa4|42ltM+=7+4v&CO0w)NAfT*FhB(vSQ%Iugh8qT@{2P|GV?(u
zvN5oM#XzPMAcVncMHv_vkd!jGGq8YdmIEoCJeSel5ybF-nhIhog9ru&26qN#u&GR7
zHVXsDBqg{Ugs;fJz`!`!mPua`<Vghv76uLm1_ovZ1_pKp1_o;=ALLW!$+b-Wo*)(c
z3=9k)GeIiE8CV#E7#JAXpki`RJ3(R~wIWb)kdHy8f%qVIFin2REN|h+z{&tJO@M)c
l0Tf1j3=9mm3@l)~1sNC^K;m``%wYe5_<tD~87vqW8359{C#e7c

diff --git a/projects/particle_simulation/shaders/shader.frag b/projects/particle_simulation/shaders/shader.frag
index 87ae41a7..540281d9 100644
--- a/projects/particle_simulation/shaders/shader.frag
+++ b/projects/particle_simulation/shaders/shader.frag
@@ -13,5 +13,8 @@ layout(set=0,binding=1) uniform uPosition{
 
 void main()
 {
-	outColor = Color.color;
+	vec2 mouse = vec2(Position.position.x, Position.position.y);
+
+		outColor = float(distance(gl_FragCoord.xy, mouse) < 100) * vec4(0,0,1,0) +
+		 		   float(distance(gl_FragCoord.xy, mouse) >= 100) * Color.color;
 }
\ No newline at end of file
diff --git a/projects/particle_simulation/shaders/shader.vert b/projects/particle_simulation/shaders/shader.vert
index 6c78c446..97376d3d 100644
--- a/projects/particle_simulation/shaders/shader.vert
+++ b/projects/particle_simulation/shaders/shader.vert
@@ -1,17 +1,13 @@
 #version 450 core
 #extension GL_ARB_separate_shader_objects : enable
 
+layout(location = 0) in vec3 position;
+
 layout( push_constant ) uniform constants{
     mat4 mvp;
 };
 
-vec3 positions[3] = {
-vec3(-0.5, 0.5, -1),
-vec3( 0.5, 0.5, -1),
-vec3(0, -0.5, -1)
-};
-
 void main()
 {
-	gl_Position = mvp * vec4(positions[gl_VertexIndex], 1.0);
+	gl_Position = mvp * vec4(position, 1.0);
 }
\ No newline at end of file
diff --git a/projects/particle_simulation/shaders/vert.spv b/projects/particle_simulation/shaders/vert.spv
index 9e89006811ae50bbd74619623632a0d5e4423ddb..1d8d780bcb1a3dff229389902f9d624e83500380 100644
GIT binary patch
literal 1184
zcmZQ(Qf6mhU}WH8;AK!|fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e
z4D4Vw3j+f~ZenI0h{Makz#z%Mz`)GF%)rFJz;K9>fq{jAlfm65-Z982zBsiYu_&=5
zHNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>CH9jXZFEu_TvnVyWB(p3P
zq>ckgU1nZ#PH76V0#*hV24wfJGO#glGcYiu=fnr37KNo2m84dH+{p$N2eCnN`Nf$f
znfZAPYz*vR^`I~Si)ZGQ1ZP&Ig4Ds}K>kY4iFeM)EO5yzE=kNwPKE0Og$_urG$#ix
z$I8IW016k78LSMf41x>{49WR<Ae|tuGq5qRfW<)axn%_mAoao^4g&)NNIfV#3t$dp
zU|{fIU<JDoqy*$Q5DgOpxf>(~qG4hn_kzSgZi9(|*dQ@bSh+JWgUth}^FVS7E7UHK
zdqH-<(g?^5m>4Jp2rw`(fXo1ify{7cU;(EAIglm>1_ogUCU9C%1g8oHFk6g)nSqUg
zfkA<RfkB*s1)P#Ve2{xY8CV!NpmHE1w4r=X22g5cV31*8Vc=q50P6>d$wA{1<Q9+_
zAUP0LU|?b30jEV!dS+m-hVnsi0rEe{9zLi&pzs3O1LE_8EM;I|kYHe80Qn7MF34SS
z49wto0*Qgl7Ghvv0ND@nH^^)d9~5sOF_63nR34-r<VSI+n?ZJi<Rzf~0f~e3gZQAh
zhPegg7iq9t8tg&p6`_6sxyOuw6&#KrcY&0E%>2Q?!~lvjM+Q~~klmu-uxDTZ`NtOO
z7cm9~29P+253*MZnqLDMKsf~zwhRm)F_4)sF<AzP7|2~PF;Lus)PdqVfPozxfAS0v
z{UG%qd63&DGO&W>K=BN+8>9y0K9FCO7#P6$0^~kB24)5jAEfRt10#b410w?fYA#~M

literal 1496
zcmZQ(Qf6mhU}WH8;AJpkfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e
z4D4Vw3j+f~ZenI0h$F?oz@W;&z`)GF%)rFJz;K9>fq{jAlfm65-Z982zBsiYu_&=5
zHNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>CH9jXZFEu_TvnVyWB(p3P
zq>ckgU1nZ#PH76V0#*hV24wfJGO#l6FfcF_<QHd_Waj4;GcYi)GO#g7FfcHr=fnr3
z7KNo2m84dH+|C9S2eCnNP%R8>4D4X_pl|_;XXcdzXI7<x)WPIHeofDbch1QyaLFt#
zNz6-5h3f-_7)Y)(CkHOa%D~J33M-HqAUDb}Ffb(N=Ye#Bf`fsLfrSAi29nP$D_{Vr
zR{(LK?gxc&dQLpV@t%1pARl-zu!7wQQpOD;7#J8}Vj#DJ#6UDm4CH2z7|4AvF%TOh
z1`0!W24=8%Aax!{?qP+R3v-_`l3g${P|6TsU|;~50TKh5;m*JUP8%TewHO!}gc+E?
zX+#m6S{T4=F$QJ^HU<U;kYB|aSimU^#0R-cl!1kT11blyQX9(W1gAF!1{nqx1}+8$
zupW?@0s{*J$S#n6khnFJ4@wUpF_3-`%?mP&fnh(4&j;b#!}$DQe#3qpaEvlAfcyp0
z15yW)gNX|=Fff3`Ko}$r(=P<p&%gjvC(OXW01^Y40a6DN2f0s#0b(}D9FQ82|3w)X
zz~KRk50H5v|BEqzaxKKa;!t^zm>e|y!t{XTKo}GblF%>$rF&2~fcT*F2MbqeXt;vX
z2gn`}Uk2)K2?iDhSq26Mkhvgt$T2X3(<Vp^WVSp50|O|$LGcVS8^j02A4m)&uLzZg
zsaJuzA7lqeJ%|rV&mg-&>eZos0;M64TR?FHN-qoy4fY^;P(cK7Hv@wi11mV)fZPRg
zE=c?b0}}%%joL9VgY!NpTpbx$89?q(g8CEWH(RK`K<O7G4&sB{qy{a+KzcxK(O_Tz
zn*$ODsR6l5lYxN&BpwJZO&A!o85kHqVjwrb#B`uyAb-KcbfIFP{1Cvv4h~a228e!;
xdXPNGuM-(q!E*Wx3=AOmfz*K91M<5e0|U710QmvrM-U&R?k@u)g9QU40{{wWb>RR2

diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index 1d5f4de5..5c48c52f 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -4,25 +4,6 @@
 #include <vkcv/camera/CameraManager.hpp>
 #include <chrono>
 
-uint32_t findMemoryType( vk::PhysicalDeviceMemoryProperties const & memoryProperties,
-                         uint32_t                                   typeBits,
-                         vk::MemoryPropertyFlags                    requirementsMask )
-{
-    uint32_t typeIndex = uint32_t( ~0 );
-    for ( uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++ )
-    {
-        if ( ( typeBits & 1 ) &&
-             ( ( memoryProperties.memoryTypes[i].propertyFlags & requirementsMask ) == requirementsMask ) )
-        {
-            typeIndex = i;
-            break;
-        }
-        typeBits >>= 1;
-    }
-    assert( typeIndex != uint32_t( ~0 ) );
-    return typeIndex;
-}
-
 int main(int argc, const char** argv) {
     const char* applicationName = "Particlesystem";
 
@@ -48,31 +29,10 @@ int main(int argc, const char** argv) {
             { "VK_KHR_swapchain" }
     );
 
-    const auto& context = core.getContext();
-    const vk::Instance& instance = context.getInstance();
-    const vk::PhysicalDevice& physicalDevice = context.getPhysicalDevice();
-    const vk::Device& device = context.getDevice();
-
-    struct vec3 {
-        float x, y, z;
-    };
-
-    const size_t n = 5027;
-
-    auto testBuffer = core.createBuffer<vec3>(vkcv::BufferType::VERTEX, n, vkcv::BufferMemoryType::DEVICE_LOCAL);
-    vec3 vec_data[n];
-
-    for (size_t i = 0; i < n; i++) {
-        vec_data[i] = { 42, static_cast<float>(i), 7 };
-    }
-
-    testBuffer.fill(vec_data);
-
-    auto particleIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, n, vkcv::BufferMemoryType::DEVICE_LOCAL);
+    auto particleIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, 3, vkcv::BufferMemoryType::DEVICE_LOCAL);
     uint16_t indices[3] = { 0, 1, 2 };
     particleIndexBuffer.fill(&indices[0], sizeof(indices));
 
-    std::cout << "Physical device: " << physicalDevice.getProperties().deviceName << std::endl;
 
     // an example attachment for passes that output to the window
     const vkcv::AttachmentDescription present_color_attachment(
@@ -96,6 +56,27 @@ int main(int argc, const char** argv) {
     particleShaderProgram.reflectShader(vkcv::ShaderStage::VERTEX);
     particleShaderProgram.reflectShader(vkcv::ShaderStage::FRAGMENT);
 
+    vkcv::Buffer<glm::vec3> vertexbuffer = core.createBuffer<glm::vec3>(
+            vkcv::BufferType::VERTEX,
+            3
+    );
+
+    const std::vector<glm::vec3> vertices = {glm::vec3(-0.5, 0.5, -1),
+                                             glm::vec3( 0.5, 0.5, -1),
+                                             glm::vec3(0, -0.5, -1)};
+
+    vertexbuffer.fill(vertices);
+
+
+    vkcv::VertexAttribute attrib = vkcv::VertexAttribute{
+            vkcv::PrimitiveType::POSITION,
+            0,
+            sizeof(glm::vec3) * vertices.size(),
+            0,
+            5126,
+            3};
+
+
     std::vector<vkcv::DescriptorBinding> descriptorBindings = {
             vkcv::DescriptorBinding(vkcv::DescriptorType::UNIFORM_BUFFER,   1, vkcv::ShaderStage::FRAGMENT),
             vkcv::DescriptorBinding(vkcv::DescriptorType::UNIFORM_BUFFER,   1, vkcv::ShaderStage::FRAGMENT)};
@@ -106,7 +87,7 @@ int main(int argc, const char** argv) {
             UINT32_MAX,
             UINT32_MAX,
             particlePass,
-            {},
+            {attrib},
             { core.getDescriptorSet(descriptorSet).layout },
             true);
 
@@ -121,6 +102,10 @@ int main(int argc, const char** argv) {
             1
     );
 
+    const std::vector<vkcv::VertexBufferBinding> vertexBufferBindings = {
+            vkcv::VertexBufferBinding(0, vertexbuffer.getVulkanHandle())
+    };
+
     vkcv::DescriptorWrites setWrites;
     setWrites.uniformBufferWrites = {vkcv::UniformBufferDescriptorWrite(0,color.getHandle()),
                                      vkcv::UniformBufferDescriptorWrite(1,position.getHandle())};
@@ -134,7 +119,8 @@ int main(int argc, const char** argv) {
 
     const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
-    const vkcv::Mesh renderMesh({}, particleIndexBuffer.getVulkanHandle(), 3);
+    const vkcv::Mesh renderMesh({vertexBufferBindings}, particleIndexBuffer.getVulkanHandle(), 3);
+    vkcv::DescriptorSetUsage    descriptorUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle);
     vkcv::DrawcallInfo drawcalls(renderMesh, {vkcv::DescriptorSetUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle)});
 
     auto start = std::chrono::system_clock::now();
@@ -147,6 +133,33 @@ int main(int argc, const char** argv) {
         pos = glm::vec2(static_cast<float>(offsetX), static_cast<float>(offsetY));
     });
 
+
+    struct Particle{
+        glm::vec2 Position;
+        glm::vec2 Velocity;
+        float Rotation = 0.0f;
+        float SizeBegin, SizeEnd;
+
+        float LifeTime = 1.0f;
+        float LifeRemaining = 0.0f;
+
+        bool Active = true;
+    };
+
+    std::vector<Particle> m_ParticlePool;
+    uint32_t poolIndex = 999;
+
+    m_ParticlePool.resize(1000);
+
+    //float angle = 0.0005;
+    glm::mat4 modelmatrix = glm::mat4(1.0);
+
+    for(auto& particle : m_ParticlePool){
+        if(!particle.Active){
+            continue;
+        }
+    }
+
     while (window.isWindowOpen())
     {
         window.pollEvents();
@@ -159,12 +172,28 @@ int main(int argc, const char** argv) {
         color.fill(&colorData);
 
         position.fill(&pos);
-
         auto end = std::chrono::system_clock::now();
-        auto deltatime = end - start;
+        float deltatime = std::chrono::duration<float>(end - start).count();
         start = end;
-        cameraManager.getCamera().updateView(std::chrono::duration<double>(deltatime).count());
-        const glm::mat4 mvp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView();
+
+        //modelmatrix = glm::rotate(modelmatrix, angle, glm::vec3(0,0,1));
+        for(auto& particle : m_ParticlePool){
+            if (!particle.Active){
+                continue;
+            }
+            if (particle.LifeRemaining <= 0.0f){
+                particle.Active = false;
+                continue;
+            }
+
+            particle.LifeRemaining -= deltatime;
+            particle.Position += particle.Velocity * deltatime;
+            particle.Rotation += 0.01f * deltatime;
+
+        }
+
+        cameraManager.getCamera().updateView(deltatime);
+        const glm::mat4 mvp = modelmatrix * cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView();
 
         vkcv::PushConstantData pushConstantData((void*)&mvp, sizeof(glm::mat4));
         auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
-- 
GitLab