#include #include #include #include #define CGLM_FORCE_DEPTH_ZERO_TO_ONE #include "../lib/cglm/include/cglm/cglm.h" #pragma once #define MAX_FRAMES_IN_FLIGHT 2 typedef struct { vec3 pos; vec3 front; vec3 up; float yaw; float pitch; float lastX; float lastY; float fov; } camera3d; typedef struct { mat4 model; mat4 view; mat4 proj; vec2 resolution; float time; float dt; } UniformBufferObject; typedef struct { VkCommandBuffer vk_command_buffer; VkSemaphore image_available_semaphore; VkSemaphore render_finished_semaphore; VkFence in_flight_fence; VkBuffer vk_uniform_buffer; VkDeviceMemory vk_uniform_buffer_memory; void * vk_uniform_buffer_mapped; VkDescriptorSet vk_descriptor_set; } frame_data; typedef struct { float x; float y; } V2; typedef struct { float x; float y; float z; } V3; typedef struct { V3 pos; V3 normal; V2 texCoord; } Vertex; typedef struct state { camera3d camera; int window_w, window_h; int cell_w, cell_h; int grid_w, grid_h; int char_w, char_h; int char_x, char_y; int rotate; int mouse_pressed; int middle_click; UniformBufferObject ubo; float x; int zoom; SDL_Window *sdl_window; int sdl_window_resized; VkInstance vk_instance; VkDebugUtilsMessengerEXT vk_debug_messenger; PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebugUtilsMessengerEXT; PFN_vkDestroyDebugUtilsMessengerEXT pfnDestroyDebugUtilsMessengerEXT; VkPhysicalDevice vk_physical_device; VkDevice vk_device; VkQueue vk_graphics_queue; VkSurfaceKHR vk_surface; VkQueue vk_present_queue; VkSwapchainKHR vk_swap_chain; uint32_t vk_swap_chain_image_count; VkImage vk_swap_chain_images[5]; VkImageView vk_swap_chain_image_views[5]; // 5 for some reason VkFormat vk_swap_chain_image_format; VkExtent2D vk_swap_chain_extent; VkDescriptorSetLayout vk_descriptor_set_layout; VkPipelineLayout vk_pipeline_layout; VkPipeline vk_graphics_pipeline; VkCommandPool vk_command_pool; frame_data frames[MAX_FRAMES_IN_FLIGHT]; VkBuffer vk_vertex_buffer; VkDeviceMemory vk_vertex_buffer_memory; VkBuffer vk_index_buffer; VkDeviceMemory vk_index_buffer_memory; VkDescriptorPool vk_descriptor_pool; shaderc_compilation_result_t prev_vert_result; shaderc_compilation_result_t prev_frag_result; uint32_t vk_mip_levels; VkImage vk_texture_image; VkDeviceMemory vk_texture_image_memory; VkImageView vk_texture_image_view; VkSampler vk_texture_sampler; VkImage vk_depth_image; VkDeviceMemory vk_depth_image_memory; VkImageView vk_depth_image_view; VkPolygonMode polygon_mode; Vertex *vertices; size_t vertices_count; uint32_t * indices; size_t indices_count; VkBuffer vertexBuffer; VkDeviceMemory vertexBufferMemory; char model_path[1000]; } state_t; static void init_state(state_t *s) { strcpy(s->model_path, "assets/viking_room.obj"); s->camera.pos[0] = 2.0f; s->camera.pos[1] = 2.0f; s->camera.pos[2] = 2.0f; s->camera.front[0] = 0.0f; s->camera.front[1] = 0.0f; s->camera.front[2] = 0.0f; s->camera.up[0] = 0.0f; s->camera.up[1] = 0.0f; s->camera.up[2] = 1.0f; s->camera.yaw = 0.0f; s->camera.pitch = -90.0f; s->camera.lastX = 400.0f; s->camera.lastY = 300.0f; s->camera.fov = 45.0f; s->rotate = 0; s->mouse_pressed = 0; s->middle_click = 0; s->sdl_window_resized = 0; s->window_w = 800; s->window_h = 600; s->cell_w = 10; s->cell_h = 10; s->grid_w = 0; s->grid_h = 0; s->char_w = 0; s->char_h = 0; s->char_x = 0; s->char_y = 0; s->zoom = 10; s->x = 0.0f; glm_mat4_identity(s->ubo.model); s->sdl_window = NULL; s->vk_swap_chain_image_count = 0; s->vk_physical_device = VK_NULL_HANDLE; s->prev_vert_result = NULL; s->prev_frag_result = NULL; s->polygon_mode = VK_POLYGON_MODE_FILL; }