68 lines
2.5 KiB
C++
68 lines
2.5 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(2);
|
|
attributeDescriptions[0].binding = 0;
|
|
attributeDescriptions[0].location = 0;
|
|
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT;
|
|
attributeDescriptions[0].offset = offsetof(Vertex, position);
|
|
|
|
attributeDescriptions[1].binding = 0;
|
|
attributeDescriptions[1].location = 1;
|
|
attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT;
|
|
attributeDescriptions[1].offset = offsetof(Vertex, color);
|
|
|
|
return attributeDescriptions;
|
|
}
|
|
}
|