Added MapIterator and started moving towards rendering objects by iterating through a list of mappings in the material to update descriptors

main
noah metz 2024-01-10 11:27:04 -07:00
parent 5222f35823
commit b16d7a1ebf
1 changed files with 94 additions and 28 deletions

@ -207,9 +207,74 @@ void map_destroy(Map map) {
free(map.bucket_usage); free(map.bucket_usage);
} }
#define ATTRIBUTE_ID_MESH 0x00000001 typedef struct MapIteratorStruct {
#define ATTRIBUTE_ID_MATERIAL 0x00000002 uint32_t count;
#define ATTRIBUTE_ID_DESCRIPTOR 0x00000003 uint32_t* keys;
void** vals;
} MapIterator;
MapIterator map_iterator_create(Map map) {
MapIterator iterator = {
.keys = 0,
.vals = 0,
.count = 0,
};
uint32_t count = 0;
for(uint32_t i = 0; i < map.buckets_count; i++) {
count += map.bucket_usage[i];
}
uint32_t* keys = malloc(sizeof(uint32_t)*count);
if(keys == 0) {
return iterator;
}
void** vals = malloc(sizeof(void*)*count);
if(vals == 0) {
free(keys);
return iterator;
}
uint32_t idx = 0;
for(uint32_t i = 0; i < map.buckets_count; i++) {
for(uint32_t j = 0; j < map.bucket_usage[i]; j++) {
keys[idx] = map.buckets[i][j].key;
vals[idx] = map.buckets[i][j].value;
idx += 1;
}
}
iterator.keys = keys;
iterator.vals = vals;
iterator.count = count;
return iterator;
}
void map_iterator_free(MapIterator iterator) {
if(iterator.count > 0) {
free(iterator.keys);
free(iterator.vals);
}
}
typedef struct PositionStruct {
vec4 position;
versor rotation;
} Position;
typedef struct AttributeMappingStruct {
uint32_t attribute_id; // Which attribute to map
uint32_t mapping_type; // What function to use to map it
uint32_t binding; // Which index to use in the ATTRIBUTE_ID_DESTRO
} AttributeMapping;
#define ATTRIBUTE_ID_MESH 0x00000001
#define ATTRIBUTE_ID_MATERIAL 0x00000002
#define ATTRIBUTE_ID_DESCRIPTORS 0x00000003
#define ATTRIBUTE_ID_DESCRIPTOR_SETS 0x00000004
#define ATTRIBUTE_ID_POSITION 0x00000005
typedef struct ObjectStruct { typedef struct ObjectStruct {
Map attributes; Map attributes;
@ -1751,7 +1816,7 @@ void command_draw_object(Material material, Object object, uint32_t frame_num, V
vkCmdBindIndexBuffer(command_buffer, mesh->index_buffer.buffer, 0, VK_INDEX_TYPE_UINT16); vkCmdBindIndexBuffer(command_buffer, mesh->index_buffer.buffer, 0, VK_INDEX_TYPE_UINT16);
if(material.mesh_set_layout != VK_NULL_HANDLE) { if(material.mesh_set_layout != VK_NULL_HANDLE) {
MaybeValue maybe_descriptors = map_lookup(object.attributes, ATTRIBUTE_ID_DESCRIPTOR); MaybeValue maybe_descriptors = map_lookup(object.attributes, ATTRIBUTE_ID_DESCRIPTOR_SETS);
if(maybe_descriptors.has_value == false) { if(maybe_descriptors.has_value == false) {
return; return;
} }
@ -1937,7 +2002,7 @@ Object create_object() {
return ret; return ret;
} }
Object create_renderable(Mesh* mesh, Material* material) { Object create_renderable(Mesh* mesh, Material* material, VkDescriptorSet* descriptor_sets) {
Object zero = { Object zero = {
.attributes = { .attributes = {
.buckets = 0, .buckets = 0,
@ -1965,6 +2030,12 @@ Object create_renderable(Mesh* mesh, Material* material) {
return zero; return zero;
} }
result = map_add(&attributes, ATTRIBUTE_ID_DESCRIPTOR_SETS, descriptor_sets);
if(result == false) {
map_destroy(attributes);
return zero;
}
Object ret = { Object ret = {
.attributes = attributes, .attributes = attributes,
}; };
@ -2576,7 +2647,7 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
context->triangle_mesh = triangle_mesh; context->triangle_mesh = triangle_mesh;
} }
Object triangle_object = create_renderable(&context->triangle_mesh, &context->simple_mesh_material); Object triangle_object = create_renderable(&context->triangle_mesh, &context->simple_mesh_material, 0);
if(triangle_object.attributes.buckets == 0) { if(triangle_object.attributes.buckets == 0) {
fprintf(stderr, "failed to create renderable triangle object\n"); fprintf(stderr, "failed to create renderable triangle object\n");
return 0; return 0;
@ -2600,14 +2671,6 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
context->triangle_mesh_textured = triangle_mesh_textured; context->triangle_mesh_textured = triangle_mesh_textured;
} }
Object triangle_object_textured = create_renderable(&context->triangle_mesh_textured, &context->texture_mesh_material);
if(triangle_object_textured.attributes.buckets == 0) {
fprintf(stderr, "failed to create renderable textured triangle object\n");
return 0;
} else {
context->triangle_object_textured = triangle_object_textured;
}
VkDescriptorPoolSize TODO_sizes[] = { VkDescriptorPoolSize TODO_sizes[] = {
{ {
.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
@ -2658,9 +2721,12 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
return 0; return 0;
} }
bool add_result = map_add(&context->triangle_object_textured.attributes, ATTRIBUTE_ID_DESCRIPTOR, TODO_sets); Object triangle_object_textured = create_renderable(&context->triangle_mesh_textured, &context->texture_mesh_material, TODO_sets);
if(add_result == false) { if(triangle_object_textured.attributes.buckets == 0) {
fprintf(stderr, "failed to add texture to renderable triangle object\n"); fprintf(stderr, "failed to create renderable textured triangle object\n");
return 0;
} else {
context->triangle_object_textured = triangle_object_textured;
} }
VkExtent2D texture_size = { VkExtent2D texture_size = {
@ -2853,7 +2919,7 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod
vec3 world_position = {0.0f, 0.0f, 0.0f}; vec3 world_position = {0.0f, 0.0f, 0.0f};
versor world_rotation = {-1.0f, 0.0f, 0.0f, 0.0f}; versor world_rotation = {-1.0f, 0.0f, 0.0f, 0.0f};
VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_position, versor world_rotation, float aspect_ratio, float time_delta) { VkResult update_scene_descriptor(void** buffers, uint32_t frame_index, vec3 world_position, versor world_rotation, float aspect_ratio, float time_delta) {
vec3 movement_sum = {0.0f, 0.0f, 0.0f}; vec3 movement_sum = {0.0f, 0.0f, 0.0f};
if(key_flags.forward) { if(key_flags.forward) {
@ -2865,37 +2931,37 @@ VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_posit
} }
if(key_flags.left) { if(key_flags.left) {
movement_sum[0] -= 1 * time_delta; movement_sum[0] += 1 * time_delta;
} }
if(key_flags.right) { if(key_flags.right) {
movement_sum[0] += 1 * time_delta; movement_sum[0] -= 1 * time_delta;
} }
if(key_flags.up) { if(key_flags.up) {
movement_sum[1] -= 1 * time_delta; movement_sum[1] += 1 * time_delta;
} }
if(key_flags.down) { if(key_flags.down) {
movement_sum[1] += 1 * time_delta; movement_sum[1] -= 1 * time_delta;
} }
vec3 eular_rotation = {0.0f, 0.0f, 0.0f}; vec3 eular_rotation = {0.0f, 0.0f, 0.0f};
if(key_flags.turn_right) { if(key_flags.turn_right) {
eular_rotation[0] += 1 * time_delta; eular_rotation[0] -= 1 * time_delta;
} }
if(key_flags.turn_left) { if(key_flags.turn_left) {
eular_rotation[0] -= 1 * time_delta; eular_rotation[0] += 1 * time_delta;
} }
if(key_flags.turn_up) { if(key_flags.turn_up) {
eular_rotation[1] -= 1 * time_delta; eular_rotation[1] += 1 * time_delta;
} }
if(key_flags.turn_down) { if(key_flags.turn_down) {
eular_rotation[1] += 1 * time_delta; eular_rotation[1] -= 1 * time_delta;
} }
if(key_flags.roll_right) { if(key_flags.roll_right) {
@ -2932,7 +2998,7 @@ VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_posit
struct SceneUBO ubo = {}; struct SceneUBO ubo = {};
glm_perspective(90.0f, aspect_ratio, 0.1, 100, ubo.proj); glm_perspective(100.0f, aspect_ratio, 0.01, 100, ubo.proj);
glm_quat_look(world_position, world_rotation, ubo.view); glm_quat_look(world_position, world_rotation, ubo.view);
memcpy(buffers[frame_index], (void*)&ubo, sizeof(ubo)); memcpy(buffers[frame_index], (void*)&ubo, sizeof(ubo));
@ -2941,7 +3007,7 @@ VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_posit
} }
VkResult draw_frame(VulkanContext* context) { VkResult draw_frame(VulkanContext* context) {
update_scene_ubo(context->scene_ubo_ptrs, context->current_frame, world_position, world_rotation, (float)context->swapchain_extent.width/(float)context->swapchain_extent.height, 0.01); update_scene_descriptor(context->scene_ubo_ptrs, context->current_frame, world_position, world_rotation, (float)context->swapchain_extent.width/(float)context->swapchain_extent.height, 0.01);
VkResult result; VkResult result;
result = vkWaitForFences(context->device, 1, &context->in_flight_fences[context->current_frame], VK_TRUE, UINT64_MAX); result = vkWaitForFences(context->device, 1, &context->in_flight_fences[context->current_frame], VK_TRUE, UINT64_MAX);