ld33_umonster

annotate src/main.cc @ 0:4a6683050e29

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 22 Aug 2015 07:15:00 +0300
parents
children
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <stdlib.h>
nuclear@0 3 #include <assert.h>
nuclear@0 4 #ifdef __APPLE__
nuclear@0 5 #include <GLUT/glut.h>
nuclear@0 6 #else
nuclear@0 7 #include <GL/glut.h>
nuclear@0 8 #endif
nuclear@0 9 #include "game.h"
nuclear@0 10 #include "opt.h"
nuclear@0 11
nuclear@0 12 static void display();
nuclear@0 13 static void idle();
nuclear@0 14 static void reshape(int x, int y);
nuclear@0 15 static void keydown(unsigned char key, int x, int y);
nuclear@0 16 static void keyup(unsigned char key, int x, int y);
nuclear@0 17 static void mouse(int bn, int st, int x, int y);
nuclear@0 18 static void motion(int x, int y);
nuclear@0 19 static void update_modifiers();
nuclear@0 20
nuclear@0 21 static unsigned int start_time;
nuclear@0 22
nuclear@0 23 int main(int argc, char **argv)
nuclear@0 24 {
nuclear@0 25 glutInit(&argc, argv);
nuclear@0 26 if(!init_options(argc, argv)) {
nuclear@0 27 return 1;
nuclear@0 28 }
nuclear@0 29 glutInitWindowSize(opt.xres, opt.yres);
nuclear@0 30 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE);
nuclear@0 31 glutCreateWindow("umonster");
nuclear@0 32
nuclear@0 33 if(opt.fullscreen) {
nuclear@0 34 set_fullscreen(true);
nuclear@0 35 }
nuclear@0 36
nuclear@0 37 glutDisplayFunc(display);
nuclear@0 38 glutIdleFunc(idle);
nuclear@0 39 glutReshapeFunc(reshape);
nuclear@0 40 glutKeyboardFunc(keydown);
nuclear@0 41 glutKeyboardUpFunc(keyup);
nuclear@0 42 glutMouseFunc(mouse);
nuclear@0 43 glutMotionFunc(motion);
nuclear@0 44 glutPassiveMotionFunc(motion);
nuclear@0 45
nuclear@0 46 if(!game_init()) {
nuclear@0 47 return 1;
nuclear@0 48 }
nuclear@0 49 atexit(game_cleanup);
nuclear@0 50
nuclear@0 51 start_time = glutGet(GLUT_ELAPSED_TIME);
nuclear@0 52 glutMainLoop();
nuclear@0 53 return 0;
nuclear@0 54 }
nuclear@0 55
nuclear@0 56 void set_fullscreen(bool fs)
nuclear@0 57 {
nuclear@0 58 if(fs) {
nuclear@0 59 glutFullScreen();
nuclear@0 60 } else {
nuclear@0 61 glutReshapeWindow(opt.xres, opt.yres);
nuclear@0 62 }
nuclear@0 63 }
nuclear@0 64
nuclear@0 65 void redisplay()
nuclear@0 66 {
nuclear@0 67 glutPostRedisplay();
nuclear@0 68 }
nuclear@0 69
nuclear@0 70 void quit()
nuclear@0 71 {
nuclear@0 72 exit(0);
nuclear@0 73 }
nuclear@0 74
nuclear@0 75 void draw_teapot()
nuclear@0 76 {
nuclear@0 77 glFrontFace(GL_CW);
nuclear@0 78 glutSolidTeapot(1.0);
nuclear@0 79 glFrontFace(GL_CCW);
nuclear@0 80 }
nuclear@0 81
nuclear@0 82 static void display()
nuclear@0 83 {
nuclear@0 84 unsigned int msec = glutGet(GLUT_ELAPSED_TIME) - start_time;
nuclear@0 85 game_update(msec);
nuclear@0 86
nuclear@0 87 game_display();
nuclear@0 88
nuclear@0 89 glutSwapBuffers();
nuclear@0 90 assert(glGetError() == GL_NO_ERROR);
nuclear@0 91 }
nuclear@0 92
nuclear@0 93 static void idle()
nuclear@0 94 {
nuclear@0 95 glutPostRedisplay();
nuclear@0 96 }
nuclear@0 97
nuclear@0 98 static void reshape(int x, int y)
nuclear@0 99 {
nuclear@0 100 win_width = x;
nuclear@0 101 win_height = y;
nuclear@0 102 game_reshape(x, y);
nuclear@0 103 }
nuclear@0 104
nuclear@0 105 static void keydown(unsigned char key, int x, int y)
nuclear@0 106 {
nuclear@0 107 update_modifiers();
nuclear@0 108 game_keyboard(key, true);
nuclear@0 109 }
nuclear@0 110
nuclear@0 111 static void keyup(unsigned char key, int x, int y)
nuclear@0 112 {
nuclear@0 113 update_modifiers();
nuclear@0 114 game_keyboard(key, false);
nuclear@0 115 }
nuclear@0 116
nuclear@0 117 static void mouse(int bn, int st, int x, int y)
nuclear@0 118 {
nuclear@0 119 update_modifiers();
nuclear@0 120 game_mbutton(bn - GLUT_LEFT_BUTTON, st == GLUT_DOWN, x, y);
nuclear@0 121 }
nuclear@0 122
nuclear@0 123 static void motion(int x, int y)
nuclear@0 124 {
nuclear@0 125 game_mmotion(x, y);
nuclear@0 126 }
nuclear@0 127
nuclear@0 128 static void update_modifiers()
nuclear@0 129 {
nuclear@0 130 static unsigned int prev_mod;
nuclear@0 131 unsigned int mod = glutGetModifiers();
nuclear@0 132 unsigned int delta = mod ^ prev_mod;
nuclear@0 133
nuclear@0 134 if(delta & GLUT_ACTIVE_SHIFT) {
nuclear@0 135 bool press = (mod & GLUT_ACTIVE_SHIFT) != 0;
nuclear@0 136 game_modifier_key(MOD_SHIFT, press);
nuclear@0 137 }
nuclear@0 138 if(delta & GLUT_ACTIVE_CTRL) {
nuclear@0 139 bool press = (mod & GLUT_ACTIVE_CTRL) != 0;
nuclear@0 140 game_modifier_key(MOD_CTL, press);
nuclear@0 141 }
nuclear@0 142 if(delta & GLUT_ACTIVE_ALT) {
nuclear@0 143 bool press = (mod & GLUT_ACTIVE_ALT) != 0;
nuclear@0 144 game_modifier_key(MOD_ALT, press);
nuclear@0 145 }
nuclear@0 146
nuclear@0 147 prev_mod = mod;
nuclear@0 148 }