summaryrefslogblamecommitdiffstats
path: root/src/state.h
blob: 2f02a202665608044a240f5d72122ddd86f47029 (plain) (tree)
1
2
3
4
5
6
7
                     

                            
                               

                                    
 






                                          










                


             
                  

             


                      








                                          
 
                                    

             












                
            


              
                      

                  





                         

                    
                   
 




                          

                         




                                                                       
 






                                      
 
                                     


                                                                


                                      



                                                 
                                
 
                                          







                                         


                                                
 
                         







                                         

                             









                                    
 
           
                      
 

                                                  


                          
















                            
                      
 

                            












                    
 

                                  




                                         

                             

                                         
 
#include <SDL2/SDL.h>
#include <vulkan/vulkan.h>
#include <shaderc/shaderc.h>
#include <vulkan/vulkan_core.h>

#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;
}