From b55769bbf2b763e20b50885286e29f89e229a1c4 Mon Sep 17 00:00:00 2001 From: JimmyBinoculars Date: Fri, 20 Feb 2026 19:01:01 +0000 Subject: [PATCH] Vertex positions no longer hard coded --- VulkanTest | Bin 102624 -> 103040 bytes cve_pipeline.cpp | 13 +++++++++---- first_app.cpp | 15 ++++++++++++++- first_app.hpp | 3 +++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/VulkanTest b/VulkanTest index 719722f9db4397c710fe1a8ff3933c322b0d382c..d36e5ca52a0b2bb2c1bef667c5b2c1d0558db855 100755 GIT binary patch delta 27393 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 bn|YLW6IuCDbG6PQxta3T2WtOCa{d1U!nV6y diff --git a/cve_pipeline.cpp b/cve_pipeline.cpp index 903711b..b526288 100644 --- a/cve_pipeline.cpp +++ b/cve_pipeline.cpp @@ -1,5 +1,7 @@ #include "cve_pipeline.hpp" +#include "cve_model.hpp" + #include #include #include @@ -63,12 +65,15 @@ namespace cve { shaderStages[1].pNext = nullptr; shaderStages[1].pSpecializationInfo = nullptr; + + auto bindingDescriptions = CveModel::Vertex::getBindingDescriptions(); + auto attributeDescriptions = CveModel::Vertex::getAttributeDescriptions(); VkPipelineVertexInputStateCreateInfo vertexInputInfo{}; vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - vertexInputInfo.vertexBindingDescriptionCount = 0; - vertexInputInfo.vertexAttributeDescriptionCount = 0; - vertexInputInfo.pVertexBindingDescriptions = nullptr; - vertexInputInfo.pVertexAttributeDescriptions = nullptr; + vertexInputInfo.vertexAttributeDescriptionCount = static_cast(attributeDescriptions.size()); + vertexInputInfo.vertexBindingDescriptionCount = static_cast(bindingDescriptions.size()); + vertexInputInfo.pVertexBindingDescriptions = bindingDescriptions.data(); + vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data(); VkPipelineViewportStateCreateInfo viewportInfo{}; viewportInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; diff --git a/first_app.cpp b/first_app.cpp index 3b7cffe..d61bff0 100644 --- a/first_app.cpp +++ b/first_app.cpp @@ -5,6 +5,7 @@ namespace cve { FirstApp::FirstApp() { + loadModels(); createPipelineLayout(); createPipeline(); createCommandBuffers(); @@ -22,6 +23,17 @@ namespace cve { vkDeviceWaitIdle(cveDevice.device()); } + + void FirstApp::loadModels() { + std::vector verticies { + {{0.0f, -0.5f}}, + {{0.5f, 0.5f}}, + {{-0.5f, 0.5f}} + }; + + cveModel = std::make_unique(cveDevice, verticies); + } + void FirstApp::createPipelineLayout() { VkPipelineLayoutCreateInfo pipelineLayoutInfo{}; pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; @@ -86,7 +98,8 @@ namespace cve { vkCmdBeginRenderPass(commandBuffers[i], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); cvePipeline->bind(commandBuffers[i]); - vkCmdDraw(commandBuffers[i], 3, 1, 0, 0); + cveModel->bind(commandBuffers[i]); + cveModel->draw(commandBuffers[i]); vkCmdEndRenderPass(commandBuffers[i]); if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS) { diff --git a/first_app.hpp b/first_app.hpp index 07b683d..374260c 100644 --- a/first_app.hpp +++ b/first_app.hpp @@ -4,6 +4,7 @@ #include "cve_pipeline.hpp" #include "cve_device.hpp" #include "cve_swap_chain.hpp" +#include "cve_model.hpp" #include #include @@ -22,6 +23,7 @@ namespace cve { void run(); private: + void loadModels(); void createPipelineLayout(); void createPipeline(); void createCommandBuffers(); @@ -33,5 +35,6 @@ namespace cve { std::unique_ptr cvePipeline; VkPipelineLayout pipelineLayout; std::vector commandBuffers; + std::unique_ptr cveModel; }; }