#include "cve_model.hpp" #include #include namespace cve { CveModel::CveModel(CveDevice &device, const std::vector &verticies) : cveDevice{device} { createVertexBuffers(verticies); } CveModel::~CveModel() { vkDestroyBuffer(cveDevice.device(), vertexBuffer, nullptr); vkFreeMemory(cveDevice.device(), vertexBufferMemory, nullptr); } void CveModel::createVertexBuffers(const std::vector &verticies) { vertexCount = static_cast(verticies.size()); assert(vertexCount >= 3 && "Vertex count must be at least 3"); VkDeviceSize bufferSize = sizeof(verticies[0]) * vertexCount; cveDevice.createBuffer( bufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBuffer, vertexBufferMemory ); void *data; vkMapMemory(cveDevice.device(), vertexBufferMemory, 0, bufferSize, 0, &data); memcpy(data, verticies.data(), static_cast(bufferSize)); vkUnmapMemory(cveDevice.device(), vertexBufferMemory); } void CveModel::draw(VkCommandBuffer commandBuffer) { vkCmdDraw(commandBuffer, vertexCount, 1, 0, 0); } void CveModel::bind(VkCommandBuffer commandBuffer) { VkBuffer buffers[] = {vertexBuffer}; VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(commandBuffer, 0, 1, buffers, offsets); } std::vector CveModel::Vertex::getBindingDescriptions() { std::vector bindingDescriptions(1); bindingDescriptions[0].binding = 0; bindingDescriptions[0].stride = sizeof(Vertex); bindingDescriptions[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX; return bindingDescriptions; } std::vector CveModel::Vertex::getAttributeDescriptions() { std::vector attributeDescriptions(1); attributeDescriptions[0].binding = 0; attributeDescriptions[0].location = 0; attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT; attributeDescriptions[0].offset = 0; return attributeDescriptions; } }