ENTRYPOINT void init_toasters (ModeInfo *mi) { toaster_configuration *bp; int wire = MI_IS_WIREFRAME(mi); int i; if (!bps) { bps = (toaster_configuration *) calloc (MI_NUM_SCREENS(mi), sizeof (toaster_configuration)); if (!bps) { fprintf(stderr, "%s: out of memory\n", progname); exit(1); } } bp = &bps[MI_SCREEN(mi)]; bp->glx_context = init_GL(mi); reshape_toasters (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); if (!wire) { GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0}; /* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0}; GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0}; GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0}; glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_AMBIENT, amb); glLightfv(GL_LIGHT0, GL_DIFFUSE, dif); glLightfv(GL_LIGHT0, GL_SPECULAR, spc); } if (!wire && do_texture) load_textures (mi); bp->user_trackball = gltrackball_init (); auto_track_init (mi); bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint)); for (i = 0; i < countof(all_objs); i++) bp->dlists[i] = glGenLists (1); for (i = 0; i < countof(all_objs); i++) { const struct gllist *gll = *all_objs[i]; glNewList (bp->dlists[i], GL_COMPILE); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glMatrixMode(GL_TEXTURE); glPushMatrix(); glMatrixMode(GL_MODELVIEW); glRotatef (-90, 1, 0, 0); glRotatef (180, 0, 0, 1); glScalef (6, 6, 6); glBindTexture (GL_TEXTURE_2D, 0); if (i == BASE_TOASTER) { GLfloat color[4] = {1.00, 1.00, 1.00, 1.00}; GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0}; GLfloat shiny = 20.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); if (do_texture) glBindTexture (GL_TEXTURE_2D, bp->chrome_texture); # ifndef HAVE_JWZGLES glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); # endif } else if (i == TOAST || i == TOAST_BITTEN) { GLfloat color[4] = {0.80, 0.80, 0.00, 1.0}; GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0}; GLfloat shiny = 0.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); if (do_texture) glBindTexture (GL_TEXTURE_2D, bp->toast_texture); # ifndef HAVE_JWZGLES glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); # endif glMatrixMode(GL_TEXTURE); glTranslatef(0.5, 0.5, 0); glMatrixMode(GL_MODELVIEW); } else if (i == SLOTS || i == HANDLE_SLOT) { GLfloat color[4] = {0.30, 0.30, 0.40, 1.0}; GLfloat spec[4] = {0.40, 0.40, 0.70, 1.0}; GLfloat shiny = 128.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); } else if (i == HANDLE) { GLfloat color[4] = {0.80, 0.10, 0.10, 1.0}; GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0}; GLfloat shiny = 20.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); } else if (i == KNOB) { GLfloat color[4] = {0.80, 0.10, 0.10, 1.0}; GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0}; GLfloat shiny = 0.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); } else if (i == JET || i == JET_WING) { GLfloat color[4] = {0.70, 0.70, 0.70, 1.0}; GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0}; GLfloat shiny = 20.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); } else if (i == BASE) { GLfloat color[4] = {0.50, 0.50, 0.50, 1.0}; GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0}; GLfloat shiny = 20.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); } else { GLfloat color[4] = {1.00, 1.00, 1.00, 1.00}; GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0}; GLfloat shiny = 128.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); } renderList (gll, wire); glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glEndList (); } bp->nfloaters = ntoasters + nslices; bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater)); for (i = 0; i < bp->nfloaters; i++) { floater *f = &bp->floaters[i]; /* arrange the list so that half the toasters are in front of bread, and half are behind. */ f->toaster_p = ((i < ntoasters / 2) || (i >= (nslices + (ntoasters / 2)))); reset_floater (mi, f); /* Position the first generation randomly, but make sure they aren't on screen yet (until we rotate the view into position.) */ { GLfloat min = -GRID_DEPTH/2; GLfloat max = GRID_DEPTH/3.5; f->z = frand (max - min) + min; } } }
ENTRYPOINT void init_matrix (ModeInfo *mi) { matrix_configuration *mp; int wire = MI_IS_WIREFRAME(mi); Bool flip_p = 0; int i; if (wire) do_texture = False; if (!mps) { mps = (matrix_configuration *) calloc (MI_NUM_SCREENS(mi), sizeof (matrix_configuration)); if (!mps) { fprintf(stderr, "%s: out of memory\n", progname); exit(1); } } mp = &mps[MI_SCREEN(mi)]; mp->glx_context = init_GL(mi); if (!mode_str || !*mode_str || !strcasecmp(mode_str, "matrix")) { flip_p = 1; mp->glyph_map = matrix_encoding; mp->nglyphs = countof(matrix_encoding); } else if (!strcasecmp (mode_str, "dna")) { flip_p = 0; mp->glyph_map = dna_encoding; mp->nglyphs = countof(dna_encoding); } else if (!strcasecmp (mode_str, "bin") || !strcasecmp (mode_str, "binary")) { flip_p = 0; mp->glyph_map = binary_encoding; mp->nglyphs = countof(binary_encoding); } else if (!strcasecmp (mode_str, "hex") || !strcasecmp (mode_str, "hexadecimal")) { flip_p = 0; mp->glyph_map = hex_encoding; mp->nglyphs = countof(hex_encoding); } else if (!strcasecmp (mode_str, "dec") || !strcasecmp (mode_str, "decimal")) { flip_p = 0; mp->glyph_map = decimal_encoding; mp->nglyphs = countof(decimal_encoding); } else { fprintf (stderr, "%s: `mode' must be matrix, dna, binary, or hex: not `%s'\n", progname, mode_str); exit (1); } reshape_matrix (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); glShadeModel(GL_SMOOTH); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glEnable(GL_NORMALIZE); if (do_texture) { load_textures (mi, flip_p); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); /* Jeff Epler points out: By using GL_ONE instead of GL_SRC_ONE_MINUS_ALPHA, glyphs are added to each other, so that a bright glyph with a darker one in front is a little brighter than the bright glyph alone. */ glBlendFunc (GL_SRC_ALPHA, GL_ONE); } /* to scale coverage-percent to strips, this number looks about right... */ mp->nstrips = (int) (density * 2.2); if (mp->nstrips < 1) mp->nstrips = 1; else if (mp->nstrips > 2000) mp->nstrips = 2000; mp->strips = calloc (mp->nstrips, sizeof(strip)); for (i = 0; i < mp->nstrips; i++) { strip *s = &mp->strips[i]; reset_strip (mi, s); /* If we start all strips from zero at once, then the first few seconds of the animation are much denser than normal. So instead, set all the initial strips to erase-mode with random starting positions. As these die off at random speeds and are re-created, we'll get a more consistent density. */ s->erasing_p = True; s->spinner_y = frand(GRID_SIZE); memset (s->glyphs, 0, sizeof(s->glyphs)); /* no visible glyphs */ } /* Compute the brightness ramp. */ for (i = 0; i < WAVE_SIZE; i++) { GLfloat j = ((WAVE_SIZE - i) / (GLfloat) (WAVE_SIZE - 1)); j *= (M_PI / 2); /* j ranges from 0.0 - PI/2 */ j = sin (j); /* j ranges from 0.0 - 1.0 */ j = 0.2 + (j * 0.8); /* j ranges from 0.2 - 1.0 */ mp->brightness_ramp[i] = j; /* printf("%2d %8.2f\n", i, j); */ } auto_track_init (mi); }