summaryrefslogtreecommitdiffstats
path: root/hacks/glx/blocktube.c
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/glx/blocktube.c')
-rw-r--r--hacks/glx/blocktube.c453
1 files changed, 0 insertions, 453 deletions
diff --git a/hacks/glx/blocktube.c b/hacks/glx/blocktube.c
deleted file mode 100644
index ca29d87..0000000
--- a/hacks/glx/blocktube.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/* blocktube, Copyright (c) 2003 Lars Damerow <lars@oddment.org>
- *
- * Based on Jamie Zawinski's original dangerball code.
- *
- * 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.
- */
-
-#define DEBUG 1
-
-#define DEFAULTS "*delay: 40000 \n" \
- "*wireframe: False \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_blocktube 0
-# define blocktube_handle_event xlockmore_no_events
-
-#include "xlockmore.h"
-#include "colors.h"
-#include <math.h>
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_HOLDTIME "1000"
-#define DEF_CHANGETIME "200"
-#define MAX_ENTITIES 1000
-#define DEF_TEXTURE "True"
-#define DEF_FOG "True"
-
-#if defined(USE_XPM) || defined(USE_XPMINC) || defined(STANDALONE)
-/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
-#include "ximage-loader.h"
-#define I_HAVE_XPM
-
-#include "images/gen/blocktube_png.h"
-#endif /* HAVE_XPM */
-
-typedef struct {
- int id, r, g, b;
- GLfloat tVal;
- int age;
- int lifetime;
- GLfloat position[3];
- GLfloat angle;
- GLfloat angularVelocity;
-} entity;
-
-typedef struct {
- GLXContext *glx_context;
- GLuint block_dlist;
- int nextID;
-
- entity entities[MAX_ENTITIES];
- float targetR, targetG, targetB,
- currentR, currentG, currentB,
- deltaR, deltaG, deltaB;
- int counter;
- int changing;
- GLfloat zoom;
- GLfloat tilt;
- GLuint envTexture;
- XImage *texti;
-
- GLfloat tunnelLength;
- GLfloat tunnelWidth;
- int polys;
-
-} blocktube_configuration;
-
-static blocktube_configuration *lps = NULL;
-
-static GLint holdtime;
-static GLint changetime;
-static int do_texture;
-static int do_fog;
-
-static XrmOptionDescRec opts[] = {
- { "-holdtime", ".holdtime", XrmoptionSepArg, 0 },
- { "-changetime", ".changetime", XrmoptionSepArg, 0 },
- {"-texture", ".texture", XrmoptionNoArg, "True" },
- {"+texture", ".texture", XrmoptionNoArg, "False" },
- {"-fog", ".fog", XrmoptionNoArg, "True" },
- {"+fog", ".fog", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&holdtime, "holdtime", "Hold Time", DEF_HOLDTIME, t_Int},
- {&changetime, "changetime", "Change Time", DEF_CHANGETIME, \
- t_Int},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
-};
-
-static OptionStruct desc[] = {
- {"-holdtime", "how long to stay on the same color"},
- {"-changetime", "how long it takes to fade to a new color"},
-};
-
-ENTRYPOINT ModeSpecOpt blocktube_opts = {countof(opts), opts, countof(vars), vars, desc};
-
-#ifdef USE_MODULES
-ModStruct blocktube_description =
- {"blocktube", "init_blocktube", "draw_blocktube", (char *)NULL,
- "draw_blocktube", "init_blocktube", "free_blocktube", &blocktube_opts,
- 40000, 30, 1, 1, 64, 1.0, "",
- "A shifting tunnel of reflective blocks", 0, NULL};
-#endif /* USE_MODULES */
-
-#if defined( I_HAVE_XPM )
-static Bool LoadGLTextures(ModeInfo *mi)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- Bool status;
-
- status = True;
- glGenTextures(1, &lp->envTexture);
- glBindTexture(GL_TEXTURE_2D, lp->envTexture);
- lp->texti = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
- blocktube_png, sizeof(blocktube_png));
- if (!lp->texti) {
- status = False;
- } else {
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lp->texti->width, lp->texti->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, lp->texti->data);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-# ifndef HAVE_JWZGLES /* #### Sphere maps unimplemented */
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
-# endif
- }
- return status;
-}
-#endif
-
-static void newTargetColor(blocktube_configuration *lp)
-{
- int luminance = 0;
-
- while (luminance <= 150) {
- lp->targetR = random() % 256;
- lp->targetG = random() % 256;
- lp->targetB = random() % 256;
- lp->deltaR = (lp->targetR - lp->currentR) / changetime;
- lp->deltaG = (lp->targetG - lp->currentG) / changetime;
- lp->deltaB = (lp->targetB - lp->currentB) / changetime;
- luminance = 0.3 * lp->targetR + 0.59 * lp->targetG + 0.11 * lp->targetB;
- }
-}
-
-static void randomize_entity (blocktube_configuration *lp, entity *ent)
-{
- ent->id = lp->nextID++;
- ent->tVal = 1 - ((float)random() / RAND_MAX / 1.5);
- ent->age = 0;
- ent->lifetime = 100;
- ent->angle = random() % 360;
- ent->angularVelocity = 0.5-((float)(random()) / RAND_MAX);
- ent->position[0] = (float)(random()) / RAND_MAX + lp->tunnelWidth;
- ent->position[1] = (float)(random()) / RAND_MAX * 2;
- ent->position[2] = -(float)(random()) / RAND_MAX * lp->tunnelLength;
-}
-
-static void entityTick(blocktube_configuration *lp, entity *ent)
-{
- ent->angle += ent->angularVelocity;
- ent->position[2] += 0.1;
- if (ent->position[2] > lp->zoom) {
- ent->position[2] = -lp->tunnelLength + ((float)(random()) / RAND_MAX) * 20;
- }
- ent->age += 0.1;
-}
-
-static void tick(blocktube_configuration *lp)
-{
- lp->counter--;
- if (!lp->counter) {
- if (!lp->changing) {
- newTargetColor(lp);
- lp->counter = changetime;
- } else {
- lp->counter = holdtime;
- }
- lp->changing = (!lp->changing);
- } else {
- if (lp->changing) {
- lp->currentR += lp->deltaR;
- lp->currentG += lp->deltaG;
- lp->currentB += lp->deltaB;
- }
- }
-}
-
-static int cube_vertices(float x, float y, float z, int wire);
-
-ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height);
-
-ENTRYPOINT void init_blocktube (ModeInfo *mi)
-{
- int loop;
- GLfloat fogColor[4] = {0,0,0,1};
- blocktube_configuration *lp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT(mi, lps);
-
- lp = &lps[MI_SCREEN(mi)];
- lp->glx_context = init_GL(mi);
-
- lp->zoom = 30;
- lp->tilt = 4.5;
- lp->tunnelLength = 200;
- lp->tunnelWidth = 5;
-
- if (wire) {
- do_fog = False;
- do_texture = False;
- glLineWidth(2);
- }
-
- lp->block_dlist = glGenLists (1);
- glNewList (lp->block_dlist, GL_COMPILE);
- lp->polys = cube_vertices(0.15, 1.2, 5.25, wire);
- glEndList ();
-
-#if defined( I_HAVE_XPM )
- if (do_texture) {
- if (!LoadGLTextures(mi)) {
- fprintf(stderr, "%s: can't load textures!\n", progname);
- exit(1);
- }
- glEnable(GL_TEXTURE_2D);
- }
-#endif
-
- /* kick on the fog machine */
- if (do_fog) {
- glEnable(GL_FOG);
- glFogi(GL_FOG_MODE, GL_LINEAR);
- glHint(GL_FOG_HINT, GL_NICEST);
- glFogf(GL_FOG_START, 0);
- glFogf(GL_FOG_END, lp->tunnelLength/1.8);
- glFogfv(GL_FOG_COLOR, fogColor);
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
- }
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glClearDepth(1.0f);
-
- if (!do_texture && !wire) {
- /* If there is no texture, the boxes don't show up without a light.
- Though I don't understand why all the blocks come out gray.
- */
- GLfloat pos[4] = {0.0, 1.0, 1.0, 0.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};
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- }
-
- lp->counter = holdtime;
- lp->currentR = random() % 256;
- lp->currentG = random() % 256;
- lp->currentB = random() % 256;
- newTargetColor(lp);
- for (loop = 0; loop < MAX_ENTITIES; loop++)
- {
- randomize_entity(lp, &lp->entities[loop]);
- }
- reshape_blocktube(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glFlush();
-}
-
-ENTRYPOINT void free_blocktube (ModeInfo *mi)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
-# if defined ( I_HAVE_XPM )
- if (!lp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *lp->glx_context);
- if (lp->envTexture) glDeleteTextures(1, &lp->envTexture);
- if (lp->texti) XDestroyImage(lp->texti);
- if (glIsList(lp->block_dlist)) glDeleteLists(lp->block_dlist, 1);
- if (lp->envTexture) glDeleteTextures (1, &lp->envTexture);
-
-# endif
-}
-
-ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *lp->glx_context);
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0, 1/h, 1.0, 100.0);
- glMatrixMode(GL_MODELVIEW);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-}
-
-static int cube_vertices(float x, float y, float z, int wire)
-{
- int polygon_count = 0;
- float x2, y2, z2, nv = 0.7;
- x2 = x/2;
- y2 = y/2;
- z2 = z/2;
-
- glFrontFace(GL_CW);
-
- glNormal3f(0, 0, nv);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, z2);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
- glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(0, 0, -nv);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(1.0, 0.0); glVertex3f(-x2, -y2, -z2);
- glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, -z2);
- glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, -z2);
- glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, -z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(0, nv, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, y2, -z2);
- glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
- glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(0, -nv, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(1.0, 1.0); glVertex3f(-x2, -y2, -z2);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
- glTexCoord2f(0.0, 0.0); glVertex3f( x2, -y2, z2);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
- polygon_count++;
- glEnd();
-
- if (wire) return polygon_count;
-
- glNormal3f(nv, 0, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
- glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
- glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, z2);
- glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(-nv, 0, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(0.0, 0.0); glVertex3f(-x2, -y2, -z2);
- glTexCoord2f(1.0, 0.0); glVertex3f(-x2, y2, -z2);
- glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
- polygon_count++;
- glEnd();
-
- return polygon_count;
-}
-
-static void draw_block(ModeInfo *mi, entity *ent)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- glCallList (lp->block_dlist);
- mi->polygon_count += lp->polys;
-}
-
-ENTRYPOINT void
-draw_blocktube (ModeInfo *mi)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- entity *cEnt = NULL;
- int loop = 0;
-
- if (!lp->glx_context)
- return;
-
- mi->polygon_count = 0;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *lp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (do_texture) {
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glBindTexture(GL_TEXTURE_2D, lp->envTexture);
- }
-
- for (loop = 0; loop < MAX_ENTITIES; loop++) {
- cEnt = &lp->entities[loop];
-
- glLoadIdentity();
- glTranslatef(0.0f, 0.0f, lp->zoom);
- glRotatef(lp->tilt, 1.0f, 0.0f, 0.0f);
- glRotatef(cEnt->angle, 0.0f, 0.0f, 1.0f);
- glTranslatef(cEnt->position[0], cEnt->position[1], cEnt->position[2]);
- glColor4ub((int)(lp->currentR * cEnt->tVal),
- (int)(lp->currentG * cEnt->tVal),
- (int)(lp->currentB * cEnt->tVal), 255);
- draw_block(mi, cEnt);
- entityTick(lp, cEnt);
- }
- tick(lp);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-}
-
-XSCREENSAVER_MODULE ("BlockTube", blocktube)
-
-#endif /* USE_GL */