1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
|
#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;
|