static void pinit(ModeInfo *mi) { gasketstruct *gp = &gasket[MI_SCREEN(mi)]; /* draw the gasket */ gp->gasket1 = glGenLists(1); gp->current_depth = 1; /* start out at level 1, not 0 */ glNewList(gp->gasket1, GL_COMPILE); compile_gasket(mi); glEndList(); }
static void draw(ModeInfo *mi) { Bool wireframe_p = MI_IS_WIREFRAME(mi); gasketstruct *gp = &gasket[MI_SCREEN(mi)]; static int tick = 0; static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0}; static float white[] = {1.0, 1.0, 1.0, 1.0}; static float color[] = {0.0, 0.0, 0.0, 1.0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (!wireframe_p) { glColor4fv (white); glLightfv(GL_LIGHT0, GL_POSITION, pos); color[0] = gp->colors[gp->ccolor].red * intens_factor; color[1] = gp->colors[gp->ccolor].green * intens_factor; color[2] = gp->colors[gp->ccolor].blue * intens_factor; gp->ccolor++; if (gp->ccolor >= gp->ncolors) gp->ccolor = 0; glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glPushMatrix(); { static int frame = 0; GLfloat x, y, z; # define SINOID(SCALE,SIZE) \ ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2) x = SINOID(0.0071, 8.0); y = SINOID(0.0053, 6.0); z = SINOID(0.0037, 15.0); frame++; glTranslatef(x, y, z); x = gp->rotx; y = gp->roty; z = gp->rotz; if (x < 0) x = 1 - (x + 1); if (y < 0) y = 1 - (y + 1); if (z < 0) z = 1 - (z + 1); glRotatef(x * 360, 1.0, 0.0, 0.0); glRotatef(y * 360, 0.0, 1.0, 0.0); glRotatef(z * 360, 0.0, 0.0, 1.0); } glScalef( 8.0, 8.0, 8.0 ); glCallList(gp->gasket1); glPopMatrix(); if (tick++ >= speed) { tick = 0; if (gp->current_depth >= max_depth) gp->current_depth = -max_depth; gp->current_depth++; glDeleteLists (gp->gasket1, 1); glNewList (gp->gasket1, GL_COMPILE); compile_gasket (mi); glEndList(); } }
static void draw(ModeInfo *mi) { Bool wireframe_p = MI_IS_WIREFRAME(mi); gasketstruct *gp = &gasket[MI_SCREEN(mi)]; static const GLfloat pos[] = {-4.0, 3.0, 10.0, 1.0}; static const GLfloat white[] = {1.0, 1.0, 1.0, 1.0}; GLfloat color0[] = {0.0, 0.0, 0.0, 1.0}; GLfloat color1[] = {0.0, 0.0, 0.0, 1.0}; GLfloat color2[] = {0.0, 0.0, 0.0, 1.0}; GLfloat color3[] = {0.0, 0.0, 0.0, 1.0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (!wireframe_p) { glColor4fv (white); glLightfv(GL_LIGHT0, GL_POSITION, pos); color0[0] = gp->colors[gp->ccolor0].red / 65536.0; color0[1] = gp->colors[gp->ccolor0].green / 65536.0; color0[2] = gp->colors[gp->ccolor0].blue / 65536.0; color1[0] = gp->colors[gp->ccolor1].red / 65536.0; color1[1] = gp->colors[gp->ccolor1].green / 65536.0; color1[2] = gp->colors[gp->ccolor1].blue / 65536.0; color2[0] = gp->colors[gp->ccolor2].red / 65536.0; color2[1] = gp->colors[gp->ccolor2].green / 65536.0; color2[2] = gp->colors[gp->ccolor2].blue / 65536.0; color3[0] = gp->colors[gp->ccolor3].red / 65536.0; color3[1] = gp->colors[gp->ccolor3].green / 65536.0; color3[2] = gp->colors[gp->ccolor3].blue / 65536.0; gp->ccolor0++; gp->ccolor1++; gp->ccolor2++; gp->ccolor3++; if (gp->ccolor0 >= gp->ncolors) gp->ccolor0 = 0; if (gp->ccolor1 >= gp->ncolors) gp->ccolor1 = 0; if (gp->ccolor2 >= gp->ncolors) gp->ccolor2 = 0; if (gp->ccolor3 >= gp->ncolors) gp->ccolor3 = 0; glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glPushMatrix(); { double x, y, z; get_position (gp->rot, &x, &y, &z, !gp->button_down_p); glTranslatef((x - 0.5) * 10, (y - 0.5) * 10, (z - 0.5) * 20); gltrackball_rotate (gp->trackball); get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p); glRotatef (x * 360, 1.0, 0.0, 0.0); glRotatef (y * 360, 0.0, 1.0, 0.0); glRotatef (z * 360, 0.0, 0.0, 1.0); } glScalef( 8.0, 8.0, 8.0 ); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color0); glCallList(gp->gasket0); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1); glCallList(gp->gasket1); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2); glCallList(gp->gasket2); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color3); glCallList(gp->gasket3); glPopMatrix(); if (gp->tick++ >= speed) { gp->tick = 0; if (gp->current_depth >= max_depth) gp->current_depth = -max_depth; gp->current_depth++; /* We make four different lists so that each face of the tetrahedrons can have a different color (all triangles facing in the same direction have the same color, which is different from all triangles facing in other directions.) */ glDeleteLists (gp->gasket0, 1); glDeleteLists (gp->gasket1, 1); glDeleteLists (gp->gasket2, 1); glDeleteLists (gp->gasket3, 1); mi->polygon_count = 0; glNewList (gp->gasket0, GL_COMPILE); compile_gasket (mi, 0); glEndList(); glNewList (gp->gasket1, GL_COMPILE); compile_gasket (mi, 1); glEndList(); glNewList (gp->gasket2, GL_COMPILE); compile_gasket (mi, 2); glEndList(); glNewList (gp->gasket3, GL_COMPILE); compile_gasket (mi, 3); glEndList(); } }