From e9d23b7af32f82efb806356166c36070498128c5 Mon Sep 17 00:00:00 2001 From: Mara Vogt <mvogt@uni-koblenz.de> Date: Sun, 13 Jun 2021 19:09:30 +0200 Subject: [PATCH] [#63] started implementation of first_scene the application does not work as inteded yet, it is currently being debugged --- projects/CMakeLists.txt | 1 + projects/first_scene/.gitignore | 1 + projects/first_scene/CMakeLists.txt | 28 +++ .../first_scene/resources/Szene/Szene.bin | 3 + .../first_scene/resources/Szene/Szene.gltf | 3 + .../resources/Szene/boards2_vcyc.jpg | 3 + .../resources/Szene/boards2_vcyc_jpg.jpg | 3 + .../resources/cube/boards2_vcyc_jpg.jpg | 3 + projects/first_scene/resources/cube/cube.bin | 3 + .../first_scene/resources/cube/cube.blend | 3 + .../first_scene/resources/cube/cube.blend1 | 3 + projects/first_scene/resources/cube/cube.glb | 3 + projects/first_scene/resources/cube/cube.gltf | 3 + .../first_scene/resources/shaders/compile.bat | 3 + .../first_scene/resources/shaders/frag.spv | Bin 0 -> 920 bytes .../first_scene/resources/shaders/shader.frag | 14 ++ .../first_scene/resources/shaders/shader.vert | 19 ++ .../first_scene/resources/shaders/vert.spv | Bin 0 -> 1520 bytes .../resources/triangle/Triangle.bin | 3 + .../resources/triangle/Triangle.blend | 3 + .../resources/triangle/Triangle.glb | 3 + .../resources/triangle/Triangle.gltf | 3 + projects/first_scene/src/main.cpp | 224 ++++++++++++++++++ 23 files changed, 332 insertions(+) create mode 100644 projects/first_scene/.gitignore create mode 100644 projects/first_scene/CMakeLists.txt create mode 100644 projects/first_scene/resources/Szene/Szene.bin create mode 100644 projects/first_scene/resources/Szene/Szene.gltf create mode 100644 projects/first_scene/resources/Szene/boards2_vcyc.jpg create mode 100644 projects/first_scene/resources/Szene/boards2_vcyc_jpg.jpg create mode 100644 projects/first_scene/resources/cube/boards2_vcyc_jpg.jpg create mode 100644 projects/first_scene/resources/cube/cube.bin create mode 100644 projects/first_scene/resources/cube/cube.blend create mode 100644 projects/first_scene/resources/cube/cube.blend1 create mode 100644 projects/first_scene/resources/cube/cube.glb create mode 100644 projects/first_scene/resources/cube/cube.gltf create mode 100644 projects/first_scene/resources/shaders/compile.bat create mode 100644 projects/first_scene/resources/shaders/frag.spv create mode 100644 projects/first_scene/resources/shaders/shader.frag create mode 100644 projects/first_scene/resources/shaders/shader.vert create mode 100644 projects/first_scene/resources/shaders/vert.spv create mode 100644 projects/first_scene/resources/triangle/Triangle.bin create mode 100644 projects/first_scene/resources/triangle/Triangle.blend create mode 100644 projects/first_scene/resources/triangle/Triangle.glb create mode 100644 projects/first_scene/resources/triangle/Triangle.gltf create mode 100644 projects/first_scene/src/main.cpp diff --git a/projects/CMakeLists.txt b/projects/CMakeLists.txt index ccbdaf41..474c9764 100644 --- a/projects/CMakeLists.txt +++ b/projects/CMakeLists.txt @@ -2,4 +2,5 @@ # Add new projects/examples here: add_subdirectory(first_triangle) add_subdirectory(first_mesh) +add_subdirectory(first_scene) add_subdirectory(cmd_sync_test) \ No newline at end of file diff --git a/projects/first_scene/.gitignore b/projects/first_scene/.gitignore new file mode 100644 index 00000000..85ce58a4 --- /dev/null +++ b/projects/first_scene/.gitignore @@ -0,0 +1 @@ +first_mesh \ No newline at end of file diff --git a/projects/first_scene/CMakeLists.txt b/projects/first_scene/CMakeLists.txt new file mode 100644 index 00000000..8b907397 --- /dev/null +++ b/projects/first_scene/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.16) +project(first_scene) + +# setting c++ standard for the project +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# this should fix the execution path to load local files from the project +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + +# adding source files to the project +add_executable(first_scene src/main.cpp) + +# this should fix the execution path to load local files from the project (for MSVC) +if(MSVC) + set_target_properties(first_scene PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + set_target_properties(first_scene PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + + # in addition to setting the output directory, the working directory has to be set + # by default visual studio sets the working directory to the build directory, when using the debugger + set_target_properties(first_scene PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) +endif() + +# including headers of dependencies and the VkCV framework +target_include_directories(first_scene SYSTEM BEFORE PRIVATE ${vkcv_include} ${vkcv_includes} ${vkcv_asset_loader_include} ${vkcv_camera_include}) + +# linking with libraries from all dependencies and the VkCV framework +target_link_libraries(first_scene vkcv ${vkcv_libraries} vkcv_asset_loader ${vkcv_asset_loader_libraries} vkcv_camera) diff --git a/projects/first_scene/resources/Szene/Szene.bin b/projects/first_scene/resources/Szene/Szene.bin new file mode 100644 index 00000000..c87d2763 --- /dev/null +++ b/projects/first_scene/resources/Szene/Szene.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee4742718f720d589a2a03f5d879f8c50ba9057718d191a43b046eaa9071080d +size 70328 diff --git a/projects/first_scene/resources/Szene/Szene.gltf b/projects/first_scene/resources/Szene/Szene.gltf new file mode 100644 index 00000000..e5a32b29 --- /dev/null +++ b/projects/first_scene/resources/Szene/Szene.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75ba834118792ebbacf528a1690c7d04df4b4c8122b9f99a9aa9a9d075d2c86a +size 7421 diff --git a/projects/first_scene/resources/Szene/boards2_vcyc.jpg b/projects/first_scene/resources/Szene/boards2_vcyc.jpg new file mode 100644 index 00000000..2636039e --- /dev/null +++ b/projects/first_scene/resources/Szene/boards2_vcyc.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cca33a6e58ddd1b37a6e6853a9aa0e7b15ca678937119194752393dd2a0a0564 +size 1192476 diff --git a/projects/first_scene/resources/Szene/boards2_vcyc_jpg.jpg b/projects/first_scene/resources/Szene/boards2_vcyc_jpg.jpg new file mode 100644 index 00000000..2636039e --- /dev/null +++ b/projects/first_scene/resources/Szene/boards2_vcyc_jpg.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cca33a6e58ddd1b37a6e6853a9aa0e7b15ca678937119194752393dd2a0a0564 +size 1192476 diff --git a/projects/first_scene/resources/cube/boards2_vcyc_jpg.jpg b/projects/first_scene/resources/cube/boards2_vcyc_jpg.jpg new file mode 100644 index 00000000..2636039e --- /dev/null +++ b/projects/first_scene/resources/cube/boards2_vcyc_jpg.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cca33a6e58ddd1b37a6e6853a9aa0e7b15ca678937119194752393dd2a0a0564 +size 1192476 diff --git a/projects/first_scene/resources/cube/cube.bin b/projects/first_scene/resources/cube/cube.bin new file mode 100644 index 00000000..3303cd86 --- /dev/null +++ b/projects/first_scene/resources/cube/cube.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bb9b6b8bbe50a0aaa517057f245ee844f80afa7426dacb2aed4128f71629ce4 +size 840 diff --git a/projects/first_scene/resources/cube/cube.blend b/projects/first_scene/resources/cube/cube.blend new file mode 100644 index 00000000..62ccb2c7 --- /dev/null +++ b/projects/first_scene/resources/cube/cube.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6c1e245f259c610528c9485db6688928faac0ab2addee9e3c2dde7740e4dd09 +size 774920 diff --git a/projects/first_scene/resources/cube/cube.blend1 b/projects/first_scene/resources/cube/cube.blend1 new file mode 100644 index 00000000..13f21dcc --- /dev/null +++ b/projects/first_scene/resources/cube/cube.blend1 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4496f423569b8ca81f3b3a55fad00f925557e0193fb9dbe6cdce7e71fb48f7b +size 774920 diff --git a/projects/first_scene/resources/cube/cube.glb b/projects/first_scene/resources/cube/cube.glb new file mode 100644 index 00000000..66a42c65 --- /dev/null +++ b/projects/first_scene/resources/cube/cube.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:198568b715f397d78f7c358c0f709a419e7fd677e54cdec7c19f71b5ed264897 +size 1194508 diff --git a/projects/first_scene/resources/cube/cube.gltf b/projects/first_scene/resources/cube/cube.gltf new file mode 100644 index 00000000..42817614 --- /dev/null +++ b/projects/first_scene/resources/cube/cube.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f82f455647a84ca6242882ae26a79a499d3ce594f8de317ab89488c5b79721ac +size 2823 diff --git a/projects/first_scene/resources/shaders/compile.bat b/projects/first_scene/resources/shaders/compile.bat new file mode 100644 index 00000000..b4521235 --- /dev/null +++ b/projects/first_scene/resources/shaders/compile.bat @@ -0,0 +1,3 @@ +%VULKAN_SDK%\Bin32\glslc.exe shader.vert -o vert.spv +%VULKAN_SDK%\Bin32\glslc.exe shader.frag -o frag.spv +pause \ No newline at end of file diff --git a/projects/first_scene/resources/shaders/frag.spv b/projects/first_scene/resources/shaders/frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..087e4e22fb2fcec27d99b3ff2aa1a705fe755796 GIT binary patch literal 920 zcmZQ(Qf6mhU}WH8;AN0yfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e z3>*wB3=CkLo0ypglHg=uU=U+qV31*8U=Uzn2FtNCFfcGPFf%YQFfbfq1gYm_aQBIK z404JuPAy0*N-Rl@FV09zNiB-cPs&P7E-417;R2~~_xE@Aag9$dD2OjEsmw`@&&kY7 zjZeueN=+`wEK3Ec<3LiEnU|bXnu4r=m4OB92AKO;8CV%WZp<$&an8@lF9Nw4B*w$Q zz>u3-oDq^*QBqoz%D~FN#vs7Jz)%9=2Pfth<fIlcFo4Vh`L7_cxHvQn#AgNj6~y<; zFUn2KVPJ4)U;*192Qr)i!UvhJgvM7y;)Co$mIv`c@}Rf?nFq2HWFCwU3SST(WP~sS z6F6)Y!J*6mW{WW}Gq5o*FeorEFo-j-Fo5C!#0SNm0s{*J2RKd`z~a_WJ}6v3@{$ak z3|tHhVErKbKz6_|j1Mw{8!8A=3o--52l*2uEXBaYzz4RUg@GR=z`y|JgVcfeApe1c zr5TtRgcumW_JQ0f0<{;ERzP-$GJsMj0|Q7Lq!+{og$2kRAoUVZ^`LYJQZEfv5ArWa zJ%|qqE0B6K23By`fYgHQ2Kn^|0}}%)0|SFC0}I#<ybKHsAU}ZkAomM`(=h`>7y~QV zox%(Z3?MZiagZ92yTqYsKAeG-0puP@1_lO@I*_<O0|z*ar5G3(K;j?_vK!<ckRR<B Sn89fUB>$Izk->t2kpTei7*62; literal 0 HcmV?d00001 diff --git a/projects/first_scene/resources/shaders/shader.frag b/projects/first_scene/resources/shaders/shader.frag new file mode 100644 index 00000000..71a1de69 --- /dev/null +++ b/projects/first_scene/resources/shaders/shader.frag @@ -0,0 +1,14 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 0) in vec3 passNormal; +layout(location = 1) in vec2 passUV; + +layout(location = 0) out vec3 outColor; + +layout(set=0, binding=0) uniform texture2D meshTexture; +layout(set=0, binding=1) uniform sampler textureSampler; + +void main() { + outColor = texture(sampler2D(meshTexture, textureSampler), passUV).rgb; +} \ No newline at end of file diff --git a/projects/first_scene/resources/shaders/shader.vert b/projects/first_scene/resources/shaders/shader.vert new file mode 100644 index 00000000..76855152 --- /dev/null +++ b/projects/first_scene/resources/shaders/shader.vert @@ -0,0 +1,19 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 0) in vec3 inPosition; +layout(location = 1) in vec3 inNormal; +layout(location = 2) in vec2 inUV; + +layout(location = 0) out vec3 passNormal; +layout(location = 1) out vec2 passUV; + +layout( push_constant ) uniform constants{ + mat4 mvp; +}; + +void main() { + gl_Position = mvp * vec4(inPosition, 1.0); + passNormal = inNormal; + passUV = inUV; +} \ No newline at end of file diff --git a/projects/first_scene/resources/shaders/vert.spv b/projects/first_scene/resources/shaders/vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..374c023e14b351eb43cbcda5951cbb8b3d6f96a1 GIT binary patch literal 1520 zcmZQ(Qf6mhU}WH8;APNdfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e z4BTKg3j+f~ZenI0h{Makz#z%Mz@Wmwz@W;&z@W*%z@W{*z`)GF%)rFJz;K9>fq{jA zlfm65-Z982zBsiYu_&=5HNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>C zH9jXZFEu_TvnVyWB(p3Pq>ckgU1nZ#PH76V0#*hV24wfKGO&SNot_gPkXjU$T2zu+ z0dhARR2;+x$>kSkmSpDVF|aYPgVlq=1T3DJR}!3Al?qY^lLPrHJty8dC$qpMv$!NN zFF6&i4-{G;xzd~*xEw13GXp4`KxVKqurdfTFfb(N=Ye#Byw1SJzycNn$>)|8Fo4tx zgE$Nf3?TKO@XgE%fH@H?1`6+j#NuMV{G!~%9Edtl_-E$9L_lIJ;P?Qk3k`$tL2;9r z2jVd>crdVn{R*-Q60-;~kpDqqAR49)<ZqA|$d52F5E~>03UhY`X0Ul6bsk85Vr77s z3-UL}E@cpbCdSUdz#zcDzyLA>qz+_;I|B<iZOK8^gZLnSBlAIi2Ju1e1j&QaA2J{0 zUl1Q;o-hLwI87>oQzrwMEylpiz{bG9puoVuAkM(T0CES25Au&F0}BHOR1V|>Z783U z0hEgv7-Se&7`PZ1!1_UAa?msdGXo?C!U_y53_RdG0m^3#4AxLSC{2LE4`dG?)E<yO zK=y$6{2)si7#JiNSioTeG8g17IR<8MdI5zO$ZR171_qG*pl}134dR2+4@e9oF9MYZ zsR#K{9O`C}-5_}hsDD7>ApIadD9yp#0tydluv;4JLFyHuegU}$#0SME$SjzC5FZpz zATgMEpm+kA2eMxsYCkAWK>9VH=7GdP>Op)^Jc9It<h7vggUN&Vpm+tDXU4z^jz>_q zfSd@@^Miqj0hHz(8CV%Weivn6U;u>&C_HVUVJXJIzyJ~l@j>pEf|g@}44@JN6t@fv zATf}cFfmyMh#1ITm>4K+fz*Ng62QO?PCxPt5d9$aAbC*OO=MsN%Yo7v$Zn7tko!Pk zsl>nlE+0VdvtwXp0P#WUU~W@`maQN;P`HBlAURNY=s?R`kQ^w?K>WW9j0_eGj0^z8 C!Fam> literal 0 HcmV?d00001 diff --git a/projects/first_scene/resources/triangle/Triangle.bin b/projects/first_scene/resources/triangle/Triangle.bin new file mode 100644 index 00000000..57f26ad9 --- /dev/null +++ b/projects/first_scene/resources/triangle/Triangle.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:412ebd5f7242c266b4957e7e26be13aa331dbcb7bbb854ab334a2437ae8ed959 +size 104 diff --git a/projects/first_scene/resources/triangle/Triangle.blend b/projects/first_scene/resources/triangle/Triangle.blend new file mode 100644 index 00000000..2421dc5e --- /dev/null +++ b/projects/first_scene/resources/triangle/Triangle.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:387e544df173219fbf292a64a6656d1d782bbf71a5a9e9fdef0a308f47b05477 +size 758144 diff --git a/projects/first_scene/resources/triangle/Triangle.glb b/projects/first_scene/resources/triangle/Triangle.glb new file mode 100644 index 00000000..4148620c --- /dev/null +++ b/projects/first_scene/resources/triangle/Triangle.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4be087a605212d139416b5352a018283b26b99260cbcddb7013a1beeb331227 +size 980 diff --git a/projects/first_scene/resources/triangle/Triangle.gltf b/projects/first_scene/resources/triangle/Triangle.gltf new file mode 100644 index 00000000..a188e6ee --- /dev/null +++ b/projects/first_scene/resources/triangle/Triangle.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5fc354e040f79cff329e919677b194c75e3a522c6406f75c1108ad9575f12ec +size 2202 diff --git a/projects/first_scene/src/main.cpp b/projects/first_scene/src/main.cpp new file mode 100644 index 00000000..5c997617 --- /dev/null +++ b/projects/first_scene/src/main.cpp @@ -0,0 +1,224 @@ +#include <iostream> +#include <vkcv/Core.hpp> +#include <GLFW/glfw3.h> +#include <vkcv/camera/CameraManager.hpp> +#include <chrono> +#include <vkcv/asset/asset_loader.hpp> + +int main(int argc, const char** argv) { + const char* applicationName = "First Scene"; + + uint32_t windowWidth = 800; + uint32_t windowHeight = 600; + + vkcv::Window window = vkcv::Window::create( + applicationName, + windowWidth, + windowHeight, + true + ); + + vkcv::CameraManager cameraManager(window, static_cast<float>(window.getWidth()), static_cast<float>(window.getHeight())); + + window.initEvents(); + + vkcv::Core core = vkcv::Core::create( + window, + applicationName, + VK_MAKE_VERSION(0, 0, 1), + { vk::QueueFlagBits::eGraphics ,vk::QueueFlagBits::eCompute , vk::QueueFlagBits::eTransfer }, + {}, + { "VK_KHR_swapchain" } + ); + + vkcv::asset::Scene scene; + + const char* path = argc > 1 ? argv[1] : "resources/Szene/Szene.gltf"; + int result = vkcv::asset::loadScene(path, scene); + + if (result == 1) { + std::cout << "Mesh loading successful!" << std::endl; + } + else { + std::cout << "Mesh loading failed: " << result << std::endl; + return 1; + } + + assert(!scene.vertexGroups.empty()); + std::vector<uint8_t> vBuffers; + std::vector<uint8_t> iBuffers; + //vBuffers.reserve(scene.vertexGroups.size()); + //iBuffers.reserve(scene.vertexGroups.size()); + + std::vector<vkcv::VertexBufferBinding> vBufferBindings; + std::vector<std::vector<vkcv::VertexBufferBinding>> vertexBufferBindings; + std::vector<vkcv::VertexAttribute> vAttributes; + + for (int i = 0; i < scene.vertexGroups.size(); i++){ + + /*auto vertexBuffer = core.createBuffer<uint8_t>( + vkcv::BufferType::VERTEX, + scene.vertexGroups[i].vertexBuffer.data.size(), + vkcv::BufferMemoryType::DEVICE_LOCAL + ); + vertexBuffer.fill(scene.vertexGroups[i].vertexBuffer.data);*/ + vBuffers.insert(vBuffers.end(), scene.vertexGroups[i].vertexBuffer.data.begin(),scene.vertexGroups[i].vertexBuffer.data.end()); + + /*auto indexBuffer = core.createBuffer<uint8_t>( + vkcv::BufferType::INDEX, + scene.vertexGroups[i].indexBuffer.data.size(), + vkcv::BufferMemoryType::DEVICE_LOCAL + ); + indexBuffer.fill(scene.vertexGroups[i].indexBuffer.data);*/ + iBuffers.insert(iBuffers.end(), scene.vertexGroups[i].indexBuffer.data.begin(),scene.vertexGroups[i].indexBuffer.data.end()); + + auto& attributes = scene.vertexGroups[i].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); + }); + } + + auto vertexBuffer = core.createBuffer<uint8_t>( + vkcv::BufferType::VERTEX, + vBuffers.size(), + vkcv::BufferMemoryType::DEVICE_LOCAL + ); + vertexBuffer.fill(vBuffers); + + auto indexBuffer = core.createBuffer<uint8_t>( + vkcv::BufferType::INDEX, + iBuffers.size(), + vkcv::BufferMemoryType::DEVICE_LOCAL + ); + indexBuffer.fill(iBuffers); + + for (int m = 0; m < scene.vertexGroups.size(); m++){ + for (int k = 0; k < scene.vertexGroups[m].vertexBuffer.attributes.size(); k++){ + vAttributes.push_back(scene.vertexGroups[m].vertexBuffer.attributes[k]); + vBufferBindings.push_back(vkcv::VertexBufferBinding(scene.vertexGroups[m].vertexBuffer.attributes[k].offset, vertexBuffer.getVulkanHandle())); + } + vertexBufferBindings.push_back(vBufferBindings); + vBufferBindings.clear(); + } + + // an example attachment for passes that output to the window + const vkcv::AttachmentDescription present_color_attachment( + vkcv::AttachmentOperation::STORE, + vkcv::AttachmentOperation::CLEAR, + core.getSwapchainImageFormat() + ); + + const vkcv::AttachmentDescription depth_attachment( + vkcv::AttachmentOperation::STORE, + vkcv::AttachmentOperation::CLEAR, + vk::Format::eD32Sfloat + ); + + vkcv::PassConfig scenePassDefinition({ present_color_attachment, depth_attachment }); + vkcv::PassHandle scenePass = core.createPass(scenePassDefinition); + + if (!scenePass) { + std::cout << "Error. Could not create renderpass. Exiting." << std::endl; + return EXIT_FAILURE; + } + + vkcv::ShaderProgram sceneShaderProgram{}; + sceneShaderProgram.addShader(vkcv::ShaderStage::VERTEX, std::filesystem::path("resources/shaders/vert.spv")); + sceneShaderProgram.addShader(vkcv::ShaderStage::FRAGMENT, std::filesystem::path("resources/shaders/frag.spv")); + sceneShaderProgram.reflectShader(vkcv::ShaderStage::VERTEX); + sceneShaderProgram.reflectShader(vkcv::ShaderStage::FRAGMENT); + + uint32_t setID = 0; + std::vector<vkcv::DescriptorBinding> descriptorBindings = { sceneShaderProgram.getReflectedDescriptors()[setID] }; + vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorBindings); + + const vkcv::PipelineConfig scenePipelineDefinition( + sceneShaderProgram, + UINT32_MAX, + UINT32_MAX, + scenePass, + vAttributes, + { core.getDescriptorSet(descriptorSet).layout }, + true); + vkcv::PipelineHandle scenePipeline = core.createGraphicsPipeline(scenePipelineDefinition); + + if (!scenePipeline) { + std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl; + return EXIT_FAILURE; + } + + // FIXME There should be a test here to make sure there is at least 1 + // texture in the scene. + vkcv::asset::Texture &tex = scene.textures[2]; + vkcv::Image texture = core.createImage(vk::Format::eR8G8B8A8Srgb, tex.w, tex.h); + texture.fill(tex.data.data()); + + vkcv::SamplerHandle sampler = core.createSampler( + vkcv::SamplerFilterType::LINEAR, + vkcv::SamplerFilterType::LINEAR, + vkcv::SamplerMipmapMode::LINEAR, + vkcv::SamplerAddressMode::REPEAT + ); + + vkcv::DescriptorWrites setWrites; + setWrites.sampledImageWrites = { vkcv::SampledImageDescriptorWrite(0, texture.getHandle()) }; + setWrites.samplerWrites = { vkcv::SamplerDescriptorWrite(1, sampler) }; + core.writeDescriptorSet(descriptorSet, setWrites); + + vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle(); + + const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle(); + + vkcv::DescriptorSetUsage descriptorUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle); + std::vector<vkcv::DrawcallInfo> drawcalls; + + for(int l = 0; l < scene.vertexGroups.size(); l++){ + vkcv::Mesh renderMesh(vertexBufferBindings[l], indexBuffer.getVulkanHandle(), scene.vertexGroups[l].numIndices); + drawcalls.push_back(vkcv::DrawcallInfo(renderMesh, {descriptorUsage})); + } + + auto start = std::chrono::system_clock::now(); + while (window.isWindowOpen()) { + vkcv::Window::pollEvents(); + + if(window.getHeight() == 0 || window.getWidth() == 0) + continue; + + uint32_t swapchainWidth, swapchainHeight; + if (!core.beginFrame(swapchainWidth, swapchainHeight)) { + continue; + } + + if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) { + depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle(); + + windowWidth = swapchainWidth; + windowHeight = swapchainHeight; + } + + auto end = std::chrono::system_clock::now(); + auto deltatime = end - start; + start = end; + cameraManager.getCamera().updateView(std::chrono::duration<double>(deltatime).count()); + const glm::mat4 mvp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView(); + + vkcv::PushConstantData pushConstantData((void*)&mvp, sizeof(glm::mat4)); + + const std::vector<vkcv::ImageHandle> renderTargets = { swapchainInput, depthBuffer }; + auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); + + core.recordDrawcallsToCmdStream( + cmdStream, + scenePass, + scenePipeline, + pushConstantData, + drawcalls, + renderTargets); + core.prepareSwapchainImageForPresent(cmdStream); + core.submitCommandStream(cmdStream); + core.endFrame(); + } + + return 0; +} -- GitLab