diff --git a/VulkanTest b/VulkanTest index c594100..ead6bc1 100755 Binary files a/VulkanTest and b/VulkanTest differ diff --git a/build/first_app.d b/build/first_app.d index 955a2ca..76a52c1 100644 --- a/build/first_app.d +++ b/build/first_app.d @@ -1,10 +1,10 @@ build/first_app.o: first_app.cpp first_app.hpp cve_window.hpp \ - cve_pipeline.hpp cve_device.hpp cve_swap_chain.hpp cve_model.hpp \ - cve_game_object.hpp + cve_pipeline.hpp cve_device.hpp cve_swap_chain.hpp cve_game_object.hpp \ + cve_model.hpp first_app.hpp: cve_window.hpp: cve_pipeline.hpp: cve_device.hpp: cve_swap_chain.hpp: -cve_model.hpp: cve_game_object.hpp: +cve_model.hpp: diff --git a/build/first_app.o b/build/first_app.o index 70b6289..ae714a1 100644 Binary files a/build/first_app.o and b/build/first_app.o differ diff --git a/build/main.d b/build/main.d index 384038d..5ff42ad 100644 --- a/build/main.d +++ b/build/main.d @@ -1,9 +1,9 @@ build/main.o: main.cpp first_app.hpp cve_window.hpp cve_pipeline.hpp \ - cve_device.hpp cve_swap_chain.hpp cve_model.hpp cve_game_object.hpp + cve_device.hpp cve_swap_chain.hpp cve_game_object.hpp cve_model.hpp first_app.hpp: cve_window.hpp: cve_pipeline.hpp: cve_device.hpp: cve_swap_chain.hpp: -cve_model.hpp: cve_game_object.hpp: +cve_model.hpp: diff --git a/build/main.o b/build/main.o index 27ab73b..c08fd61 100644 Binary files a/build/main.o and b/build/main.o differ diff --git a/first_app.cpp b/first_app.cpp index 3c7c098..7c3fa18 100644 --- a/first_app.cpp +++ b/first_app.cpp @@ -15,7 +15,7 @@ namespace cve { }; FirstApp::FirstApp() { - loadModels(); + loadGameObjects(); createPipelineLayout(); recreateSwapChain(); createCommandBuffers(); @@ -34,14 +34,21 @@ namespace cve { vkDeviceWaitIdle(cveDevice.device()); } - void FirstApp::loadModels() { + void FirstApp::loadGameObjects() { std::vector verticies { {{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}}, {{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}} }; - cveModel = std::make_unique(cveDevice, verticies); + auto cveModel = std::make_shared(cveDevice, verticies); + + auto triangle = CveGameObject::createGameObject(); + triangle.model = cveModel; + triangle.color = {0.1f, 0.8f, 0.1f}; + triangle.transform2d.translation.x = .2f; + + gameObjects.push_back(std::move(triangle)); } void FirstApp::createPipelineLayout() { @@ -123,8 +130,6 @@ namespace cve { } void FirstApp::recordCommandBuffer(int imageIndex) { - static int frame = 30; - frame = (frame+1) % 2000; VkCommandBufferBeginInfo beginInfo{}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; @@ -160,24 +165,7 @@ namespace cve { vkCmdSetViewport(commandBuffers[imageIndex], 0, 1, &viewport); vkCmdSetScissor(commandBuffers[imageIndex], 0, 1, &scissor); - cvePipeline->bind(commandBuffers[imageIndex]); - cveModel->bind(commandBuffers[imageIndex]); - - for (int j = 0; j < 4; j++) { - SimplePushConstantData push{}; - push.offset = {-0.5f + frame * 0.0005f, -0.4f + j * 0.25f}; - push.color = {0.0f, 0.0f, 0.2f + 0.2f * j}; - - vkCmdPushConstants( - commandBuffers[imageIndex], - pipelineLayout, - VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, - 0, - sizeof(SimplePushConstantData), - &push - ); - cveModel->draw(commandBuffers[imageIndex]); - } + renderGameObjects(commandBuffers[imageIndex]); @@ -187,6 +175,29 @@ namespace cve { } } + void FirstApp::renderGameObjects(VkCommandBuffer commandBuffer) { + cvePipeline->bind(commandBuffer); + + for (auto& obj: gameObjects) { + SimplePushConstantData push{}; + push.offset = obj.transform2d.translation; + push.color = obj.color; + push.transform = obj.transform2d.mat2(); + + vkCmdPushConstants( + commandBuffer, + pipelineLayout, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + 0, + sizeof(SimplePushConstantData), + &push + ); + + obj.model->bind(commandBuffer); + obj.model->draw(commandBuffer); + } + } + void FirstApp::drawFrame() { uint32_t imageIndex; auto result = cveSwapChain->acquireNextImage(&imageIndex); diff --git a/first_app.hpp b/first_app.hpp index d179456..efc124b 100644 --- a/first_app.hpp +++ b/first_app.hpp @@ -4,7 +4,6 @@ #include "cve_pipeline.hpp" #include "cve_device.hpp" #include "cve_swap_chain.hpp" -#include "cve_model.hpp" #include "cve_game_object.hpp" #include @@ -24,7 +23,7 @@ namespace cve { void run(); private: - void loadModels(); + void loadGameObjects(); void createPipelineLayout(); void createPipeline(); void createCommandBuffers(); @@ -32,6 +31,7 @@ namespace cve { void drawFrame(); void recreateSwapChain(); void recordCommandBuffer(int imageIndex); + void renderGameObjects(VkCommandBuffer commandBuffer); CveWindow cveWindow{WIDTH, HEIGHT, "Hello Vulkan!"}; CveDevice cveDevice{cveWindow}; @@ -39,6 +39,6 @@ namespace cve { std::unique_ptr cvePipeline; VkPipelineLayout pipelineLayout; std::vector commandBuffers; - std::unique_ptr cveModel; + std::vector gameObjects; }; }