X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=censuslogo;a=blobdiff_plain;f=src%2Fmain.c;h=23b9878b30482fc8e63f6c4844b2ac6a8bbd6cb0;hp=125c2db1cda75cc8025cdc3f4d0f602318c9124a;hb=4fa7b4065b3c9630c638013f0fed7e2a36efd264;hpb=0dd87713321a351d6f14167c35ff6e3afcfe8ac4 diff --git a/src/main.c b/src/main.c index 125c2db..23b9878 100644 --- a/src/main.c +++ b/src/main.c @@ -1,32 +1,57 @@ #include #include +#include #include #include #include #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,16 +114,28 @@ 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, alpha; glClear(GL_COLOR_BUFFER_BIT); glLineWidth(5.0); - glColor3f(1, 1, 1); + anim = fmod(t / 6.0f, LOOPTIME); + alpha = 1.0f - ((anim - (LOOPTIME - 0.2)) / 0.2f); + if(alpha < 0.0f) alpha = 0.0f; + if(alpha > 1.0f) alpha = 1.0f; + + dt = (anim > 1.0f ? 1.0f : anim) / (float)(nverts - 1); + + glColor4f(1, 1, 1, alpha); for(i=0; i 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); + if(alpha < 1.0f) { + glBegin(GL_QUADS); + glColor4f(0, 0, 0, 1.0f - alpha); + glVertex2f(-1, -1); + glVertex2f(1, -1); + glVertex2f(1, 1); + glVertex2f(-1, 1); + glEnd(); + } + + 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 +194,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 +211,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