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 |