X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=censuslogo;a=blobdiff_plain;f=src%2Fmain.c;h=0807e5d78c199cdc9637ed119c10d5b1f5a2c430;hp=06477c1d0f3817425e7d37ddbc959444513bd9b8;hb=6924537e1555c26ab714ca6eda4960a3ca1bd520;hpb=fc0cfd2c7c9f5efddddb21fc94a15cc42685ca1d diff --git a/src/main.c b/src/main.c index 06477c1..0807e5d 100644 --- a/src/main.c +++ b/src/main.c @@ -1,26 +1,57 @@ #include #include +#include +#include #include #include #include "logo.h" -#define BEZ_SEG 16 +#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; -void draw_bezier(float *cp, int sub); int main(int argc, char **argv) { + unsigned int flags = GLUT_RGB | GLUT_DOUBLE; + glutInit(&argc, argv); - glutInitWindowSize(800, 600); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); + if(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(); + } + glutDisplayFunc(display); + glutIdleFunc(idle); glutReshapeFunc(reshape); glutKeyboardFunc(keyb); @@ -34,35 +65,113 @@ int main(int argc, char **argv) int init(void) { - glEnable(GL_LINE_SMOOTH); + if(init_logo("data/census.curves") == -1) { + return -1; + } + +#ifdef MSAA + if(msaa) { + glEnable(GL_MULTISAMPLE); + } +#endif + + start_time = glutGet(GLUT_ELAPSED_TIME); return 0; } +static void draw_disc(float x, float y, float rad, int sub) +{ + int i; + glBegin(GL_TRIANGLE_FAN); + glVertex2f(x, y); + for(i=0; i 1.0f ? 1.0f : anim) / (float)(nverts - 1); glColor3f(1, 1, 1); - nseg = LOGOCP_SIZE / 4; - 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); + + 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); @@ -72,49 +181,67 @@ 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); + + case '-': + nverts -= 8; + printf("nverts: %d\n", nverts); + glutPostRedisplay(); + break; + + case '=': + nverts += 8; + 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; } } -#define LERP(a, b, t) ((a) + ((b) - (a)) * (t)) - -void draw_bezier(float *cp, int sub) +int parse_args(int argc, char **argv) { int i; - float cx[4], cy[4], mx[3], my[3], mmx[2], mmy[2], x, y; - if(sub < 1) sub = 1; - - for(i=0; i<4; i++) { - cx[i] = cp[i * 2] / LOGO_W - 0.5f; - cy[i] = 0.5f - cp[i * 2 + 1] / LOGO_H; + for(i=1; i