summaryrefslogtreecommitdiff
path: root/types.h
blob: 6fd5799216b3619fbd10f53cdebe641612927ed3 (plain)
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;