aboutsummaryrefslogtreecommitdiff
path: root/src/types.h
blob: 5c1ba537a3c8c5cd2b94c2e1b9105ab651bd4146 (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
/*
 * types.h
 *
 * All the data types - avoid circular reference silliness
 *
 * (c) 2008 Thomas White <taw27@cam.ac.uk>
 *
 *  thrust3d - a silly game
 *
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifndef TYPES_H
#define TYPES_H

#include <gl.h>
#include <SDL.h>

/* Maximum number of individual textures */
#define MAX_TEXTURES 128

/* Maximum number of rooms which can be "seen" at once */
#define MAX_ROOMS 64

/* Maximum number of lights per room */
#define MAX_LIGHTS 4

typedef enum {
	ATTRIB_NONE	= 0,
	ATTRIB_COLOUR	= 1<<0,		/* Colour specified? */
	ATTRIB_PULSE	= 1<<1,		/* Pulsating colour */
} PrimitiveAttrib;

typedef struct {

	GLenum type;
	int num_vertices;
	GLfloat *vertices;
	GLfloat *normals;
	GLfloat *texcoords;
	
	PrimitiveAttrib attribs;
	GLfloat col_r;
	GLfloat col_g;
	GLfloat col_b;
	char *texture;
	
} Primitive;

typedef struct {

	char *name;		/* Identifier */
	
	int num_primitives;
	Primitive **primitives;	/* Geometry */
	
	PrimitiveAttrib attrib_total;
	
} Model;

typedef struct {
	int num_models;
	Model **models;
} ModelContext;

typedef enum {
	OBJ_NONE	= 0,
	OBJ_GRAVITY	= 1<<0,		/* Object is subject to gravity */
} ObjectAttrib;

typedef struct {
	
	Model *model;
	
	GLfloat x;
	GLfloat y;
	GLfloat z;

	ObjectAttrib attribs;
	GLfloat vx;
	GLfloat vy;
	GLfloat vz;
	
	float yaw;
	float yawspeed;
	
} ModelInstance;

typedef struct {
	char *name;
	GLuint *data;
	GLuint texname;
} Texture;

typedef struct {

	/* Lighting shaders */
	GLhandleARB	lighting_vert;
	GLhandleARB	lighting_frag;
	GLhandleARB	lighting_program;
	
	/* Textures */
	Texture		textures[MAX_TEXTURES];
	unsigned int	num_textures;
	
	int		frames;
	Uint32		t_fps;
	int		fps;
	
} RenderContext;

typedef struct {
	int rx;
	int ry;
	int rz;
} Connection;

typedef struct {
	GLfloat x;
	GLfloat y;
	GLfloat z;
} Light;

typedef struct {

	ModelInstance **objects;
	int num_objects;
	
	int rx;
	int ry;
	int rz;
	
	int needed_this_time;
	Connection connected[MAX_ROOMS];
	int num_connected;
	
	Light lights[MAX_LIGHTS];
	int num_lights;
	
} Room;

typedef struct {

	unsigned int thrusting;
	unsigned int turn_left;
	unsigned int turn_right;
	unsigned int forward;
	unsigned int reverse;
	
	Uint32 tlast;			/* Time at which the last physics step was performed */
	int frame_delay;		/* Delay between frames */
	int frame_delay_fiddled;	/* frame_delay has been fiddled since the last FPS calculation */
	
	ModelInstance *lander;
	
	ModelContext *models;
	RenderContext *render;
	
	int cur_room_x;
	int cur_room_y;
	int cur_room_z;
	
	Room *rooms[MAX_ROOMS];
	int num_rooms;
	
	float view_angle;
	float view_dist;
	int paused;
	int pause_rel;
	
} Game;

#endif	/* TYPES_H */