11 void reshape(int x, int y);
12 void keyb(unsigned char key, int x, int y);
14 void draw_bezier(float *cp, int sub);
16 int main(int argc, char **argv)
18 glutInit(&argc, argv);
19 glutInitWindowSize(800, 600);
20 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
21 glutCreateWindow("census");
23 glutDisplayFunc(display);
24 glutReshapeFunc(reshape);
25 glutKeyboardFunc(keyb);
37 glEnable(GL_LINE_SMOOTH);
45 glClear(GL_COLOR_BUFFER_BIT);
48 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
52 nseg = LOGOCP_SIZE / 4;
53 for(i=0; i<nseg; i++) {
54 draw_bezier((float*)(logocp + i * 4), BEZ_SEG);
60 assert(glGetError() == GL_NO_ERROR);
63 void reshape(int x, int y)
65 float aspect = (float)x / (float)y;
67 glViewport(0, 0, x, y);
68 glMatrixMode(GL_PROJECTION);
70 glScalef(1.0f / aspect, 1.0f, 1.0f);
73 void keyb(unsigned char key, int x, int y)
81 #define LERP(a, b, t) ((a) + ((b) - (a)) * (t))
83 void draw_bezier(float *cp, int sub)
86 float cx[4], cy[4], mx[3], my[3], mmx[2], mmy[2], x, y;
91 cx[i] = cp[i * 2] / LOGO_W - 0.5f;
92 cy[i] = 0.5f - cp[i * 2 + 1] / LOGO_H;
95 glBegin(GL_LINE_STRIP);
96 for(i=0; i<BEZ_SEG; i++) {
97 float t = (float)i / (float)(BEZ_SEG - 1);
99 mx[0] = LERP(cx[0], cx[1], t);
100 my[0] = LERP(cy[0], cy[1], t);
102 mx[1] = LERP(cx[1], cx[2], t);
103 my[1] = LERP(cy[1], cy[2], t);
105 mx[2] = LERP(cx[2], cx[3], t);
106 my[2] = LERP(cy[2], cy[3], t);
108 mmx[0] = LERP(mx[0], mx[1], t);
109 mmy[0] = LERP(my[0], my[1], t);
111 mmx[1] = LERP(mx[1], mx[2], t);
112 mmy[1] = LERP(my[1], my[2], t);
114 x = LERP(mmx[0], mmx[1], t);
115 y = LERP(mmy[0], mmy[1], t);