diff --git a/include/Model.h b/include/Model.h index e39f6a6..36b1184 100644 --- a/include/Model.h +++ b/include/Model.h @@ -11,10 +11,25 @@ class Model_wo_indexes : public I_Model Model_wo_indexes(Vertex* vertexArray, uint32_t verteciesCount); ~Model_wo_indexes(); virtual void render(VkCommandBuffer commandBuffer); - + protected: + void bindBuffers(VkCommandBuffer commandBuffer); // привзка используемых буферов данных private: uint32_t verteciesCount; // Количество вершин VkBuffer vertexBuffer; // Буфер вершин }; +// Класс модели с индексами +class Model_w_indexes : public Model_wo_indexes +{ + public: + Model_w_indexes(Vertex* vertexArray, uint32_t verteciesCount, uint32_t* indexArray, uint32_t indeciesCount); + ~Model_w_indexes(); + virtual void render(VkCommandBuffer commandBuffer); + + private: + void bindBuffers(VkCommandBuffer commandBuffer); // привзка используемых буферов данных + uint32_t indeciesCount; // Количество индексов + VkBuffer indexBuffer; // Буфер индексов +}; + #endif // MODEL_H diff --git a/src/Model.cpp b/src/Model.cpp index fa632e0..6b4ec32 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -18,12 +18,53 @@ Model_wo_indexes::~Model_wo_indexes() vulkan.destroyBuffer(vertexBuffer); } -// Рендер модели без индексов -void Model_wo_indexes::render(VkCommandBuffer commandBuffer) +// привзка используемых буферов данных +void Model_wo_indexes::bindBuffers(VkCommandBuffer commandBuffer) { VkBuffer vertexBuffers[] = {vertexBuffer}; VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets); +} + +// Рендер модели без индексов +void Model_wo_indexes::render(VkCommandBuffer commandBuffer) +{ + bindBuffers(commandBuffer); vkCmdDraw(commandBuffer, verteciesCount, 1, 0, 0); } + +// Конструктор класса без индексов - принимает массив вершин +Model_w_indexes::Model_w_indexes(Vertex* vertexArray, uint32_t vCount, uint32_t* indexArray, uint32_t iCount) +: Model_wo_indexes(vertexArray, vCount), indeciesCount(iCount) +{ + extern Vulkan vulkan; + // Создание и инициализация буфера + indexBuffer = vulkan.createDataBuffer(indexArray, indeciesCount * sizeof(uint32_t), VK_BUFFER_USAGE_INDEX_BUFFER_BIT); +} + +// Деструктор класса без индексов +Model_w_indexes::~Model_w_indexes() +{ + extern Vulkan vulkan; + + vulkan.destroyBuffer(indexBuffer); +} + +// привзка используемых буферов данных +void Model_w_indexes::bindBuffers(VkCommandBuffer commandBuffer) +{ + // Привязка родительских буферов + Model_wo_indexes::bindBuffers(commandBuffer); + + // Привязка индексного буфера + vkCmdBindIndexBuffer(commandBuffer, indexBuffer, 0, VK_INDEX_TYPE_UINT32); +} + +// Рендер модели без индексов +void Model_w_indexes::render(VkCommandBuffer commandBuffer) +{ + bindBuffers(commandBuffer); + + vkCmdDrawIndexed(commandBuffer, indeciesCount, 1, 0, 0, 0); +}