#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);
}
#ifdef MSAA
- glEnable(GL_MULTISAMPLE);
+ if(msaa) {
+ glEnable(GL_MULTISAMPLE);
+ }
#endif
+ start_time = glutGet(GLUT_ELAPSED_TIME);
return 0;
}
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;
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);
void keyb(unsigned char key, int x, int y)
{
+ static int saved_width = 800, saved_height = 600;
+
switch(key) {
case 27:
exit(0);
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");
}