--- /dev/null
+#include <stdlib.h>
+#include <assert.h>
+#include <GL/glut.h>
+#include "app.h"
+
+static void display(void);
+static void idle(void);
+static void reshape(int x, int y);
+static void keyb(unsigned char key, int x, int y);
+
+static long start_time;
+
+int main(int argc, char **argv)
+{
+ unsigned int flags = GLUT_RGB | GLUT_DOUBLE;
+
+ glutInit(&argc, argv);
+ if(app_parse_args(argc, argv) == -1) {
+ return 1;
+ }
+
+#ifdef MSAA
+ if(msaa) {
+ flags |= GLUT_MULTISAMPLE;
+ }
+#endif
+
+ glutInitWindowSize(1280, 800);
+ glutInitDisplayMode(flags);
+ glutCreateWindow("census");
+
+ if(fullscr) {
+ glutFullScreen();
+ glutSetCursor(GLUT_CURSOR_NONE);
+ }
+
+ glutDisplayFunc(display);
+ glutIdleFunc(idle);
+ glutReshapeFunc(reshape);
+ glutKeyboardFunc(keyb);
+
+ if(app_init() == -1) {
+ return 1;
+ }
+ start_time = glutGet(GLUT_ELAPSED_TIME);
+
+ glutMainLoop();
+ return 0;
+}
+
+static void display(void)
+{
+ msec = glutGet(GLUT_ELAPSED_TIME) - start_time;
+
+ app_display();
+
+ glutSwapBuffers();
+ assert(glGetError() == GL_NO_ERROR);
+}
+
+static void idle(void)
+{
+ glutPostRedisplay();
+}
+
+static void reshape(int x, int y)
+{
+ app_reshape(x, y);
+ win_width = x;
+ win_height = y;
+}
+
+static void keyb(unsigned char key, int x, int y)
+{
+ app_keyboard(key, 1);
+}
+
+void app_quit(void)
+{
+ exit(0);
+}
+
+static int saved_width = 1280, saved_height = 800;
+
+void app_fullscreen(void)
+{
+ saved_width = win_width;
+ saved_height = win_height;
+ glutFullScreen();
+ glutSetCursor(GLUT_CURSOR_NONE);
+}
+
+void app_windowed(void)
+{
+ glutReshapeWindow(saved_width, saved_height);
+ glutSetCursor(GLUT_CURSOR_INHERIT);
+}