windows build
[censuslogo] / src / main.c
index 125c2db..0807e5d 100644 (file)
@@ -1,32 +1,57 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <math.h>
 #include <assert.h>
 #include <GL/glut.h>
 #include "logo.h"
 
+#ifndef GL_MULTISAMPLE
+#define GL_MULTISAMPLE 0x809d
+#endif
+
 #define MSAA
 
 int init(void);
 void display(void);
+void idle(void);
 void reshape(int x, int y);
 void keyb(unsigned char key, int x, int y);
+int parse_args(int argc, char **argv);
+void print_usage(const char *argv0);
 
+int win_width, win_height;
 int nverts = 256;
+long start_time;
+int msaa = 1;
+int fullscr = 0;
+
 
 int main(int argc, char **argv)
 {
        unsigned int flags = GLUT_RGB | GLUT_DOUBLE;
+
+       glutInit(&argc, argv);
+       if(parse_args(argc, argv) == -1) {
+               return 1;
+       }
+
 #ifdef MSAA
-       flags |= GLUT_MULTISAMPLE;
+       if(msaa) {
+               flags |= GLUT_MULTISAMPLE;
+       }
 #endif
 
-       glutInit(&argc, argv);
-       glutInitWindowSize(800, 600);
+       glutInitWindowSize(1280, 800);
        glutInitDisplayMode(flags);
        glutCreateWindow("census");
 
+       if(fullscr) {
+               glutFullScreen();
+       }
+
        glutDisplayFunc(display);
+       glutIdleFunc(idle);
        glutReshapeFunc(reshape);
        glutKeyboardFunc(keyb);
 
@@ -45,9 +70,12 @@ int init(void)
        }
 
 #ifdef MSAA
-       glEnable(GL_MULTISAMPLE);
+       if(msaa) {
+               glEnable(GL_MULTISAMPLE);
+       }
 #endif
 
+       start_time = glutGet(GLUT_ELAPSED_TIME);
        return 0;
 }
 
@@ -86,15 +114,24 @@ static void draw_line(float x0, float y0, float x1, float y1, float rad)
        glEnd();
 }
 
+#define LOOPTIME       1.3f
+
 void display(void)
 {
        int i;
-       float a[2], b[2], dt = 1.0f / (float)(nverts - 1);
+       long msec = glutGet(GLUT_ELAPSED_TIME) - start_time;
+       float t = (float)msec / 1000.0f;
+       float a[2], b[2], dt;
+       float anim;
 
        glClear(GL_COLOR_BUFFER_BIT);
 
        glLineWidth(5.0);
 
+       anim = fmod(t / 6.0f, LOOPTIME);
+
+       dt = (anim > 1.0f ? 1.0f : anim) / (float)(nverts - 1);
+
        glColor3f(1, 1, 1);
        for(i=0; i<nverts-1; i++) {
                float t0 = (float)i * dt;
@@ -104,21 +141,37 @@ void display(void)
                draw_line(a[0], a[1], b[0], b[1], 0.02);
        }
 
-       eval_logo(a, 0);
-       eval_logo(b, 1);
-       draw_disc(a[0], a[1], 0.05, 18);
-       draw_disc(b[0], b[1], 0.05, 18);
+       if(anim > 0.0f) {
+               eval_logo(a, 0);
+               draw_disc(a[0], a[1], 0.05, 18);
+       }
+       if(anim >= 1.0f) {
+               eval_logo(b, 1);
+               draw_disc(b[0], b[1], 0.05, 18);
+       }
+
+       glEnable(GL_BLEND);
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-       glColor3f(0.8, 0, 0);
+       glColor4f(0.8, 0, 0, 2.0 * (anim - 1.0f) / (LOOPTIME - 1.0f));
        draw_disc(0, 0, 0.14, 24);
 
+       glDisable(GL_BLEND);
+
        glutSwapBuffers();
        assert(glGetError() == GL_NO_ERROR);
 }
 
+void idle(void)
+{
+       glutPostRedisplay();
+}
+
 void reshape(int x, int y)
 {
        float aspect = (float)x / (float)y;
+       win_width = x;
+       win_height = y;
 
        glViewport(0, 0, x, y);
        glMatrixMode(GL_PROJECTION);
@@ -128,6 +181,8 @@ void reshape(int x, int y)
 
 void keyb(unsigned char key, int x, int y)
 {
+       static int saved_width = 800, saved_height = 600;
+
        switch(key) {
        case 27:
                exit(0);
@@ -143,5 +198,50 @@ void keyb(unsigned char key, int x, int y)
                printf("nverts: %d\n", nverts);
                glutPostRedisplay();
                break;
+
+       case 'f':
+               fullscr = !fullscr;
+               if(fullscr) {
+                       saved_width = win_width;
+                       saved_height = win_height;
+                       glutFullScreen();
+               } else {
+                       glutReshapeWindow(saved_width, saved_height);
+               }
+               break;
+       }
+}
+
+int parse_args(int argc, char **argv)
+{
+       int i;
+
+       for(i=1; i<argc; i++) {
+               if(argv[i][0] == '-') {
+                       if(strcmp(argv[i], "-fs") == 0) {
+                               fullscr = 1;
+                       } else if(strcmp(argv[i], "-noaa") == 0) {
+                               msaa = 0;
+                       } else if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0) {
+                               print_usage(argv[0]);
+                               exit(0);
+                       } else {
+                               fprintf(stderr, "invalid option: %s\n", argv[i]);
+                               return -1;
+                       }
+               } else {
+                       fprintf(stderr, "unexpected argument: %s\n", argv[i]);
+                       return -1;
+               }
        }
+       return 0;
+}
+
+void print_usage(const char *argv0)
+{
+       printf("Usage: %s [options]\n", argv0);
+       printf("Options:\n");
+       printf(" -fs: fullscreen\n");
+       printf(" -noaa: disable anti-aliasing\n");
+       printf(" -h,-help: print usage and exit\n");
 }