X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fpc%2Fmain.c;fp=src%2Fpc%2Fmain.c;h=6d46e5fc9e1764946b414b323f0705a53e9d9e67;hb=39dec6b602af5f02cc5297c21da7207debff52b8;hp=0000000000000000000000000000000000000000;hpb=295b86a1a8efdfe4fb0d9dba6152eb956441603c;p=andemo diff --git a/src/pc/main.c b/src/pc/main.c new file mode 100644 index 0000000..6d46e5f --- /dev/null +++ b/src/pc/main.c @@ -0,0 +1,132 @@ +#include +#include +#include +#include "opengl.h" +#include "miniglut.h" +#include "demo.h" +#include "cfgopt.h" + +static void display(void); +static void keypress(unsigned char key, int x, int y); +static void skeypress(int key, int x, int y); +static void mouse(int bn, int st, int x, int y); +static int translate_key(int key); + +static int prev_xsz, prev_ysz; +static long start_time; + + +int main(int argc, char **argv) +{ + glutInit(&argc, argv); + + load_config("demo.cfg"); + if(parse_args(argc, argv) == -1) { + return 1; + } + + glutInitWindowSize(1280, 800); + glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); + glutCreateWindow("Mindlapse"); + + glutDisplayFunc(display); + glutIdleFunc(glutPostRedisplay); + glutReshapeFunc(demo_reshape); + glutKeyboardFunc(keypress); + glutSpecialFunc(skeypress); + glutMouseFunc(mouse); + glutMotionFunc(demo_motion); + + if(opt.fullscreen) { + prev_xsz = glutGet(GLUT_WINDOW_WIDTH); + prev_ysz = glutGet(GLUT_WINDOW_HEIGHT); + glutFullScreen(); + } + + if(demo_init() == -1) { + return 1; + } + atexit(demo_cleanup); + + start_time = glutGet(GLUT_ELAPSED_TIME); + glutMainLoop(); + return 0; +} + +void swap_buffers(void) +{ + glutSwapBuffers(); +} + +static void display(void) +{ + time_msec = glutGet(GLUT_ELAPSED_TIME) - start_time; + + demo_display(); + + glutSwapBuffers(); + assert(glGetError() == GL_NO_ERROR); +} + +static void keypress(unsigned char key, int x, int y) +{ + switch(key) { + case 27: + glutExit(); + break; + + case 'f': + case 'F': + opt.fullscreen ^= 1; + if(opt.fullscreen) { + prev_xsz = glutGet(GLUT_WINDOW_WIDTH); + prev_ysz = glutGet(GLUT_WINDOW_HEIGHT); + glutFullScreen(); + } else { + glutReshapeWindow(prev_xsz, prev_ysz); + } + break; + + default: + demo_keyboard(key, 1); + } +} + +static void skeypress(int key, int x, int y) +{ + if((key = translate_key(key))) { + demo_keyboard(key, 1); + } +} + +static void mouse(int bn, int st, int x, int y) +{ + int bidx = bn - GLUT_LEFT_BUTTON; + int press = st == GLUT_DOWN; + + demo_mouse(bidx, press, x, y); +} + +static int translate_key(int key) +{ + if(key >= GLUT_KEY_F1 && key <= GLUT_KEY_F12) { + return key - GLUT_KEY_F1 + KEY_F1; + } + switch(key) { + case GLUT_KEY_LEFT: + return KEY_LEFT; + case GLUT_KEY_RIGHT: + return KEY_RIGHT; + case GLUT_KEY_UP: + return KEY_UP; + case GLUT_KEY_DOWN: + return KEY_DOWN; + case GLUT_KEY_PAGE_UP: + return KEY_PGUP; + case GLUT_KEY_PAGE_DOWN: + return KEY_PGDOWN; + default: + break; + } + return 0; +}