summaryrefslogtreecommitdiffstats
path: root/hacks/glx/flyingtoasters.c
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/glx/flyingtoasters.c')
-rw-r--r--hacks/glx/flyingtoasters.c905
1 files changed, 0 insertions, 905 deletions
diff --git a/hacks/glx/flyingtoasters.c b/hacks/glx/flyingtoasters.c
deleted file mode 100644
index d024ac9..0000000
--- a/hacks/glx/flyingtoasters.c
+++ /dev/null
@@ -1,905 +0,0 @@
-/* flyingtoasters, Copyright (c) 2003-2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Draws 3D flying toasters, and toast. Inspired by the ancient
- * Berkeley Systems / After Dark hack, but now updated to the wide
- * wonderful workd of OpenGL and 3D!
- *
- * Code by jwz; object models by Baconmonkey.
- *
- * The original After Dark flying toasters, with the fluffy white wings,
- * were a trademark of Berkeley Systems. Berkeley Systems ceased to exist
- * some time in 1998, having been gobbled up by Sierra Online, who were
- * subsequently gobbled up by Flipside and/or Vivendi (it's hard to tell
- * exactly what happened when.)
- *
- * I doubt anyone even cares any more, but if they do, hopefully this homage,
- * with the space-age 3D jet-plane toasters, will be considered different
- * enough that whoever still owns the trademark to the fluffy-winged 2D
- * bitmapped toasters won't get all huffy at us.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-/* #define DEBUG */
-
-# define release_toasters 0
-
-#define DEF_SPEED "1.0"
-#define DEF_NTOASTERS "20"
-#define DEF_NSLICES "25"
-#define DEF_TEXTURE "True"
-#define DEF_FOG "True"
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-#include "xlockmore.h"
-#include "gltrackball.h"
-#include "ximage-loader.h"
-#include <ctype.h>
-
-#define HAVE_TEXTURE
-#ifdef HAVE_TEXTURE
-# include "images/gen/chromesphere_png.h"
-# include "images/gen/toast_png.h"
-#endif /* HAVE_TEXTURE */
-
-
-#ifdef USE_GL /* whole file */
-
-#include "gllist.h"
-
-extern const struct gllist
- *toaster, *toaster_base, *toaster_handle, *toaster_handle2, *toaster_jet,
- *toaster_knob, *toaster_slots, *toaster_wing, *toast, *toast2;
-
-static const struct gllist * const *all_objs[] = {
- &toaster, &toaster_base, &toaster_handle, &toaster_handle2, &toaster_jet,
- &toaster_knob, &toaster_slots, &toaster_wing, &toast, &toast2
-};
-
-#define BASE_TOASTER 0
-#define BASE 1
-#define HANDLE 2
-#define HANDLE_SLOT 3
-#define JET 4
-#define KNOB 5
-#define SLOTS 6
-#define JET_WING 7
-#define TOAST 8
-#define TOAST_BITTEN 9
-
-#define GRID_SIZE 60
-#define GRID_DEPTH 500
-
-
-static const struct { GLfloat x, y; } nice_views[] = {
- { 0, 120 },
- { 0, -120 },
- { 12, 28 }, /* this is a list of viewer rotations that look nice. */
- { 12, -28 }, /* every now and then we switch to a new one. */
- {-10, -28 }, /* (but we only use the first two at start-up.) */
- { 40, -60 },
- {-40, -60 },
- { 40, 60 },
- {-40, 60 },
- { 30, 0 },
- {-30, 0 },
-};
-
-
-typedef struct {
- GLfloat x, y, z;
- GLfloat dx, dy, dz;
- Bool toaster_p;
- int toast_type; /* 0, 1 */
- GLfloat handle_pos; /* 0.0 - 1.0 */
- GLfloat knob_pos; /* degrees */
- int loaded; /* 2 bits */
-} floater;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *user_trackball;
- Bool button_down_p;
-
- int last_view, target_view;
- GLfloat view_x, view_y;
- int view_steps, view_tick;
- Bool auto_tracking_p;
- int track_tick;
-
- GLuint *dlists;
-
-# ifdef HAVE_TEXTURE
- GLuint chrome_texture;
- GLuint toast_texture;
-# endif
-
- int nfloaters;
- floater *floaters;
-
-} toaster_configuration;
-
-static toaster_configuration *bps = NULL;
-
-static GLfloat speed;
-static int ntoasters;
-static int nslices;
-static int do_texture;
-static int do_fog;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-ntoasters", ".ntoasters", XrmoptionSepArg, 0 },
- { "-nslices", ".nslices", XrmoptionSepArg, 0 },
- {"-texture", ".texture", XrmoptionNoArg, "True" },
- {"+texture", ".texture", XrmoptionNoArg, "False" },
- {"-fog", ".fog", XrmoptionNoArg, "True" },
- {"+fog", ".fog", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&ntoasters, "ntoasters", "Count", DEF_NTOASTERS, t_Int},
- {&nslices, "nslices", "Count", DEF_NSLICES, t_Int},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt toasters_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static void
-reset_floater (ModeInfo *mi, floater *f)
-{
-/* toaster_configuration *bp = &bps[MI_SCREEN(mi)]; */
-
- GLfloat n = GRID_SIZE/2.0;
- GLfloat n2 = GRID_DEPTH/2.0;
- GLfloat delta = GRID_SIZE * speed / 200.0;
-
- f->dx = 0;
- f->dy = 0;
- f->dz = delta;
-
- f->dz += BELLRAND(delta) - delta/3;
-
- if (! (random() % 5)) {
- f->dx += (BELLRAND(delta*2) - delta);
- f->dy += (BELLRAND(delta*2) - delta);
- }
-
- if (! (random() % 40)) f->dz *= 10; /* occasional speedy one */
-
- f->x = frand(n) - n/2;
- f->y = frand(n) - n/2;
- f->z = -n2 - frand(delta * 4);
-
- if (f->toaster_p)
- {
- f->loaded = 0;
- f->knob_pos = frand(180) - 90;
- f->handle_pos = ((random() & 1) ? 0.0 : 1.0);
-
- if (f->handle_pos > 0.8 && (! (random() % 5)))
- f->loaded = (random() & 3); /* let's toast! */
- }
- else
- {
- if (! (random() % 10))
- f->toast_type = 1; /* toast_bitten */
- }
-}
-
-
-static void
-tick_floater (ModeInfo *mi, floater *f)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
-
- GLfloat n1 = GRID_DEPTH/2.0;
- GLfloat n2 = GRID_SIZE*4;
-
- if (bp->button_down_p) return;
-
- f->x += f->dx;
- f->y += f->dy;
- f->z += f->dz;
-
- if (! (random() % 50000)) /* sudden gust of gravity */
- f->dy -= 2.8;
-
- if (f->x < -n2 || f->x > n2 ||
- f->y < -n2 || f->y > n2 ||
- f->z > n1)
- reset_floater (mi, f);
-}
-
-
-static void
-auto_track_init (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- bp->last_view = (random() % 2);
- bp->target_view = bp->last_view + 2;
- bp->view_x = nice_views[bp->last_view].x;
- bp->view_y = nice_views[bp->last_view].y;
- bp->view_steps = 100;
- bp->view_tick = 0;
- bp->auto_tracking_p = True;
-}
-
-
-static void
-auto_track (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (bp->button_down_p)
- return;
-
- /* if we're not moving, maybe start moving. Otherwise, do nothing. */
- if (! bp->auto_tracking_p)
- {
- if (++bp->track_tick < 200/speed) return;
- bp->track_tick = 0;
- if (! (random() % 5))
- bp->auto_tracking_p = True;
- else
- return;
- }
-
-
- {
- GLfloat ox = nice_views[bp->last_view].x;
- GLfloat oy = nice_views[bp->last_view].y;
- GLfloat tx = nice_views[bp->target_view].x;
- GLfloat ty = nice_views[bp->target_view].y;
-
- /* move from A to B with sinusoidal deltas, so that it doesn't jerk
- to a stop. */
- GLfloat th = sin ((M_PI / 2) * (double) bp->view_tick / bp->view_steps);
-
- bp->view_x = (ox + ((tx - ox) * th));
- bp->view_y = (oy + ((ty - oy) * th));
- bp->view_tick++;
-
- if (bp->view_tick >= bp->view_steps)
- {
- bp->view_tick = 0;
- bp->view_steps = (350.0 / speed);
- bp->last_view = bp->target_view;
- bp->target_view = (random() % (countof(nice_views) - 2)) + 2;
- bp->auto_tracking_p = False;
- }
- }
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_toasters (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (40.0, 1/h, 1.0, 250);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 2.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-toasters_handle_event (ModeInfo *mi, XEvent *event)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->user_trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-#ifdef HAVE_TEXTURE
-
-static void
-load_textures (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- XImage *xi;
-
- xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
- chromesphere_png, sizeof(chromesphere_png));
- clear_gl_error();
-
-#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
- glGenTextures (1, &bp->chrome_texture);
- glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- xi->width, xi->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
- check_gl_error("texture");
- XDestroyImage (xi);
- xi = 0;
-#endif
-
- xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
- toast_png, sizeof(toast_png));
-
- glGenTextures (1, &bp->toast_texture);
- glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- xi->width, xi->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
- check_gl_error("texture");
- XDestroyImage (xi);
- xi = 0;
-}
-
-#endif /* HAVE_TEXTURE */
-
-
-
-ENTRYPOINT void
-init_toasters (ModeInfo *mi)
-{
- toaster_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
-
- 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);
- }
-
-# ifdef HAVE_TEXTURE
- if (!wire && do_texture)
- load_textures (mi);
-# endif
-
- bp->user_trackball = gltrackball_init (False);
- 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);
- glDisable (GL_TEXTURE_2D);
-
- 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);
-#ifdef HAVE_TEXTURE
- if (do_texture)
- {
-#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
- glEnable (GL_TEXTURE_2D);
- glEnable (GL_TEXTURE_GEN_S);
- glEnable (GL_TEXTURE_GEN_T);
- glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
-#endif
- }
-# 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);
-#ifdef HAVE_TEXTURE
- if (do_texture)
- {
- glEnable (GL_TEXTURE_2D);
- glEnable (GL_TEXTURE_GEN_S);
- glEnable (GL_TEXTURE_GEN_T);
- glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
- 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;
- }
- }
-}
-
-
-static void
-draw_origin (ModeInfo *mi)
-{
-# ifdef DEBUG
-/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
-
- if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
-
- glPushMatrix();
- glScalef (5, 5, 5);
- glBegin(GL_LINES);
- glVertex3f(-1, 0, 0); glVertex3f(1, 0, 0);
- glVertex3f(0, -1, 0); glVertex3f(0, 1, 0);
- glVertex3f(0, 0, -1); glVertex3f(0, 0, 1);
- glEnd();
- glPopMatrix();
-
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
-# endif /* DEBUG */
-}
-
-
-static void
-draw_grid (ModeInfo *mi)
-{
-# ifdef DEBUG
-/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
-
- if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
- glPushMatrix();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, 0);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, 0);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glBegin(GL_LINES);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( 0, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( 0, -GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glPopMatrix();
-
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
-# endif /* DEBUG */
-}
-
-
-static void
-draw_floater (ModeInfo *mi, floater *f)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat n;
-
- glFrontFace(GL_CCW);
-
- glPushMatrix();
- glTranslatef (f->x, f->y, f->z);
- if (f->toaster_p)
- {
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
-
- glCallList (bp->dlists[BASE_TOASTER]);
- mi->polygon_count += (*all_objs[BASE_TOASTER])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(0, 1.01, 0);
- n = 0.91; glScalef(n,n,n);
- glCallList (bp->dlists[SLOTS]);
- mi->polygon_count += (*all_objs[SLOTS])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
- glTranslatef(0, -0.4, -2.38);
- n = 0.33; glScalef(n,n,n);
- glCallList (bp->dlists[HANDLE_SLOT]);
- mi->polygon_count += (*all_objs[HANDLE_SLOT])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(0, -1.1, 3);
- n = 0.3; glScalef (n,n,n);
- glTranslatef(0, f->handle_pos * 4.8, 0);
- glCallList (bp->dlists[HANDLE]);
- mi->polygon_count += (*all_objs[HANDLE])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
- glTranslatef(0, -1.1, -3); /* where the handle is */
- glTranslatef (1, -0.4, 0); /* down and to the left */
- n = 0.08; glScalef (n,n,n);
- glRotatef (f->knob_pos, 0, 0, 1);
- glCallList (bp->dlists[KNOB]);
- mi->polygon_count += (*all_objs[KNOB])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
- glTranslatef (0, -2.3, 0);
- glCallList (bp->dlists[BASE]);
- mi->polygon_count += (*all_objs[BASE])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(-4.8, 0, 0);
- glCallList (bp->dlists[JET_WING]);
- mi->polygon_count += (*all_objs[JET_WING])->points / 3;
- glScalef (0.5, 0.5, 0.5);
- glTranslatef (-2, -1, 0);
- glCallList (bp->dlists[JET]);
- mi->polygon_count += (*all_objs[JET])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(4.8, 0, 0);
- glScalef(-1, 1, 1);
- glFrontFace(GL_CW);
- glCallList (bp->dlists[JET_WING]);
- mi->polygon_count += (*all_objs[JET_WING])->points / 3;
- glScalef (0.5, 0.5, 0.5);
- glTranslatef (-2, -1, 0);
- glCallList (bp->dlists[JET]);
- mi->polygon_count += (*all_objs[JET])->points / 3;
- glFrontFace(GL_CCW);
- glPopMatrix();
-
- if (f->loaded)
- {
- glPushMatrix();
- glTranslatef(0, 1.01, 0);
- n = 0.91; glScalef(n,n,n);
- glRotatef (90, 0, 0, 1);
- glRotatef (90, 0, 1, 0);
- glTranslatef(0, 0, -0.95);
- glTranslatef(0, 0.72, 0);
- if (f->loaded & 1)
- {
- glCallList (bp->dlists[TOAST]);
- mi->polygon_count += (*all_objs[TOAST])->points / 3;
- }
- glTranslatef(0, -1.46, 0);
- if (f->loaded & 2)
- {
- glCallList (bp->dlists[TOAST]);
- mi->polygon_count += (*all_objs[TOAST])->points / 3;
- }
- glPopMatrix();
- }
- }
- else
- {
- glScalef (0.7, 0.7, 0.7);
- if (f->toast_type == 0)
- {
- glCallList (bp->dlists[TOAST]);
- mi->polygon_count += (*all_objs[TOAST])->points / 3;
- }
- else
- {
- glCallList (bp->dlists[TOAST_BITTEN]);
- mi->polygon_count += (*all_objs[TOAST_BITTEN])->points / 3;
- }
- }
-
- glPopMatrix();
-}
-
-
-
-ENTRYPOINT void
-draw_toasters (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
- glRotatef(current_device_rotation(), 0, 0, 1);
- glRotatef(bp->view_x, 1, 0, 0);
- glRotatef(bp->view_y, 0, 1, 0);
-
- /* Rotate the scene around a point that's a little deeper in. */
- glTranslatef (0, 0, -50);
- gltrackball_rotate (bp->user_trackball);
- glTranslatef (0, 0, 50);
-
-#if 0
- {
- floater F;
- F.toaster_p = 0;
- F.toast_type = 1;
- F.handle_pos = 0;
- F.knob_pos = -90;
- F.loaded = 3;
- F.x = F.y = F.z = 0;
- F.dx = F.dy = F.dz = 0;
-
- glScalef(2,2,2);
- if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
- glBegin(GL_LINES);
- glVertex3f(-10, 0, 0); glVertex3f(10, 0, 0);
- glVertex3f(0, -10, 0); glVertex3f(0, 10, 0);
- glVertex3f(0, 0, -10); glVertex3f(0, 0, 10);
- glEnd();
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
-
- draw_floater (mi, &F);
- glPopMatrix ();
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
- return;
- }
-#endif
-
- glScalef (0.5, 0.5, 0.5);
- draw_origin (mi);
- glTranslatef (0, 0, -GRID_DEPTH/2.5);
- draw_grid (mi);
-
- if (do_fog && !MI_IS_WIREFRAME(mi))
- {
- GLfloat fog_color[4] = { 0, 0, 0, 1 };
- glFogi (GL_FOG_MODE, GL_EXP2);
- glFogfv (GL_FOG_COLOR, fog_color);
- glFogf (GL_FOG_DENSITY, 0.0085);
- glEnable (GL_FOG);
- }
-
- mi->polygon_count = 0;
- for (i = 0; i < bp->nfloaters; i++)
- {
- floater *f = &bp->floaters[i];
- draw_floater (mi, f);
- tick_floater (mi, f);
- }
- auto_track (mi);
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_toasters (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
-
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (bp->floaters) free (bp->floaters);
- if (bp->user_trackball) gltrackball_free (bp->user_trackball);
- for (i = 0; i < countof(all_objs); i++)
- if (glIsList(bp->dlists[i])) glDeleteLists(bp->dlists[i], 1);
- if (bp->dlists) free (bp->dlists);
- if (bp->toast_texture) glDeleteTextures (1, &bp->toast_texture);
-# ifndef HAVE_JWZGLES
- if (bp->chrome_texture) glDeleteTextures (1, &bp->chrome_texture);
-# endif
-}
-
-XSCREENSAVER_MODULE_2 ("FlyingToasters", flyingtoasters, toasters)
-
-#endif /* USE_GL */