Класс модели с индексами

This commit is contained in:
parent cd152c961e
commit 8f41830da3
2 changed files with 59 additions and 3 deletions

View File

@ -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

View File

@ -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);
}