#define WINDOW_DEPTH_TEST 0x1 #define WINDOW_MULTISAMPLE 0x10 typedef struct { i32 width; i32 height; const char *name; u32 flags; } prge_window_t; typedef enum { key_state_release = 0, key_state_press = 1 } key_state_enum; typedef struct { key_state_enum last; key_state_enum state; } prge_key_t; typedef struct { v2 pos; v2 last; v2 offset; i32 first; i32 capture; prge_key_t left; prge_key_t right; } mouse_t; typedef struct { mouse_t mouse; prge_key_t move_right; prge_key_t move_forward; prge_key_t move_left; prge_key_t move_backward; prge_key_t move_up; prge_key_t move_down; prge_key_t jump; prge_key_t action_right; prge_key_t action_up; prge_key_t action_left; prge_key_t action_down; prge_key_t exit; f32 dt; } input_t; typedef enum { texture_type_r = 1, texture_type_rgb = 3, texture_type_rgba = 4 } texture_type_enum; typedef struct { u32 id; const char *name; texture_type_enum type; i32 width; i32 height; u8 *data; } texture_t; #define SHADER_POSITION_LOCATION 0 #define SHADER_NORMAL_LOCATION 1 #define SHADER_TEXCOORDS_LOCATION 2 #define SHADER_PROJECTION_MATRIX "projection" #define SHADER_VIEW_MATRIX "view" #define SHADER_MODEL_MATRIX "model" #define MAX_SHADER_LOG 512 typedef struct { u32 id; char log[MAX_SHADER_LOG]; } shader_t; typedef struct { v3 position; v3 normal; v2 texcoords; } vertex_t; #define DEFAULT_TRANSFORM (transform_t){V3_ZERO, V3_ZERO, V3_ONE} typedef struct { v3 position; v3 rotation; v3 scale; } transform_t; #define MAX_TEXTURE_PER_MESH 2 typedef struct { transform_t transform; i32 nvertices; vertex_t *vertices; i32 nindices; u32 *indices; i32 ntextures; texture_t textures[MAX_TEXTURE_PER_MESH]; u32 vao; u32 vbo; u32 ebo; } mesh_t; typedef struct { transform_t transform; i32 nmeshes; mesh_t *meshes; } model_t; #define BBOX_UNIT (bbox_t){{-0.5f, -0.5f, -0.5f}, {0.5f, 0.5f, 0.5f}} #define BBOX_ZERO (bbox_t){V3_ZERO, V3_ZERO} typedef struct { v3 start; v3 end; } bbox_t; #define ENTITY_COLLIDE (1) #define ENTITY_MOVE (1 << 1) #define ENTITY_ALPHA (1 << 2) typedef struct { u32 flags; model_t model; v3 position; v3 velocity; bbox_t bbox; } entity_t; #define MAX_ENTITIES 4 typedef struct enode_t { i32 id; entity_t entity; struct enode_t *next; struct enode_t *prev; } enode_t; typedef struct { i32 count; enode_t nodes[MAX_ENTITIES]; struct enode_t *first; struct enode_t *last; } elist_t; #define DEFAULT_CAMERA (camera_t){v3_ZERO, 90.0f, 0.1f, 1000.0f, V3_ZERO} typedef struct { v3 position; f32 fov; f32 near; f32 far; v3 angles; } camera_t; typedef struct { i32 channels; i32 freq; i32 bps; i32 size; unsigned char *data; const char *name; } sound_t; typedef struct sound_queue_node_t { sound_t *sound; struct sound_queue_node_t *next; struct sound_queue_node_t *prev; } sound_queue_node_t; typedef struct { i32 count; struct sound_queue_node_t *first; struct sound_queue_node_t *last; } sound_queue_t; #define ARENA_SIZE megabytes(64) #define FRAME_ARENA_SIZE megabytes(16) #define MAX_SOUNDS_LOADED 8 #define MAX_SOUNDS_PLAYING 4 typedef struct { i32 should_close; arena_t arena; arena_t frame_arena; input_t input; /* TODO(pryazha): Probably a bad idea to have only one window 🙃*/ prge_window_t window; sound_t sounds[MAX_SOUNDS_LOADED]; sound_queue_node_t sound_queue_nodes[MAX_SOUNDS_PLAYING]; sound_queue_t sound_queue; elist_t entities; const char *dir; } prge_context_t; typedef enum {ui_list, ui_stack} ui_layout_enum; typedef struct { prge_window_t window; input_t input; shader_t shader; rect_t rect; ui_layout_enum layout; v2 last; arena_t *arena; f32 padding; } ui_t;