X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fvulkan%2Fmesh-vk.cc;h=729e24c8af20c3fd6457d4c5ed5eb8e20b1af98c;hb=6cecb8f16f1863496884ca86790375dbb27138ba;hp=4bd47912b6bb22ff740040c586c70f2ce0fcef8f;hpb=0da7a98f74d00bfa6cf0d47fd7cf0f687eeba5f6;p=demo diff --git a/src/vulkan/mesh-vk.cc b/src/vulkan/mesh-vk.cc index 4bd4791..729e24c 100644 --- a/src/vulkan/mesh-vk.cc +++ b/src/vulkan/mesh-vk.cc @@ -1,11 +1,17 @@ +#include +#include "allocator.h" #include "mesh-vk.h" -MeshVK::MeshVK() {} +MeshVK::MeshVK() +{ +} + MeshVK::MeshVK(const MeshVK &mesh) { indices = mesh.indices; vertices = mesh.vertices; normals = mesh.normals; + tex_coords = mesh.tex_coords; } MeshVK &MeshVK::operator=(const MeshVK &mesh) @@ -17,20 +23,121 @@ MeshVK &MeshVK::operator=(const MeshVK &mesh) indices = mesh.indices; vertices = mesh.vertices; normals = mesh.normals; + tex_coords = mesh.tex_coords; return *this; } MeshVK::~MeshVK() { + vku_destroy_buffer(vk_vertices); + vku_destroy_buffer(vk_normals); + vku_destroy_buffer(vk_tex_coords); + vku_destroy_buffer(vk_indices); + vertices.clear(); normals.clear(); + tex_coords.clear(); + indices.clear(); } -void MeshVK::update_vertex_data() +bool MeshVK::update_vertex_data() { + if(vertices.empty()) { + printf("empty vertices!\n"); + return false; + } + + /* create the buffers */ + + int vsz = vertices.size() * sizeof(Vec3); + if(!(vk_vertices = vku_create_buffer(vsz, + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT))) { + fprintf(stderr, "Failed to create the buffer for the vertices.\n"); + return false; + } + + int nsz = normals.size() * sizeof(Vec3); + if(!(vk_normals = vku_create_buffer(nsz, + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT))) { + vku_destroy_buffer(vk_vertices); + + fprintf(stderr, "Failed to create the buffer for the normals.\n"); + return false; + } + + int tsz = tex_coords.size() * sizeof(Vec2); + if(!(vk_tex_coords = vku_create_buffer(tsz, + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT))) { + vku_destroy_buffer(vk_vertices); + vku_destroy_buffer(vk_normals); + + fprintf(stderr, + "Failed to create the buffer for the texture coordinates.\n"); + return false; + } + + int isz = indices.size() * 2; + if(!(vk_indices = vku_create_buffer(isz, + VK_BUFFER_USAGE_INDEX_BUFFER_BIT))) { + vku_destroy_buffer(vk_vertices); + vku_destroy_buffer(vk_normals); + vku_destroy_buffer(vk_tex_coords); + + fprintf(stderr, "Failed to create the indices buffer.\n"); + return false; + } + + /* write the buffers */ + + if(!vku_write_memory(vk_vertices->mem_pool, vsz, (void*)vertices.data())) { + fprintf(stderr, "Failed to write the vertices to GPU.\n"); + return false; + } + if(vkBindBufferMemory(vk_device, vk_vertices->buf, vk_vertices->mem_pool, + 0) != VK_SUCCESS) { + fprintf(stderr, "Failed to bind the vertex buffer memory\n"); + return false; + } + + if(!vku_write_memory(vk_normals->mem_pool, nsz, (void*)normals.data())) { + fprintf(stderr, "Failed to write the normals to GPU.\n"); + return false; + } + if(vkBindBufferMemory(vk_device, vk_normals->buf, vk_normals->mem_pool, 0) + != VK_SUCCESS) { + fprintf(stderr, "Failed to bind the normal buffer memory\n"); + return false; + } + + if(!vku_write_memory(vk_tex_coords->mem_pool, tsz, + (void*)tex_coords.data())) { + fprintf(stderr, "Failed to write the texture coordinates to GPU.\n"); + return false; + } + if(vkBindBufferMemory(vk_device, vk_tex_coords->buf, + vk_tex_coords->mem_pool, 0) != VK_SUCCESS) { + fprintf(stderr, "Failed to bind the tex coordinates buffer memory.\n"); + return false; + } + + if(!vku_write_memory(vk_indices->mem_pool, isz, (void*)indices.data())) { + fprintf(stderr, "Failed to write the indices to GPU.\n"); + return false; + } + if(vkBindBufferMemory(vk_device, vk_indices->buf, vk_indices->mem_pool, 0) + != VK_SUCCESS) { + fprintf(stderr, "Failed to bind the index buffer memory.\n"); + return false; + } + + return true; } void MeshVK::draw() const { -} \ No newline at end of file +} + +void MeshVK::draw_normals(float scale) const +{ +}