| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -48,7 +48,7 @@ VkShaderModule load_shader_file(const char* path, VkDevice device) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return shader;
 | 
					 | 
					 | 
					 | 
					  return shader;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					VkResult create_ui_polygon_pipeline(VkDevice device, VkRenderPass render_pass, VkDescriptorSetLayout descriptor_layout, GraphicsPipeline* pipeline) {
 | 
					 | 
					 | 
					 | 
					VkResult create_ui_rect_pipeline(VkDevice device, VkRenderPass render_pass, VkDescriptorSetLayout descriptor_layout, GraphicsPipeline* pipeline) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  VkShaderModule vert_shader = load_shader_file("shader_src/ui_polygon.vert.spv", device);
 | 
					 | 
					 | 
					 | 
					  VkShaderModule vert_shader = load_shader_file("shader_src/ui_polygon.vert.spv", device);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  VkShaderModule frag_shader = load_shader_file("shader_src/ui_polygon.frag.spv", device);
 | 
					 | 
					 | 
					 | 
					  VkShaderModule frag_shader = load_shader_file("shader_src/ui_polygon.frag.spv", device);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  VkPipelineShaderStageCreateInfo shader_stages[] = {
 | 
					 | 
					 | 
					 | 
					  VkPipelineShaderStageCreateInfo shader_stages[] = {
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -74,7 +74,7 @@ VkResult create_ui_polygon_pipeline(VkDevice device, VkRenderPass render_pass, V
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    },
 | 
					 | 
					 | 
					 | 
					    },
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    {
 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .stride = sizeof(struct UIElement),
 | 
					 | 
					 | 
					 | 
					      .stride = sizeof(struct UIRect),
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .inputRate = VK_VERTEX_INPUT_RATE_INSTANCE,
 | 
					 | 
					 | 
					 | 
					      .inputRate = VK_VERTEX_INPUT_RATE_INSTANCE,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    },
 | 
					 | 
					 | 
					 | 
					    },
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  };
 | 
					 | 
					 | 
					 | 
					  };
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -90,19 +90,19 @@ VkResult create_ui_polygon_pipeline(VkDevice device, VkRenderPass render_pass, V
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .location = 1,
 | 
					 | 
					 | 
					 | 
					      .location = 1,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .format = VK_FORMAT_R32G32B32_SFLOAT,
 | 
					 | 
					 | 
					 | 
					      .format = VK_FORMAT_R32G32B32_SFLOAT,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .offset = offsetof(struct UIElement, pos),
 | 
					 | 
					 | 
					 | 
					      .offset = offsetof(struct UIRect, pos),
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    },
 | 
					 | 
					 | 
					 | 
					    },
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    {
 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .location = 2,
 | 
					 | 
					 | 
					 | 
					      .location = 2,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .format = VK_FORMAT_R32G32_SFLOAT,
 | 
					 | 
					 | 
					 | 
					      .format = VK_FORMAT_R32G32_SFLOAT,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .offset = offsetof(struct UIElement, size),
 | 
					 | 
					 | 
					 | 
					      .offset = offsetof(struct UIRect, size),
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    },
 | 
					 | 
					 | 
					 | 
					    },
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    {
 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
					 | 
					 | 
					 | 
					      .binding = 1,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .location = 3,
 | 
					 | 
					 | 
					 | 
					      .location = 3,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .format = VK_FORMAT_R32G32B32A32_SFLOAT,
 | 
					 | 
					 | 
					 | 
					      .format = VK_FORMAT_R32G32B32A32_SFLOAT,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      .offset = offsetof(struct UIElement, color),
 | 
					 | 
					 | 
					 | 
					      .offset = offsetof(struct UIRect, color),
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    },
 | 
					 | 
					 | 
					 | 
					    },
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  };
 | 
					 | 
					 | 
					 | 
					  };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -360,13 +360,8 @@ VkResult create_ui_descriptor_set(VkDevice device, VmaAllocator allocator, VkExt
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return VK_SUCCESS;
 | 
					 | 
					 | 
					 | 
					  return VK_SUCCESS;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					VkResult create_ui_polygon_buffer(VkDevice device, Queue transfer_queue, VkCommandPool transfer_pool, VmaAllocator allocator, struct UIPolygon* polygon, VmaAllocation* polygon_vertex_memory, VmaAllocation* polygon_index_memory) {
 | 
					 | 
					 | 
					 | 
					VkResult create_ui_rect_buffer(VkDevice device, Queue transfer_queue, VkCommandPool transfer_pool, VmaAllocator allocator, VkBuffer* vertex_buffer, VkBuffer* index_buffer, VmaAllocation* vertex_memory, VmaAllocation* index_memory) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // Create and populate polygon buffers 
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  polygon->indices = 6;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  polygon->vertices = 4;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  polygon->vertex_offset = 0;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  polygon->index_offset = 0;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  uint32_t vertex_buffer_size = 4 * sizeof(vec2);
 | 
					 | 
					 | 
					 | 
					  uint32_t vertex_buffer_size = 4 * sizeof(vec2);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  uint32_t index_buffer_size = 6 * sizeof(uint32_t);
 | 
					 | 
					 | 
					 | 
					  uint32_t index_buffer_size = 6 * sizeof(uint32_t);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -403,7 +398,7 @@ VkResult create_ui_polygon_buffer(VkDevice device, Queue transfer_queue, VkComma
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .size = vertex_buffer_size,
 | 
					 | 
					 | 
					 | 
					    .size = vertex_buffer_size,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  };
 | 
					 | 
					 | 
					 | 
					  };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  result = vmaCreateBuffer(allocator, &vertex_buffer_info, &allocation_info, &polygon->vertex_buffer, polygon_vertex_memory, NULL);
 | 
					 | 
					 | 
					 | 
					  result = vmaCreateBuffer(allocator, &vertex_buffer_info, &allocation_info, vertex_buffer, vertex_memory, NULL);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if(result != VK_SUCCESS) {
 | 
					 | 
					 | 
					 | 
					  if(result != VK_SUCCESS) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return result;
 | 
					 | 
					 | 
					 | 
					    return result;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -415,7 +410,7 @@ VkResult create_ui_polygon_buffer(VkDevice device, Queue transfer_queue, VkComma
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .size = index_buffer_size,
 | 
					 | 
					 | 
					 | 
					    .size = index_buffer_size,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  };
 | 
					 | 
					 | 
					 | 
					  };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  result = vmaCreateBuffer(allocator, &index_buffer_info, &allocation_info, &polygon->index_buffer, polygon_index_memory, NULL);
 | 
					 | 
					 | 
					 | 
					  result = vmaCreateBuffer(allocator, &index_buffer_info, &allocation_info, index_buffer, index_memory, NULL);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if(result != VK_SUCCESS) {
 | 
					 | 
					 | 
					 | 
					  if(result != VK_SUCCESS) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return result;
 | 
					 | 
					 | 
					 | 
					    return result;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -452,14 +447,14 @@ VkResult create_ui_polygon_buffer(VkDevice device, Queue transfer_queue, VkComma
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .dstOffset = 0,
 | 
					 | 
					 | 
					 | 
					    .dstOffset = 0,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .srcOffset = 0,
 | 
					 | 
					 | 
					 | 
					    .srcOffset = 0,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  };
 | 
					 | 
					 | 
					 | 
					  };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  vkCmdCopyBuffer(copy_buffer, temp_buffer, polygon->vertex_buffer, 1, &vertex_copy_region);
 | 
					 | 
					 | 
					 | 
					  vkCmdCopyBuffer(copy_buffer, temp_buffer, *vertex_buffer, 1, &vertex_copy_region);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  VkBufferCopy index_copy_region = {
 | 
					 | 
					 | 
					 | 
					  VkBufferCopy index_copy_region = {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .size = index_buffer_size,
 | 
					 | 
					 | 
					 | 
					    .size = index_buffer_size,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .dstOffset = 0,
 | 
					 | 
					 | 
					 | 
					    .dstOffset = 0,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    .srcOffset = vertex_buffer_size,
 | 
					 | 
					 | 
					 | 
					    .srcOffset = vertex_buffer_size,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  };
 | 
					 | 
					 | 
					 | 
					  };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  vkCmdCopyBuffer(copy_buffer, temp_buffer, polygon->index_buffer, 1, &index_copy_region);
 | 
					 | 
					 | 
					 | 
					  vkCmdCopyBuffer(copy_buffer, temp_buffer, *index_buffer, 1, &index_copy_region);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  result = command_end_single(device, copy_buffer, transfer_pool, transfer_queue);
 | 
					 | 
					 | 
					 | 
					  result = command_end_single(device, copy_buffer, transfer_pool, transfer_queue);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if(result != VK_SUCCESS) {
 | 
					 | 
					 | 
					 | 
					  if(result != VK_SUCCESS) {
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
 
 |