rev |
line source |
nuclear@1
|
1 #include <stdio.h>
|
nuclear@1
|
2 #include <stdlib.h>
|
nuclear@1
|
3 #include <assert.h>
|
nuclear@7
|
4 #include <unistd.h>
|
nuclear@1
|
5 #include "opengl.h"
|
nuclear@1
|
6 #include "level.h"
|
nuclear@1
|
7 #include "camera.h"
|
nuclear@5
|
8 #include "datapath.h"
|
nuclear@5
|
9 #include "tileset.h"
|
nuclear@15
|
10 #include "renderer.h"
|
nuclear@1
|
11
|
nuclear@17
|
12 bool init(int xsz, int ysz);
|
nuclear@5
|
13 void cleanup();
|
nuclear@7
|
14 void idle();
|
nuclear@1
|
15 void disp();
|
nuclear@15
|
16 void draw();
|
nuclear@7
|
17 void update(unsigned long msec);
|
nuclear@1
|
18 void reshape(int x, int y);
|
nuclear@1
|
19 void keyb(unsigned char key, int x, int y);
|
nuclear@7
|
20 void key_release(unsigned char key, int x, int y);
|
nuclear@1
|
21 void mouse(int bn, int state, int x, int y);
|
nuclear@1
|
22 void motion(int x, int y);
|
nuclear@1
|
23
|
nuclear@5
|
24 static TileSet *tileset;
|
nuclear@1
|
25 static Level *level;
|
nuclear@7
|
26
|
nuclear@7
|
27 static FpsCamera cam;
|
nuclear@7
|
28 static bool keystate[256];
|
nuclear@1
|
29
|
nuclear@5
|
30 static const char *level_file = "0.level";
|
nuclear@5
|
31
|
nuclear@1
|
32 int main(int argc, char **argv)
|
nuclear@1
|
33 {
|
nuclear@17
|
34 int xsz, ysz;
|
nuclear@17
|
35
|
nuclear@1
|
36 glutInit(&argc, argv);
|
nuclear@5
|
37
|
nuclear@5
|
38 if(argc > 1) {
|
nuclear@5
|
39 level_file = argv[1];
|
nuclear@5
|
40 }
|
nuclear@5
|
41
|
nuclear@1
|
42 glutInitWindowSize(800, 600);
|
nuclear@1
|
43 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE);
|
nuclear@1
|
44 glutCreateWindow("prototype");
|
nuclear@17
|
45 xsz = glutGet(GLUT_WINDOW_WIDTH);
|
nuclear@17
|
46 ysz = glutGet(GLUT_WINDOW_HEIGHT);
|
nuclear@1
|
47
|
nuclear@7
|
48 glutIdleFunc(idle);
|
nuclear@1
|
49 glutDisplayFunc(disp);
|
nuclear@1
|
50 glutReshapeFunc(reshape);
|
nuclear@1
|
51 glutKeyboardFunc(keyb);
|
nuclear@7
|
52 glutKeyboardUpFunc(key_release);
|
nuclear@1
|
53 glutMouseFunc(mouse);
|
nuclear@1
|
54 glutMotionFunc(motion);
|
nuclear@1
|
55
|
nuclear@1
|
56 glewInit();
|
nuclear@1
|
57
|
nuclear@17
|
58 if(!init(xsz, ysz)) {
|
nuclear@5
|
59 return 1;
|
nuclear@5
|
60 }
|
nuclear@5
|
61
|
nuclear@5
|
62 glutMainLoop();
|
nuclear@5
|
63 }
|
nuclear@5
|
64
|
nuclear@17
|
65 bool init(int xsz, int ysz)
|
nuclear@5
|
66 {
|
nuclear@1
|
67 glEnable(GL_LIGHTING);
|
nuclear@1
|
68 glEnable(GL_LIGHT0);
|
nuclear@1
|
69 float ldir[] = {-1, 1, 2, 0};
|
nuclear@1
|
70 glLightfv(GL_LIGHT0, GL_POSITION, ldir);
|
nuclear@1
|
71 glEnable(GL_NORMALIZE);
|
nuclear@1
|
72
|
nuclear@1
|
73 glEnable(GL_DEPTH_TEST);
|
nuclear@1
|
74 glEnable(GL_CULL_FACE);
|
nuclear@1
|
75 glEnable(GL_MULTISAMPLE);
|
nuclear@1
|
76
|
nuclear@5
|
77 add_data_path("data");
|
nuclear@16
|
78 add_data_path("sdr");
|
nuclear@5
|
79
|
nuclear@17
|
80 if(!init_renderer(xsz, ysz)) {
|
nuclear@15
|
81 return false;
|
nuclear@15
|
82 }
|
nuclear@15
|
83
|
nuclear@5
|
84 // load a tileset
|
nuclear@5
|
85 tileset = new TileSet;
|
nuclear@5
|
86 if(!tileset->load(datafile_path("default.tileset"))) {
|
nuclear@5
|
87 return false;
|
nuclear@5
|
88 }
|
nuclear@5
|
89 set_active_tileset(tileset);
|
nuclear@5
|
90
|
nuclear@1
|
91 level = new Level;
|
nuclear@7
|
92 printf("loading level: %s\n", level_file);
|
nuclear@5
|
93 if(!level->load(datafile_path(level_file))) {
|
nuclear@5
|
94 return false;
|
nuclear@1
|
95 }
|
nuclear@1
|
96
|
nuclear@7
|
97 cam.input_move(0, 0.5, 0);
|
nuclear@7
|
98
|
nuclear@5
|
99 return true;
|
nuclear@1
|
100 }
|
nuclear@1
|
101
|
nuclear@15
|
102 void cleanup()
|
nuclear@15
|
103 {
|
nuclear@15
|
104 delete level;
|
nuclear@15
|
105 delete tileset;
|
nuclear@15
|
106
|
nuclear@15
|
107 destroy_renderer();
|
nuclear@15
|
108 }
|
nuclear@15
|
109
|
nuclear@7
|
110 void idle()
|
nuclear@7
|
111 {
|
nuclear@7
|
112 glutPostRedisplay();
|
nuclear@7
|
113 }
|
nuclear@7
|
114
|
nuclear@1
|
115 void disp()
|
nuclear@1
|
116 {
|
nuclear@7
|
117 update(glutGet(GLUT_ELAPSED_TIME));
|
nuclear@7
|
118
|
nuclear@1
|
119 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@1
|
120
|
nuclear@1
|
121 glMatrixMode(GL_MODELVIEW);
|
nuclear@1
|
122 glLoadIdentity();
|
nuclear@7
|
123 cam.use_inverse();
|
nuclear@1
|
124
|
nuclear@15
|
125 render_deferred(draw);
|
nuclear@1
|
126
|
nuclear@1
|
127 glutSwapBuffers();
|
nuclear@1
|
128 assert(glGetError() == GL_NO_ERROR);
|
nuclear@7
|
129
|
nuclear@7
|
130 usleep(10000);
|
nuclear@7
|
131 }
|
nuclear@7
|
132
|
nuclear@15
|
133 void draw()
|
nuclear@15
|
134 {
|
nuclear@15
|
135 level->draw();
|
nuclear@15
|
136 }
|
nuclear@15
|
137
|
nuclear@7
|
138 void update(unsigned long msec)
|
nuclear@7
|
139 {
|
nuclear@7
|
140 static unsigned long last_upd;
|
nuclear@7
|
141
|
nuclear@7
|
142 if(last_upd == 0) {
|
nuclear@7
|
143 last_upd = msec;
|
nuclear@7
|
144 }
|
nuclear@7
|
145 float dt = (float)(msec - last_upd) / 1000.0;
|
nuclear@7
|
146
|
nuclear@9
|
147 float offs = 2.5 * dt;
|
nuclear@7
|
148 float dx = 0, dy = 0;
|
nuclear@7
|
149
|
nuclear@7
|
150 // handle key input
|
nuclear@7
|
151 if(keystate['w'] || keystate['W']) {
|
nuclear@7
|
152 dy -= offs;
|
nuclear@7
|
153 }
|
nuclear@7
|
154 if(keystate['s'] || keystate['S']) {
|
nuclear@7
|
155 dy += offs;
|
nuclear@7
|
156 }
|
nuclear@7
|
157 if(keystate['d'] || keystate['D']) {
|
nuclear@7
|
158 dx += offs;
|
nuclear@7
|
159 }
|
nuclear@7
|
160 if(keystate['a'] || keystate['A']) {
|
nuclear@7
|
161 dx -= offs;
|
nuclear@7
|
162 }
|
nuclear@7
|
163
|
nuclear@7
|
164 cam.input_move(dx, 0, dy);
|
nuclear@7
|
165
|
nuclear@7
|
166 last_upd = msec;
|
nuclear@1
|
167 }
|
nuclear@1
|
168
|
nuclear@1
|
169 void reshape(int x, int y)
|
nuclear@1
|
170 {
|
nuclear@1
|
171 glViewport(0, 0, x, y);
|
nuclear@1
|
172 glMatrixMode(GL_PROJECTION);
|
nuclear@1
|
173 glLoadIdentity();
|
nuclear@7
|
174 gluPerspective(45.0, (float)x / (float)y, 0.25, 100.0);
|
nuclear@1
|
175 }
|
nuclear@1
|
176
|
nuclear@1
|
177 void keyb(unsigned char key, int x, int y)
|
nuclear@1
|
178 {
|
nuclear@1
|
179 switch(key) {
|
nuclear@1
|
180 case 27:
|
nuclear@1
|
181 exit(0);
|
nuclear@1
|
182 }
|
nuclear@7
|
183
|
nuclear@7
|
184 keystate[key] = true;
|
nuclear@7
|
185 }
|
nuclear@7
|
186
|
nuclear@7
|
187 void key_release(unsigned char key, int x, int y)
|
nuclear@7
|
188 {
|
nuclear@7
|
189 keystate[key] = false;
|
nuclear@1
|
190 }
|
nuclear@1
|
191
|
nuclear@1
|
192 static int prev_x, prev_y;
|
nuclear@1
|
193 static bool bnstate[32];
|
nuclear@1
|
194
|
nuclear@1
|
195 void mouse(int bn, int state, int x, int y)
|
nuclear@1
|
196 {
|
nuclear@1
|
197 prev_x = x;
|
nuclear@1
|
198 prev_y = y;
|
nuclear@1
|
199 bnstate[bn - GLUT_LEFT_BUTTON] = state == GLUT_DOWN;
|
nuclear@1
|
200 }
|
nuclear@1
|
201
|
nuclear@1
|
202 void motion(int x, int y)
|
nuclear@1
|
203 {
|
nuclear@1
|
204 int dx = x - prev_x;
|
nuclear@1
|
205 int dy = y - prev_y;
|
nuclear@1
|
206 prev_x = x;
|
nuclear@1
|
207 prev_y = y;
|
nuclear@1
|
208
|
nuclear@1
|
209 if(bnstate[0]) {
|
nuclear@7
|
210 cam.input_rotate(dy * 0.01, dx * 0.01, 0);
|
nuclear@1
|
211 glutPostRedisplay();
|
nuclear@1
|
212 }
|
nuclear@1
|
213 if(bnstate[2]) {
|
nuclear@1
|
214 cam.input_zoom(dy * 0.1);
|
nuclear@1
|
215 glutPostRedisplay();
|
nuclear@1
|
216 }
|
nuclear@1
|
217 }
|