Files
Cheap-Vulkan-Renderer/cve_model.cpp
2026-02-20 18:50:50 +00:00

63 lines
2.3 KiB
C++

#include "cve_model.hpp"
#include <cassert>
#include <cstring>
namespace cve {
CveModel::CveModel(CveDevice &device, const std::vector<Vertex> &verticies) : cveDevice{device} {
createVertexBuffers(verticies);
}
CveModel::~CveModel() {
vkDestroyBuffer(cveDevice.device(), vertexBuffer, nullptr);
vkFreeMemory(cveDevice.device(), vertexBufferMemory, nullptr);
}
void CveModel::createVertexBuffers(const std::vector<Vertex> &verticies) {
vertexCount = static_cast<uint32_t>(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<size_t>(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<VkVertexInputBindingDescription> CveModel::Vertex::getBindingDescriptions() {
std::vector<VkVertexInputBindingDescription> bindingDescriptions(1);
bindingDescriptions[0].binding = 0;
bindingDescriptions[0].stride = sizeof(Vertex);
bindingDescriptions[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
return bindingDescriptions;
}
std::vector<VkVertexInputAttributeDescription> CveModel::Vertex::getAttributeDescriptions() {
std::vector<VkVertexInputAttributeDescription> attributeDescriptions(1);
attributeDescriptions[0].binding = 0;
attributeDescriptions[0].location = 0;
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT;
attributeDescriptions[0].offset = 0;
return attributeDescriptions;
}
}