going to sleep
[ld42_outofspace] / src / main.cc
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <stdarg.h>
5 #include <GL/freeglut.h>
6 #include "game.h"
7
8 #define KEYST_SZ        65536 / 32
9
10 void draw_text(float x, float y, float r, float g, float b, const char *fmt, ...);
11
12 static void display();
13 static void idle();
14 static void reshape(int x, int y);
15 static void keydown(unsigned char key, int x, int y);
16 static void keyup(unsigned char key, int x, int y);
17 static void skeydown(int key, int x, int y);
18 static void skeyup(int key, int x, int y);
19 static void mouse(int bn, int st, int x, int y);
20 static void motion(int x, int y);
21 static void wheel(int wheel, int dir, int x, int y);
22
23 static long prev_time;
24 static uint32_t keystate[KEYST_SZ];
25 static bool bnstate[16];
26 static unsigned int modkeys;
27
28 int main(int argc, char **argv)
29 {
30         glutInit(&argc, argv);
31         glutInitWindowSize(1024, 600);
32         glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_SRGB | GLUT_MULTISAMPLE);
33         glutCreateWindow("ludum dare 42");
34
35         glutDisplayFunc(display);
36         glutIdleFunc(idle);
37         glutReshapeFunc(reshape);
38         glutKeyboardFunc(keydown);
39         glutKeyboardUpFunc(keyup);
40         glutSpecialFunc(skeydown);
41         glutSpecialUpFunc(skeyup);
42         glutMouseFunc(mouse);
43         glutMotionFunc(motion);
44         glutPassiveMotionFunc(motion);
45         glutMouseWheelFunc(wheel);
46
47         if(!game_init()) {
48                 return 1;
49         }
50         atexit(game_cleanup);
51
52         prev_time = glutGet(GLUT_ELAPSED_TIME);
53
54         glutMainLoop();
55         return 0;
56 }
57
58 void game_quit()
59 {
60         exit(0);
61 }
62
63 bool game_keystate(int key)
64 {
65         int idx = key / 32;
66         int bit = key % 32;
67         return keystate[idx] & (1 << bit);
68 }
69
70 bool game_bnstate(int bn)
71 {
72         return bnstate[bn];
73 }
74
75 unsigned int game_modkeys()
76 {
77         return modkeys;
78 }
79
80 void draw_text(float x, float y, float r, float g, float b, const char *fmt, ...)
81 {
82         char buf[256], *text = buf;
83         va_list ap;
84
85         va_start(ap, fmt);
86         vsprintf(buf, fmt, ap);
87         va_end(ap);
88
89         glMatrixMode(GL_MODELVIEW);
90         glPushMatrix();
91         glLoadIdentity();
92         glMatrixMode(GL_PROJECTION);
93         glPushMatrix();
94         glLoadIdentity();
95         glOrtho(0, win_width, 0, win_height, -1, 1);
96
97         glDisable(GL_LIGHTING);
98
99         glRasterPos2f(1, 1);
100         glColor3f(r, g, b);
101         while(*text) {
102                 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *text++);
103         }
104
105         glEnable(GL_LIGHTING);
106
107         glPopMatrix();
108         glMatrixMode(GL_MODELVIEW);
109         glPopMatrix();
110 }
111
112 static void display()
113 {
114         frame_time = glutGet(GLUT_ELAPSED_TIME);
115         frame_dt = (frame_time - prev_time) / 1000.0f;
116
117         game_draw();
118
119
120         static long frames, fps, prev_fps_upd;
121         draw_text(1, 1, 1, 1, 0, "fps: %ld", fps);
122
123         if(frame_time - prev_fps_upd >= 1000) {
124                 fps = frames;
125                 frames = 0;
126                 prev_fps_upd = frame_time;
127         }
128         frames++;
129
130         glutSwapBuffers();
131 }
132
133 static void idle()
134 {
135         glutPostRedisplay();
136 }
137
138 static void reshape(int x, int y)
139 {
140         glViewport(0, 0, x, y);
141         win_width = x;
142         win_height = y;
143         win_aspect = (float)x / (float)y;
144
145         game_reshape(x, y);
146 }
147
148 static void keydown(unsigned char key, int x, int y)
149 {
150         modkeys = glutGetModifiers();
151         keystate[key / 32] |= (1 << (key % 32));
152         game_keyboard(key, true);
153 }
154
155 static void keyup(unsigned char key, int x, int y)
156 {
157         modkeys = glutGetModifiers();
158         keystate[key / 32] &= ~(1 << (key % 32));
159         game_keyboard(key, false);
160 }
161
162 static int conv_skey(int key)
163 {
164         if(key >= GLUT_KEY_F1 && key <= GLUT_KEY_F12) {
165                 return KEY_F1 + (key - GLUT_KEY_F1);
166         }
167
168         switch(key) {
169         case GLUT_KEY_LEFT:
170                 return KEY_LEFT;
171         case GLUT_KEY_UP:
172                 return KEY_UP;
173         case GLUT_KEY_RIGHT:
174                 return KEY_RIGHT;
175         case GLUT_KEY_DOWN:
176                 return KEY_DOWN;
177         case GLUT_KEY_PAGE_UP:
178                 return KEY_PGUP;
179         case GLUT_KEY_PAGE_DOWN:
180                 return KEY_PGDOWN;
181         case GLUT_KEY_HOME:
182                 return KEY_HOME;
183         case GLUT_KEY_END:
184                 return KEY_END;
185         case GLUT_KEY_INSERT:
186                 return KEY_INSERT;
187         default:
188                 break;
189         }
190
191         return 0;
192 }
193
194 static void skeydown(int key, int x, int y)
195 {
196         modkeys = glutGetModifiers();
197         keystate[key / 32] |= (1 << (key % 32));
198         game_keyboard(conv_skey(key), true);
199 }
200
201 static void skeyup(int key, int x, int y)
202 {
203         modkeys = glutGetModifiers();
204         keystate[key / 32] &= ~(1 << (key % 32));
205         game_keyboard(conv_skey(key), false);
206 }
207
208 static void mouse(int bn, int st, int x, int y)
209 {
210         int idx = bn - GLUT_LEFT_BUTTON;
211         bool pressed = st == GLUT_DOWN;
212
213         modkeys = glutGetModifiers();
214
215         if(idx == 3) {
216                 wheel(0, 1, x, y);
217                 return;
218         } else if(idx == 4) {
219                 wheel(0, -1, x, y);
220                 return;
221         }
222
223         if(idx < 16) {
224                 bnstate[idx] = pressed;
225         }
226         game_mbutton(idx, pressed, x, y);
227 }
228
229 static void motion(int x, int y)
230 {
231         game_mmotion(x, y);
232 }
233
234 static void wheel(int wheel, int dir, int x, int y)
235 {
236         game_mwheel(dir, x, y);
237 }