dungeon_crawler

annotate prototype/src/main.cc @ 17:d98240a13793

lalala
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 20 Aug 2012 06:11:58 +0300
parents 91180ee7b7d9
children 5c41e6fcb300
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 }