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