conworlds

annotate src/glut/main_glut.cc @ 21:2da585428507

added both glut and sdl2 versions just for fun...
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 27 Aug 2014 04:16:22 +0300
parents src/glut/main.cc@782ff06817fb
children
rev   line source
nuclear@21 1 #ifdef USE_GLUT
nuclear@21 2
nuclear@2 3 #include <stdio.h>
nuclear@2 4 #include <stdlib.h>
nuclear@2 5 #include "opengl.h"
nuclear@21 6 #ifdef __APPLE__
nuclear@21 7 #include <GLUT/glut.h>
nuclear@21 8 #else
nuclear@21 9 #include <GL/glut.h>
nuclear@21 10 #endif
nuclear@2 11 #include "game.h"
nuclear@13 12 #include "gameopt.h"
nuclear@6 13 #include "vr/vr.h"
nuclear@2 14
nuclear@2 15 static bool init();
nuclear@2 16 static void cleanup();
nuclear@2 17
nuclear@21 18 static void display();
nuclear@21 19 static void idle();
nuclear@21 20 static void reshape(int x, int y);
nuclear@21 21 static void keyb(unsigned char key, int x, int y);
nuclear@21 22 static void keyb_up(unsigned char key, int x, int y);
nuclear@21 23 static void mouse(int bn, int st, int x, int y);
nuclear@21 24 static void motion(int x, int y);
nuclear@21 25 static void sball_motion(int x, int y, int z);
nuclear@21 26 static void sball_rotate(int x, int y, int z);
nuclear@21 27
nuclear@21 28 static bool fullscreen_pending;
nuclear@12 29
nuclear@2 30 int main(int argc, char **argv)
nuclear@2 31 {
nuclear@21 32 glutInitWindowSize(1024, 600);
nuclear@21 33 glutInit(&argc, argv);
nuclear@21 34
nuclear@13 35 if(!parse_args(argc, argv)) {
nuclear@13 36 return 1;
nuclear@13 37 }
nuclear@13 38
nuclear@21 39 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | (opt.stereo ? GLUT_STEREO : 0));
nuclear@21 40 glutCreateWindow("LD48 #30 - connected worlds");
nuclear@2 41
nuclear@21 42 glutDisplayFunc(display);
nuclear@21 43 glutIdleFunc(idle);
nuclear@21 44 glutReshapeFunc(reshape);
nuclear@21 45 glutKeyboardFunc(keyb);
nuclear@21 46 glutKeyboardUpFunc(keyb_up);
nuclear@21 47 glutMouseFunc(mouse);
nuclear@21 48 glutMotionFunc(motion);
nuclear@21 49 glutSpaceballMotionFunc(sball_motion);
nuclear@21 50 glutSpaceballRotateFunc(sball_rotate);
nuclear@2 51
nuclear@2 52 if(!init()) {
nuclear@2 53 return 1;
nuclear@2 54 }
nuclear@2 55 atexit(cleanup);
nuclear@2 56
nuclear@21 57 glutMainLoop();
nuclear@2 58 return 0;
nuclear@2 59 }
nuclear@2 60
nuclear@2 61 static bool init()
nuclear@2 62 {
nuclear@2 63 glewInit();
nuclear@2 64
nuclear@2 65 if(!game_init()) {
nuclear@2 66 return false;
nuclear@2 67 }
nuclear@7 68
nuclear@13 69 if(opt.vr) {
nuclear@13 70 int win_xsz = vr_get_opti(VR_OPT_DISPLAY_WIDTH);
nuclear@13 71 int win_ysz = vr_get_opti(VR_OPT_DISPLAY_HEIGHT);
nuclear@13 72 if(win_xsz && win_ysz) {
nuclear@21 73 glutReshapeWindow(win_xsz, win_ysz);
nuclear@13 74 }
nuclear@7 75 }
nuclear@2 76 return true;
nuclear@2 77 }
nuclear@2 78
nuclear@2 79 static void cleanup()
nuclear@2 80 {
nuclear@2 81 game_cleanup();
nuclear@2 82 }
nuclear@2 83
nuclear@21 84 static void display()
nuclear@21 85 {
nuclear@21 86 unsigned int msec = glutGet(GLUT_ELAPSED_TIME);
nuclear@21 87
nuclear@21 88 game_update(msec);
nuclear@21 89 game_render();
nuclear@21 90 }
nuclear@21 91
nuclear@21 92 static void idle()
nuclear@21 93 {
nuclear@21 94 if(fullscreen_pending) {
nuclear@21 95 glutFullScreen();
nuclear@21 96 }
nuclear@21 97
nuclear@21 98 glutPostRedisplay();
nuclear@21 99 }
nuclear@21 100
nuclear@21 101 static void reshape(int x, int y)
nuclear@21 102 {
nuclear@21 103 game_reshape(x, y);
nuclear@21 104 }
nuclear@21 105
nuclear@21 106 static void keyb(unsigned char key, int x, int y)
nuclear@2 107 {
nuclear@11 108 static bool fullscr;
nuclear@12 109 static int prev_xpos, prev_ypos;
nuclear@11 110 static int prev_xsz, prev_ysz;
nuclear@11 111
nuclear@21 112 switch(key) {
nuclear@21 113 case 'f':
nuclear@21 114 fullscr = !fullscr;
nuclear@21 115 if(fullscr) {
nuclear@21 116 int xoffs, yoffs;
nuclear@11 117
nuclear@21 118 prev_xpos = glutGet(GLUT_WINDOW_X);
nuclear@21 119 prev_ypos = glutGet(GLUT_WINDOW_Y);
nuclear@21 120 prev_xsz = glutGet(GLUT_WINDOW_WIDTH);
nuclear@21 121 prev_ysz = glutGet(GLUT_WINDOW_HEIGHT);
nuclear@11 122
nuclear@21 123 xoffs = vr_get_opti(VR_OPT_WIN_XOFFS);
nuclear@21 124 yoffs = vr_get_opti(VR_OPT_WIN_YOFFS);
nuclear@21 125 if(xoffs || yoffs) {
nuclear@21 126 printf("repositioning: %d,%d\n", xoffs, yoffs);
nuclear@21 127 glutPositionWindow(xoffs, yoffs);
nuclear@11 128 }
nuclear@21 129 fullscreen_pending = true;
nuclear@21 130 } else {
nuclear@21 131 fullscreen_pending = false;
nuclear@21 132 glutPositionWindow(prev_xpos, prev_ypos);
nuclear@21 133 glutReshapeWindow(prev_xsz, prev_ysz);
nuclear@11 134 }
nuclear@21 135 break;
nuclear@21 136 }
nuclear@21 137 game_keyboard(key, true);
nuclear@21 138 }
nuclear@17 139
nuclear@21 140 static void keyb_up(unsigned char key, int x, int y)
nuclear@21 141 {
nuclear@21 142 game_keyboard(key, false);
nuclear@21 143 }
nuclear@21 144
nuclear@21 145 static void mouse(int bn, int st, int x, int y)
nuclear@21 146 {
nuclear@21 147 switch(bn) {
nuclear@21 148 case GLUT_RIGHT_BUTTON + 1:
nuclear@21 149 if(st == GLUT_DOWN) {
nuclear@21 150 game_mwheel(1);
nuclear@21 151 }
nuclear@17 152 break;
nuclear@17 153
nuclear@21 154 case GLUT_RIGHT_BUTTON + 2:
nuclear@21 155 if(st == GLUT_DOWN) {
nuclear@21 156 game_mwheel(-1);
nuclear@21 157 }
nuclear@17 158 break;
nuclear@17 159
nuclear@17 160 default:
nuclear@21 161 game_mouse(bn - GLUT_LEFT_BUTTON, st == GLUT_DOWN, x, y);
nuclear@11 162 }
nuclear@2 163 }
nuclear@21 164
nuclear@21 165 static void motion(int x, int y)
nuclear@21 166 {
nuclear@21 167 game_motion(x, y);
nuclear@21 168 }
nuclear@21 169
nuclear@21 170 #define SBALL_MOVE_SCALE 0.00025
nuclear@21 171 #define SBALL_ROT_SCALE 0.01
nuclear@21 172
nuclear@21 173 static void sball_motion(int x, int y, int z)
nuclear@21 174 {
nuclear@21 175 game_6dof_move(x * SBALL_MOVE_SCALE, y * SBALL_MOVE_SCALE, z * SBALL_MOVE_SCALE);
nuclear@21 176 }
nuclear@21 177
nuclear@21 178 static void sball_rotate(int x, int y, int z)
nuclear@21 179 {
nuclear@21 180 game_6dof_rotate(x * SBALL_ROT_SCALE, y * SBALL_ROT_SCALE, z * SBALL_ROT_SCALE);
nuclear@21 181 }
nuclear@21 182
nuclear@21 183 #endif // USE_GLUT