From 61e1e6fcef4dc0cab94a5e22be9cff815a9a4988 Mon Sep 17 00:00:00 2001 From: Noah Metz Date: Sat, 13 Jan 2024 02:24:35 -0700 Subject: [PATCH] Got ply loading working\n --- include/ply.h | 46 ++++++------- monkey.ply | Bin 0 -> 32935 bytes src/gpu_mem.c | 3 + src/main.c | 71 ++++++++++++-------- src/ply.c | 175 ++++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 223 insertions(+), 72 deletions(-) create mode 100644 monkey.ply diff --git a/include/ply.h b/include/ply.h index 0ec54c0..ae3605d 100644 --- a/include/ply.h +++ b/include/ply.h @@ -7,29 +7,29 @@ typedef enum { PLY_FORMAT_INVALID = -1, - PLY_FORMAT_ASCII, - PLY_FORMAT_LE, - PLY_FORMAT_BE, + PLY_FORMAT_ASCII = 0, + PLY_FORMAT_LE = 1, + PLY_FORMAT_BE = 2, } PlyFormatType; typedef enum { PLY_HEADER_INVALID = -1, - PLY_HEADER_COMMENT, - PLY_HEADER_END, - PLY_HEADER_ELEMENT, - PLY_HEADER_PROPERTY, + PLY_HEADER_COMMENT = 0, + PLY_HEADER_END = 1, + PLY_HEADER_ELEMENT = 2, + PLY_HEADER_PROPERTY = 3, } PlyHeaderType; typedef enum { PLY_TYPE_INVALID = -1, - PLY_TYPE_CHAR, - PLY_TYPE_UCHAR, - PLY_TYPE_SHORT, - PLY_TYPE_USHORT, - PLY_TYPE_INT, - PLY_TYPE_UINT, - PLY_TYPE_FLOAT, - PLY_TYPE_DOUBLE, + PLY_TYPE_CHAR = 0, + PLY_TYPE_UCHAR = 1, + PLY_TYPE_SHORT = 2, + PLY_TYPE_USHORT = 3, + PLY_TYPE_INT = 4, + PLY_TYPE_UINT = 5, + PLY_TYPE_FLOAT = 6, + PLY_TYPE_DOUBLE = 7, } PlyPropertyType; typedef struct PlyPropertyStruct { @@ -63,18 +63,10 @@ typedef struct PlyMeshStruct { typedef struct PlyMappingsStruct { char* vertex_element; - char* x; - char* y; - char* z; - char* nx; - char* ny; - char* nz; - char* r; - char* g; - char* b; - char* a; - char* u; - char* v; + char* position[3]; + char* normal[3]; + char* colour[4]; + char* texture[2]; char* face_element; char* index; diff --git a/monkey.ply b/monkey.ply new file mode 100644 index 0000000000000000000000000000000000000000..58de342c46dbd233f62317f296733300b450a557 GIT binary patch literal 32935 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 literal 0 HcmV?d00001 diff --git a/src/gpu_mem.c b/src/gpu_mem.c index b7d2653..087aaf6 100644 --- a/src/gpu_mem.c +++ b/src/gpu_mem.c @@ -205,6 +205,9 @@ VkResult gpu_buffer_malloc(VkDevice device, GPUPage* page, VkDeviceSize size, Vk return VK_ERROR_VALIDATION_FAILED_EXT; } + //TODO: use real alignment size instead of hard-coded to 16 + size += size % 16; + VkBufferCreateInfo buffer_info = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .size = size, diff --git a/src/main.c b/src/main.c index e11d196..e59b169 100644 --- a/src/main.c +++ b/src/main.c @@ -978,30 +978,37 @@ VkRenderPass create_render_pass(VkDevice device, VkSurfaceFormatKHR format, VkFo .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, }; - VkSubpassDescription subpass = { - .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, - .colorAttachmentCount = sizeof(color_attachment_refs)/sizeof(VkAttachmentReference), - .pColorAttachments = color_attachment_refs, - .pDepthStencilAttachment = &depth_attachment_ref, + // Create a subpass with the color and depth attachments + VkSubpassDescription subpasses[] = { + { + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .colorAttachmentCount = sizeof(color_attachment_refs)/sizeof(VkAttachmentReference), + .pColorAttachments = color_attachment_refs, + .pDepthStencilAttachment = &depth_attachment_ref, + }, }; - VkSubpassDependency dependency = { - .srcSubpass = VK_SUBPASS_EXTERNAL, - .dstSubpass = 0, - .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, - .srcAccessMask = 0, - .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, - .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + // This basically says "make sure nothing else is writing to the depth_stencil or the color attachment during the pipeline + VkSubpassDependency dependencies[] = { + { + .srcSubpass = VK_SUBPASS_EXTERNAL, + .dstSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, + .srcAccessMask = 0, + .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, + .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + .dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT, + } }; VkRenderPassCreateInfo render_info = { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .attachmentCount = sizeof(attachments)/sizeof(VkAttachmentDescription), .pAttachments = attachments, - .subpassCount = 1, - .pSubpasses = &subpass, - .dependencyCount = 1, - .pDependencies = &dependency, + .subpassCount = sizeof(subpasses)/sizeof(VkSubpassDescription), + .pSubpasses = subpasses, + .dependencyCount = sizeof(dependencies)/sizeof(VkSubpassDependency), + .pDependencies = dependencies, }; VkRenderPass render_pass; @@ -2800,28 +2807,38 @@ VkResult draw_frame(VulkanContext* context, SceneContext* scene, uint32_t materi return vkQueuePresentKHR(context->queues.present, &present_info); } -Object create_simple_mesh_object(Material* simple_mesh_material, VkPhysicalDeviceMemoryProperties memories, VkDevice device, VkCommandPool transfer_pool, VkQueue transfer_queue, uint32_t max_frames_in_flight, VkDescriptorPool pool) { +Object create_simple_mesh_object(PlyMesh ply_mesh, Material* simple_mesh_material, VkPhysicalDeviceMemoryProperties memories, VkDevice device, VkCommandPool transfer_pool, VkQueue transfer_queue, uint32_t max_frames_in_flight, VkDescriptorPool pool) { Object zero = {}; GPUPage* mesh_memory = NULL; - VkResult result = gpu_page_allocate(device, memories, 10000, 0xFFFFFFFF, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, &mesh_memory); + VkResult result = gpu_page_allocate(device, memories, 100000, 0xFFFFFFFF, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, &mesh_memory); if(result != VK_SUCCESS) { return zero; } GPUPage* transfer_memory = NULL; - result = gpu_page_allocate(device, memories, 100000, 0xFFFFFFFF, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &transfer_memory); + result = gpu_page_allocate(device, memories, 200000, 0xFFFFFFFF, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &transfer_memory); if(result != VK_SUCCESS) { return zero; } GPUBuffer transfer_buffer = {0}; - result = gpu_buffer_malloc(device, transfer_memory, 10000, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, &transfer_buffer); + result = gpu_buffer_malloc(device, transfer_memory, 100000, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, &transfer_buffer); if(result != VK_SUCCESS) { return zero; } - Mesh* mesh = load_mesh_to_buffer(device, mesh_memory, transfer_buffer, 4, sizeof(struct Vertex), (void*)vertices, 6, sizeof(uint16_t), (void*)indices, transfer_pool, transfer_queue); + struct Vertex* tmp = malloc(sizeof(struct Vertex)*ply_mesh.vertex_count); + for(uint32_t i = 0; i < ply_mesh.vertex_count; i++) { + tmp[i].pos[0] = ply_mesh.position[i][0]; + tmp[i].pos[1] = ply_mesh.position[i][1]; + tmp[i].pos[2] = ply_mesh.position[i][2]; + tmp[i].color[0] = ply_mesh.colour[i][0]; + tmp[i].color[1] = ply_mesh.colour[i][1]; + tmp[i].color[2] = ply_mesh.colour[i][2]; + } + + Mesh* mesh = load_mesh_to_buffer(device, mesh_memory, transfer_buffer, ply_mesh.vertex_count, sizeof(struct Vertex), (void*)tmp, ply_mesh.index_count, sizeof(uint16_t), (void*)ply_mesh.index, transfer_pool, transfer_queue); if(mesh == 0) { return zero; } @@ -2862,9 +2879,9 @@ Object create_simple_mesh_object(Material* simple_mesh_material, VkPhysicalDevic return zero; } glm_quat_identity(position->rotation); - position->scale[0] = 10.f; - position->scale[1] = 10.f; - position->scale[2] = 10.f; + position->scale[0] = 1.f; + position->scale[1] = 1.f; + position->scale[2] = 1.f; position->position[0] = 0.0f; position->position[1] = 0.0f; position->position[2] = 1.1f; @@ -3006,7 +3023,7 @@ Object create_texture_mesh_object(Material* texture_mesh_material, VkPhysicalDev return object; } -void main_loop(GLFWwindow* window, VulkanContext* context) { +void main_loop(PlyMesh ply_mesh, GLFWwindow* window, VulkanContext* context) { SceneContext scene = create_scene_context(context->device, context->memories, context->max_frames_in_flight); if(scene.pool == VK_NULL_HANDLE) { return; @@ -3039,7 +3056,7 @@ void main_loop(GLFWwindow* window, VulkanContext* context) { return; } - Object triangle_object = create_simple_mesh_object(&simple_mesh_material, context->memories, context->device, context->transfer_command_pool, context->queues.transfer, context->max_frames_in_flight, simple_pool); + Object triangle_object = create_simple_mesh_object(ply_mesh, &simple_mesh_material, context->memories, context->device, context->transfer_command_pool, context->queues.transfer, context->max_frames_in_flight, simple_pool); if(triangle_object.attributes.buckets == 0) { fprintf(stderr, "failed to create simple mesh object\n"); return; @@ -3201,7 +3218,7 @@ int main() { } glfwSetKeyCallback(window, key_callback); - main_loop(window, context); + main_loop(monkey, window, context); cleanup(window, context); diff --git a/src/ply.c b/src/ply.c index 90c612e..749e9f4 100644 --- a/src/ply.c +++ b/src/ply.c @@ -92,22 +92,99 @@ void ply_free_elements(PlyElement* elements_head) { PlyMappings default_ply_mappings = { .vertex_element = "vertex", - .x = "x", - .y = "y", - .z = "z", - .nx = "nx", - .ny = "ny", - .nz = "nz", - .r = "red", - .g = "green", - .b = "blue", - .a = "alpha", - .u = "s", - .v = "t", + .position = {"x", "y", "z"}, + .normal = {"nx", "ny", "nz"}, + .colour = {"red", "green", "blue", "alpha"}, + .texture = {"s", "t"}, .face_element = "face", .index = "vetex_indices", }; +uint16_t ply_conv_index(PlyPropertyType type, void* value, int swap_order) { + if(type == PLY_TYPE_INVALID) { + return 0.0f; + } + + uint8_t* ptr = value; + uint8_t tmp[8]; + size_t type_size = ply_type_sizes[type]; + for(uint32_t i = 0; i < type_size; i++) { + if(swap_order) { + tmp[type_size-i] = ptr[i]; + } else { + tmp[i] = ptr[i]; + } + } + + switch(type) { + case PLY_TYPE_CHAR: + return (uint16_t)*(int8_t*)(tmp); + case PLY_TYPE_UCHAR: + return (uint16_t)*(uint8_t*)(tmp); + case PLY_TYPE_SHORT: + return *(int16_t*)(tmp); + case PLY_TYPE_USHORT: + return (uint16_t)*(uint16_t*)(tmp); + case PLY_TYPE_INT: + return (uint16_t)*(int32_t*)(tmp); + case PLY_TYPE_UINT: + return (uint16_t)*(uint32_t*)(tmp); + default: + return 0.0f; + } +} + +float ply_conv_value(PlyPropertyType type, void* value, int swap_order) { + if(type == PLY_TYPE_INVALID) { + return 0.0f; + } + + uint8_t* ptr = value; + uint8_t tmp[8]; + size_t type_size = ply_type_sizes[type]; + for(uint32_t i = 0; i < type_size; i++) { + if(swap_order) { + tmp[type_size-i] = ptr[i]; + } else { + tmp[i] = ptr[i]; + } + } + + switch(type) { + case PLY_TYPE_CHAR: + return (float)*(int8_t*)(tmp)/(float)INT8_MAX; + case PLY_TYPE_UCHAR: + return (float)*(uint8_t*)(tmp)/(float)UINT8_MAX; + case PLY_TYPE_SHORT: + return (float)*(int16_t*)(tmp)/(float)INT16_MAX; + case PLY_TYPE_USHORT: + return (float)*(uint16_t*)(tmp)/(float)UINT16_MAX; + case PLY_TYPE_INT: + return (float)*(int32_t*)(tmp)/(float)INT32_MAX; + case PLY_TYPE_UINT: + return (float)*(uint32_t*)(tmp)/(float)UINT32_MAX; + case PLY_TYPE_FLOAT: + return *(float*)(tmp); + case PLY_TYPE_DOUBLE: + return *(float*)(tmp); + default: + return 0.0f; + } +} + +int ply_map_values(char* name, int stride, int count, PlyPropertyType type, int mapping_count, char** mapping, void* data, float* out) { + for(int i = 0; i < mapping_count; i++) { + if(strcmp(name, mapping[i]) == 0) { + for(int j = 0; j < count; j++) { + size_t type_size = ply_type_sizes[type]; + out[(stride*j)+i] = ply_conv_value(type, data + (type_size*j), 0); + } + return 1; + } + } + return 0; +} + PlyMesh ply_load_mesh(char* filename, PlyMappings mappings) { PlyMesh mesh = { .vertex_count = 0, @@ -263,12 +340,6 @@ PlyMesh ply_load_mesh(char* filename, PlyMappings mappings) { PlyElement* elem = elements_head; while(elem != NULL) { - if(strcmp(elem->name, mappings.vertex_element) == 0) { - - } else if(strcmp(elem->name, mappings.face_element) == 0) { - - } - PlyProperty* prop = elem->properties; while(prop != NULL) { if(prop->count == PLY_TYPE_INVALID) { @@ -313,6 +384,74 @@ PlyMesh ply_load_mesh(char* filename, PlyMappings mappings) { elem = elem->next; } + elem = elements_head; + while(elem != NULL) { + int type = -1; + if(strcmp(elem->name, mappings.vertex_element) == 0) { + type = 0; + mesh.position = malloc(sizeof(vec3)*elem->count); + mesh.colour = malloc(sizeof(vec4)*elem->count); + mesh.normal = malloc(sizeof(vec3)*elem->count); + mesh.uv = malloc(sizeof(vec2)*elem->count); + mesh.vertex_count = elem->count; + } else if(strcmp(elem->name, mappings.face_element) == 0) { + type = 1; + mesh.index_count = 3*elem->count; + mesh.index = malloc(3*elem->count*sizeof(uint16_t)); + } else { + continue; + } + + PlyProperty* prop = elem->properties; + while(prop != NULL) { + if(prop->count == PLY_TYPE_INVALID && type == 0) { + if(ply_map_values(prop->name, + 3, + elem->count, + prop->element, + sizeof(mappings.position)/sizeof(char*), + mappings.position, + prop->elements, + (float*)mesh.position)) { + } else if(ply_map_values(prop->name, + 4, + elem->count, + prop->element, + sizeof(mappings.colour)/sizeof(char*), + mappings.colour, + prop->elements, + (float*)mesh.colour)) { + } else if(ply_map_values(prop->name, + 3, + elem->count, + prop->element, + sizeof(mappings.normal)/sizeof(char*), + mappings.normal, + prop->elements, + (float*)mesh.normal)) { + } else if(ply_map_values(prop->name, + 2, + elem->count, + prop->element, + sizeof(mappings.texture)/sizeof(char*), + mappings.texture, + prop->elements, + (float*)mesh.uv)) { + } + } else if (prop->count != PLY_TYPE_INVALID && type == 1) { + for(int i = 0; i < elem->count; i++) { + int type_size = ply_type_sizes[prop->element]; + void ** lists = prop->elements; + mesh.index[i*3 + 0] = ply_conv_index(prop->element, lists[i] + (0*type_size), 0); + mesh.index[i*3 + 1] = ply_conv_index(prop->element, lists[i] + (1*type_size), 0); + mesh.index[i*3 + 2] = ply_conv_index(prop->element, lists[i] + (2*type_size), 0); + } + } + prop = prop->next; + } + elem = elem->next; + } + clean: ply_free_elements(elements_head); close: