8 static void display(void);
9 static void idle(void);
10 static void reshape(int x, int y);
11 static void keydown(unsigned char key, int x, int y);
12 static void keyup(unsigned char key, int x, int y);
13 static void skeydown(int key, int x, int y);
14 static void skeyup(int key, int x, int y);
15 static int translate_special(int skey);
16 static unsigned int next_pow2(unsigned int x);
17 static void set_fullscreen(int fs);
18 static void set_vsync(int vsync);
20 static unsigned int num_pressed;
21 static unsigned char keystate[256];
23 static unsigned long start_time;
24 static unsigned int modkeys;
26 static float win_aspect;
27 static unsigned int tex;
29 static int tex_xsz, tex_ysz;
30 static uint32_t convbuf[240 * 160];
37 static void (*glx_swap_interval_ext)();
38 static void (*glx_swap_interval_sgi)();
42 static PROC wgl_swap_interval_ext;
45 int main(int argc, char **argv)
47 glutInit(&argc, argv);
48 glutInitWindowSize(800, 600);
49 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
50 glutCreateWindow("GBAjam22 PC build");
52 glutDisplayFunc(display);
54 glutReshapeFunc(reshape);
55 glutKeyboardFunc(keydown);
56 glutKeyboardUpFunc(keyup);
57 glutSpecialFunc(skeydown);
58 glutSpecialUpFunc(skeyup);
60 glutSetCursor(GLUT_CURSOR_NONE);
62 glEnable(GL_TEXTURE_2D);
63 glEnable(GL_CULL_FACE);
66 xdpy = glXGetCurrentDisplay();
67 xwin = glXGetCurrentDrawable();
69 if(!(glx_swap_interval_ext = glXGetProcAddress((unsigned char*)"glXSwapIntervalEXT"))) {
70 glx_swap_interval_sgi = glXGetProcAddress((unsigned char*)"glXSwapIntervalSGI");
74 wgl_swap_interval_ext = wglGetProcAddress("wglSwapIntervalEXT");
77 glGenTextures(1, &tex);
78 glBindTexture(GL_TEXTURE_2D, tex);
80 tex_xsz = next_pow2(240);
81 tex_ysz = next_pow2(160);
82 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_xsz, tex_ysz, 0, GL_RGBA,
84 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
85 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
87 glMatrixMode(GL_TEXTURE);
89 glScalef(240.0f / tex_xsz, 160.0f / tex_ysz, 1);
95 void blit_frame(void *pixels, int vsync)
97 int i, npix = fb_width * fb_height;
98 uint32_t *dptr = convbuf;
99 uint16_t *sptr = pixels;
101 for(i=0; i<npix; i++) {
102 int r = UNPACK_R16(*sptr);
103 int g = UNPACK_G16(*sptr);
104 int b = UNPACK_B16(*sptr);
105 *dptr++ = PACK_RGB32(b, g, r);
109 glBindTexture(GL_TEXTURE_2D, tex);
110 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, fb_width, fb_height, GL_RGBA,
111 GL_UNSIGNED_BYTE, convbuf);
113 glMatrixMode(GL_MODELVIEW);
115 if(win_aspect >= 1.5f) {
116 glScalef(1.5f / win_aspect, 1, 1);
118 glScalef(1, win_aspect / 1.5f, 1);
121 glClear(GL_COLOR_BUFFER_BIT);
135 assert(glGetError() == GL_NO_ERROR);
138 int kb_isdown(int key)
145 return keystate[KB_LALT] + keystate[KB_RALT];
148 return keystate[KB_LCTRL] + keystate[KB_RCTRL];
154 return keystate[key];
157 static void display(void)
161 time_msec = get_msec();
165 static void idle(void)
170 static void reshape(int x, int y)
172 win_aspect = (float)x / (float)y;
173 glViewport(0, 0, x, y);
176 static void keydown(unsigned char key, int x, int y)
178 modkeys = glutGetModifiers();
180 if((key == '\n' || key == '\r') && (modkeys & GLUT_ACTIVE_ALT)) {
182 set_fullscreen(opt.fullscreen);
189 static void keyup(unsigned char key, int x, int y)
195 static void skeydown(int key, int x, int y)
197 key = translate_special(key);
202 static void skeyup(int key, int x, int y)
204 key = translate_special(key);
209 static int translate_special(int skey)
214 /* case GLUT_KEY_LEFT:
222 case GLUT_KEY_PAGE_UP:
224 case GLUT_KEY_PAGE_DOWN:
231 if(skey >= GLUT_KEY_F1 && skey <= GLUT_KEY_F12) {
232 return KB_F1 + skey - GLUT_KEY_F1;
239 static unsigned int next_pow2(unsigned int x)
250 static void set_fullscreen(int fs)
252 static int win_x, win_y;
256 win_x = glutGet(GLUT_WINDOW_WIDTH);
257 win_y = glutGet(GLUT_WINDOW_HEIGHT);
262 glutReshapeWindow(win_x, win_y);
269 static void set_vsync(int vsync)
271 vsync = vsync ? 1 : 0;
272 if(glx_swap_interval_ext) {
273 glx_swap_interval_ext(xdpy, xwin, vsync);
274 } else if(glx_swap_interval_sgi) {
275 glx_swap_interval_sgi(vsync);
280 static void set_vsync(int vsync)
282 if(wgl_swap_interval_ext) {
283 wgl_swap_interval_ext(vsync ? 1 : 0);