/* aya8.c - Don Yang (uguu.org) 10/07/06 */ #include #include #include #include #include #define z(u,n) gl ## n ## u typedef double x; typedef int _; x BUN[] = { .9, .98, 1, 0, -1 }, KA[] = { .32, .98, .36, .12, .54, .12, .58, .98, .9, .98, 1, 0, -1 }, CHOU[] = { .56, .99, .58, .7, .9, 0, -1 }, c, d, r, s, t, u, v, i, j, k, l, m, n; _ A, y, a, _w, w; unsigned char b[16384], *p; x X(x O) { return O * (rand() & 0x3fff) / 8191. - O; } Z() { struct timeval U; gettimeofday(&U, NULL); u = U.tv_sec + U.tv_usec / 1e6; } I() { Z(); srand(u); glDrawBuffer(GL_BACK); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, a = glutGet(GLUT_WINDOW_WIDTH), y = glutGet(GLUT_WINDOW_HEIGHT)); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if( a > y ) gluOrtho2D(-a / (x)y, a / (x)y, -1, 1); else gluOrtho2D(-1, 1, -y / (x)a, y / (x)a); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); s = (u - l) / 1.5; for(a = 0; a < 23; a++) { if( (j = s - a / 23.) >= 0 ) { r = j * 2.1; for(y = 0; y < 32; y++) { m = i + y * d / 16.; k = j * ((c + y * d / 16.) - m) + m; if( a & 1 ) k += d / 32; glPushMatrix(); glTranslated(r * cos(k) + n, r * sin(k) + t, 0); glCallList(w); glPopMatrix(); } } } if( s > 2.2 ) { l = u; c = i = X(d); if( !(rand() & 3) ) c += X(d / 3); n = X(.5); t = X(.5); } glutSwapBuffers(); glFlush(); } F() { Z(); glGenTextures(1, &_w); glBindTexture(GL_TEXTURE_2D, _w); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, b); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glNewList(w = glGenLists(1), GL_COMPILE); glBegin(GL_TRIANGLE_FAN); glTexCoord2d(0, 0); glVertex2d(-.07, -.07); glTexCoord2d(1, 0); glVertex2d( .07, -.07); glTexCoord2d(1, 1); glVertex2d( .07, .07); glTexCoord2d(0, 1); glVertex2d(-.07, .07); glEnd(); glEndList(); l = u; n = a = t = i = c; glutDisplayFunc(I); I(); } N() { glutPostRedisplay(); } M(_ Y, _ O) { N(); } f(unsigned char Z, _ U, _ N) { glFlush(); glDeleteLists(w, 1); glDeleteTextures(1, &_w); exit(0); } x o(x *q) { s = *q++; v = *q++; if( r > s ) { for(; (j = *q++) > s;) { k = *q++; if( r < j ) { v = (k - v) * (r - s) / (j - s) + v; break; } s = j; v = k; } } return 255 * v; } main(_ argc, char **argv) { glutInit(&argc, argv); d = atan2(c = 0, -1); for(a = 0; a < 16384; b[a++] = 0); p = b; for(a = 0; a < 64; a++) { m = a / 32. - 1; for(y = 0; y < 64; y++) { r = y / 32. - 1; r = sqrt(m * m + r * r); if( (A = o(BUN)) > 255 ) A = 255; *p++ = A; if( (A = o(KA)) > 255 ) A = 255; *p++ = A; *p++ = A; if( (A = o(CHOU)) > 255 ) A = 255; *p++ = A; } } glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutSetWindow(glutCreateWindow("Aya")); glutDisplayFunc(F); glutIdleFunc(N); glutReshapeFunc(M); glutKeyboardFunc(f); glutMainLoop(); }