summaryrefslogtreecommitdiffstats
path: root/hacks/glx/gravitywell.c
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/glx/gravitywell.c')
-rw-r--r--hacks/glx/gravitywell.c769
1 files changed, 0 insertions, 769 deletions
diff --git a/hacks/glx/gravitywell.c b/hacks/glx/gravitywell.c
deleted file mode 100644
index c41011a..0000000
--- a/hacks/glx/gravitywell.c
+++ /dev/null
@@ -1,769 +0,0 @@
-/* gravitywell, Copyright (c) 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.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 15 \n" \
- "*gridColor: #00FF00\n" \
- "*gridColor2: #FF0000\n" \
- "*showFPS: False \n" \
- "*wireframe: False \n"
-
-# define release_gw 0
-
-#define DEF_SPEED "1.0"
-#define DEF_RESOLUTION "1.0"
-#define DEF_GRID_SIZE "1.0"
-
-#include "xlockmore.h"
-#include "gltrackball.h"
-#include "colors.h"
-#include "hsv.h"
-
-#include <ctype.h>
-
-#define ASSERT(x)
-
-#ifdef USE_GL /* whole file */
-
-typedef struct {
- GLfloat mass;
- GLfloat ro2, rm2, ri2; /* outer/middle/inner */
- GLfloat ro, radius;
- GLfloat x, y, dx, dy;
- GLfloat surface_gravity, depth;
-} star;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *user_trackball;
- Bool button_down_p;
- int nstars;
- star *stars;
- int grid_w, grid_h;
- GLfloat *grid;
- char *segs;
- GLfloat *vtx, *col;
- GLfloat color[4];
- int ncolors;
- XColor *colors;
-} gw_configuration;
-
-static gw_configuration *bps = NULL;
-
-static GLfloat speed, resolution, grid_size;
-
-#define RESOLUTION_BASE 512
-#define GRID_SIZE_BASE 7
-#define SPEED_BASE 2.5
-#define MASS_EPSILON 0.03
-#define SLOPE_EPSILON 0.06
-#define GRID_SEG 16u /* Power-of-two here is faster. */
-#define MAX_MASS_COLOR 120
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-resolution", ".resolution", XrmoptionSepArg, 0 },
- { "-grid-size", ".gridSize", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Float},
- {&grid_size, "gridSize", "GridSize", DEF_GRID_SIZE, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt gw_opts = {
- countof(opts), opts, countof(vars), vars, NULL};
-
-
-#define MAX(a,b) ((a)>(b)?(a):(b))
-#define MIN(a,b) ((a)<(b)?(a):(b))
-#define WCLIP(x,hi) MIN(MAX((int)(x),0),(hi))
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_gw (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, width, height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (40, 1/h, 10, 1000);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0, 0, 30,
- 0, 0, 0,
- 0, 1, 0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-gw_handle_event (ModeInfo *mi, XEvent *event)
-{
- gw_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;
-}
-
-
-static void
-parse_color (ModeInfo *mi, char *key, GLfloat color[4])
-{
- XColor xcolor;
- char *string = get_string_resource (mi->dpy, key, "Color");
- if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
- {
- fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
- key, string);
- exit (1);
- }
- free (string);
-
- color[0] = xcolor.red / 65536.0;
- color[1] = xcolor.green / 65536.0;
- color[2] = xcolor.blue / 65536.0;
- color[3] = 1;
-}
-
-
-static void
-new_star (const gw_configuration *bp, star *s)
-{
- int w = bp->grid_w * GRID_SEG;
-
- s->radius = 2 * (2 + frand(3) + frand(3) + frand(3));
- s->mass = s->radius * 150 * (2 + frand(3) + frand(3) + frand(3));
-
- s->ro2 = s->mass / MASS_EPSILON;
- s->ro = sqrt (s->ro2);
- s->rm2 = pow (s->mass * (2.0f / SLOPE_EPSILON), 2.0f / 3.0f);
- s->ri2 = s->radius * s->radius;
- if (s->rm2 < s->ri2)
- s->rm2 = s->ri2;
- if (s->ro2 < s->rm2)
- s->ro2 = s->rm2;
-
- s->x = w * (s == bp->stars ? 0.5 : (0.35 + frand(0.3)));
- s->dx = ((frand(1.0) - 0.5) * 0.1) / resolution;
- s->dy = (0.1 + frand(0.6)) / resolution;
-
- /* What the experienced gravitation would be at the surface of the
- star, were the mass actually held in a singularity at its center.
- */
- s->surface_gravity = s->mass / s->ri2;
- s->depth = s->surface_gravity;
-}
-
-
-static void
-move_stars (ModeInfo *mi)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
- int w = bp->grid_w * GRID_SEG;
- int h = bp->grid_h * GRID_SEG;
- int i;
-
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- /* Move stars off screen until most of their influence fades */
- GLfloat off = speed * SPEED_BASE * resolution;
- s->x += s->dx * off;
- s->y += s->dy * off;
-
- if (s->x < -s->ro ||
- s->y < -s->ro ||
- s->x >= w + s->ro ||
- s->y >= h + s->ro)
- {
- new_star (bp, s);
- s->y = -s->ro;
- }
- }
-}
-
-
-static void
-calc_o (gw_configuration *bp, GLfloat mass, GLfloat cx, GLfloat y02,
- unsigned from, unsigned to)
-{
- GLfloat x0 = cx - from * GRID_SEG;
- GLfloat g0 = mass / (x0*x0 + y02);
- unsigned x;
-
- ASSERT (to <= bp->grid_w || to <= bp->grid_h);
-
- for (x = from; x < to; x++)
- {
- GLfloat *g = &bp->grid[x * GRID_SEG];
- GLfloat g1;
-
- x0 = cx - (x + 1) * GRID_SEG;
- g1 = mass / (x0*x0 + y02);
-
- g[0] += g0;
- if (bp->segs[x])
- {
- GLfloat d = (g1 - g0) / GRID_SEG;
- unsigned i;
- for(i = 1; i != GRID_SEG; i++)
- {
- g0 += d;
- g[i] += g0;
- }
- }
- g0 = g1;
- }
-}
-
-
-static void
-make_hires (gw_configuration *bp, unsigned from, unsigned to, unsigned w)
-{
- unsigned x;
-
- /* One bigger than from/to so that there's a good angle between the middle
- and inner zones.
-
- Don't make the last GRID_SEG high-res. This keeps the length consistent.
- */
- if (from)
- from--;
- from = MIN(from / GRID_SEG, w - 1);
- to = MIN(to / GRID_SEG + 1, w - 1);
-
- ASSERT (to <= bp->grid_w - 1 || to <= bp->grid_h - 1);
-
- for (x = from; x < to; x++)
- {
- if (! bp->segs[x])
- {
- GLfloat *g = &bp->grid[x * GRID_SEG];
- GLfloat g0 = g[0], g1 = g[GRID_SEG];
- GLfloat d = (g1 - g0) / GRID_SEG;
- unsigned i;
- for (i = 1; i != GRID_SEG; i++)
- {
- g0 += d;
- g[i] = g0;
- }
- bp->segs[x] = True;
- }
- }
-}
-
-
-static void
-calc_m (gw_configuration *bp, GLfloat mass, GLfloat cx, GLfloat y02,
- unsigned from, unsigned to)
-{
- GLfloat *gridp = bp->grid;
- unsigned x;
-
- ASSERT (to <= bp->grid_w * GRID_SEG + 1 || to <= bp->grid_h * GRID_SEG + 1);
-
- for (x = from; x < to; x++)
- {
- /* Inverse square of distance from mass as a point source */
- GLfloat x0 = cx - x;
- gridp[x] += mass / (x0*x0 + y02);
- }
-}
-
-
-#define EASE(r) (sin ((r) * M_PI_2))
-
-static void
-draw_row (ModeInfo *mi, int w, int y, Bool swap)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- int x;
- int polys;
- int w2 = w * GRID_SEG;
-
- GLfloat *vtx_x;
- GLfloat *vtx_y;
- GLfloat *gridp = bp->grid;
- memset (gridp, 0, w2 * sizeof(*gridp));
- memset (bp->segs, 0, w);
-
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- GLfloat cx, cy;
- unsigned olo, ohi, mlo, mhi, ilo, ihi;
- GLfloat mass, max;
- /* Move stars off screen until most of their influence fades */
- GLfloat ro, rm, ri;
-
- GLfloat y0;
- GLfloat y02;
-
- if (swap)
- {
- cy = s->x;
- cx = s->y;
- }
- else
- {
- cx = s->x;
- cy = s->y;
- }
- mass = s->mass;
- max = s->surface_gravity;
-
- y0 = cy - y;
- y02 = y0 * y0;
-
- if (y02 > s->ro2) continue;
-
- ro = sqrtf (s->ro2 - y02);
- olo = WCLIP((cx - ro) / GRID_SEG + 1, w); /* GLfloat -> int */
- ohi = WCLIP((cx + ro) / GRID_SEG + 1, w);
-
- rm = s->rm2 > y02 ? sqrtf (s->rm2 - y02) : 0;
- mlo = WCLIP((cx - rm) + 1, w2);
- mhi = WCLIP((cx + rm) + 1, w2);
-
- ASSERT (mlo <= mhi);
-
- if (mlo != mhi)
- {
- ri = s->ri2 > y02 ? sqrtf (s->ri2 - y02) : 0;
- ilo = WCLIP(cx - ri + 1, w2);
- ihi = WCLIP(cx + ri + 1, w2);
-
- mlo -= mlo % GRID_SEG;
- mhi += GRID_SEG - 1;
- mhi -= mhi % GRID_SEG;
-
- /* These go first. */
- make_hires (bp, mlo, ilo, w);
- make_hires (bp, ihi, mhi, w);
-
- calc_m (bp, mass, cx, y02, mlo, ilo);
- calc_m (bp, mass, cx, y02, ihi, mhi);
-
- /* This does a bit more work than it needs to. */
- for (x = ilo; x < ihi; x++)
- gridp[x] += max;
- }
-
- calc_o (bp, mass, cx, y02, olo, mlo / GRID_SEG);
- calc_o (bp, mass, cx, y02, mhi / GRID_SEG, ohi);
- }
-
- if (swap)
- {
- vtx_y = bp->vtx;
- vtx_x = bp->vtx + 1;
- }
- else
- {
- vtx_x = bp->vtx;
- vtx_y = bp->vtx + 1;
- }
-
-# define COLOR_CODE 0
-
-# if COLOR_CODE
- {
- unsigned grid_max = bp->grid_w > bp->grid_h ? bp->grid_w : bp->grid_h;
- GLfloat *color = malloc(sizeof(GLfloat) * 4 * (grid_max * GRID_SEG + 1));
- glEnableClientState (GL_COLOR_ARRAY);
- glColorPointer (4, GL_FLOAT, 0, color);
-# endif
-
- ASSERT (! bp->segs[w - 1]);
-
- polys = 0;
- for (x = 0; x != w; x++)
- {
- if (! bp->segs[x])
- {
- int ci;
- size_t vp = polys * 3;
- size_t cp = polys * 4;
-# if COLOR_CODE
- GLfloat slope = 0;
- if (x != 0)
- slope += fabs(gridp[x * GRID_SEG] - gridp[(x - 1) * GRID_SEG]);
- if (x != w - 1)
- slope += fabs(gridp[(x + 1) * GRID_SEG] - gridp[x * GRID_SEG]);
- slope = 1 - (slope / (SLOPE_EPSILON * 2));
-
- color[cp] = slope;
- color[cp + 1] = slope;
- color[cp + 2] = 1;
- color[cp + 3] = 1;
-# endif
- vtx_x[vp] = x * GRID_SEG;
- bp->vtx[vp + 2] = gridp[x * GRID_SEG];
- polys += 1;
-
- ci = EASE (bp->vtx[vp + 2] / MAX_MASS_COLOR) * bp->ncolors;
- if (ci < 0) ci = 0;
- if (ci >= bp->ncolors) ci = bp->ncolors - 1;
- bp->col[cp] = bp->colors[ci].red / 65536.0;
- bp->col[cp+1] = bp->colors[ci].green / 65536.0;
- bp->col[cp+2] = bp->colors[ci].blue / 65536.0;
- bp->col[cp+3] = 1;
- }
- else
- {
- for(i = 0; i != GRID_SEG; i++)
- {
- int ci;
- size_t vp = (polys + i) * 3;
- size_t cp = (polys + i) * 4;
-# if COLOR_CODE
- color[cp] = 1;
- color[cp + 1] = 0.75;
- color[cp + 2] = 0;
- color[cp + 3] = 1;
-# endif
- vtx_x[vp] = x * GRID_SEG + i;
- bp->vtx[vp + 2] = gridp[x * GRID_SEG + i];
-
- ci = EASE (bp->vtx[vp + 2] / MAX_MASS_COLOR) * bp->ncolors;
- if (ci < 0) ci = 0;
- if (ci >= bp->ncolors) ci = bp->ncolors - 1;
- bp->col[cp] = bp->colors[ci].red / 65536.0;
- bp->col[cp+1] = bp->colors[ci].green / 65536.0;
- bp->col[cp+2] = bp->colors[ci].blue / 65536.0;
- bp->col[cp+3] = 1;
- }
- polys += GRID_SEG;
- }
- }
-
- for (i = 0; i < polys; i++)
- vtx_y[i * 3] = y; /* + random() * (MASS_EPSILON / (MAXRAND)); */
-
- mi->polygon_count += polys;
- glDrawArrays (GL_LINE_STRIP, 0, polys);
-
-# if COLOR_CODE
- glDisableClientState (GL_COLOR_ARRAY);
- free (color);
- }
-# endif
-}
-
-
-ENTRYPOINT void
-init_gw (ModeInfo *mi)
-{
- gw_configuration *bp;
- unsigned grid_max, vtx_max;
- int i;
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_gw (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- {
- int h1, h2;
- double s1, v1, s2, v2;
- GLfloat color2[4];
- parse_color (mi, "gridColor", bp->color);
- parse_color (mi, "gridColor2", color2);
- rgb_to_hsv (bp->color[0] * 65536,
- bp->color[1] * 65536,
- bp->color[2] * 65536,
- &h1, &s1, &v1);
- rgb_to_hsv (color2[0] * 65536,
- color2[1] * 65536,
- color2[2] * 65536,
- &h2, &s2, &v2);
- bp->ncolors = 128;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_color_ramp (0, 0, 0,
- h1, s1, v1, h2, s2, v2,
- bp->colors, &bp->ncolors,
- False, 0, False);
- }
-
- bp->user_trackball = gltrackball_init (False);
-
- bp->grid_w = (RESOLUTION_BASE * resolution) / GRID_SEG;
- if (bp->grid_w < 2) bp->grid_w = 2;
- bp->grid_h = bp->grid_w;
-
- grid_max = bp->grid_w > bp->grid_h ? bp->grid_w : bp->grid_h;
- vtx_max = grid_max * GRID_SEG;
- bp->grid = (GLfloat *) calloc (vtx_max, sizeof(*bp->grid));
- bp->vtx = (GLfloat *) calloc (vtx_max * 3, sizeof(*bp->vtx));
- bp->col = (GLfloat *) calloc (vtx_max * 4, sizeof(*bp->col));
- bp->segs = (char *) calloc (grid_max, sizeof(*bp->segs));
- if (! bp->grid || ! bp->vtx || ! bp->col || ! bp->segs) abort();
-
- bp->nstars = MI_COUNT(mi);
- bp->stars = (star *) calloc (bp->nstars, sizeof (star));
-
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- new_star (bp, s);
- s->y = frand(s->ro * 2 + bp->grid_h * GRID_SEG) - s->ro;
- }
-
- /* Let's tilt the floor a little. */
- gltrackball_reset (bp->user_trackball,
- -0.4 + frand(0.8),
- -0.3 + frand(0.2));
-}
-
-
-ENTRYPOINT void
-draw_gw (ModeInfo *mi)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int gridmod = grid_size * GRID_SIZE_BASE;
- int x, y, i;
- int sample_x, sample_y;
- GLfloat sample_z = -1;
-
- 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); /* right side up */
-
- gltrackball_rotate (bp->user_trackball);
-
-#if 0
- glScalef(0.05/resolution, 0.05/resolution, 0.05/resolution);
-#endif
-
- glRotatef (90, 1, 0, 0);
- glTranslatef (-bp->grid_w * (GRID_SEG / 2.0f),
- -bp->grid_h * (GRID_SEG * 0.75f),
- 3);
-
-#if 0
- glColor3f(1,0,0);
- glPushMatrix();
- glTranslatef(0,0,0);
- glScalef (bp->grid_w * GRID_SEG,
- bp->grid_w * GRID_SEG,
- bp->grid_w * GRID_SEG);
- glDisable (GL_FOG);
- glBegin(GL_LINE_LOOP);
- glVertex3f(0, 0, 0);
- glVertex3f(1, 0, 0);
- glVertex3f(1, 1, 0);
- glVertex3f(.4, 1, 0);
- glVertex3f(.5, .5, 0);
- glVertex3f(.6, 1, 0);
- glVertex3f(0, 1, 0);
- glEnd();
- glPopMatrix();
- glColor3f(0,1,0);
- if (!wire) glEnable (GL_FOG);
-#endif
-
- if (!wire)
- {
- GLfloat fog_color[4] = { 0, 0, 0, 1 };
-
- glLineWidth (2);
- glEnable (GL_LINE_SMOOTH);
- glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_BLEND);
-
- glFogi (GL_FOG_MODE, GL_EXP2);
- glFogfv (GL_FOG_COLOR, fog_color);
- glFogf (GL_FOG_DENSITY, 0.005);
- glEnable (GL_FOG);
- }
-
- glEnableClientState (GL_COLOR_ARRAY);
- glEnableClientState (GL_VERTEX_ARRAY);
- glColorPointer (4, GL_FLOAT, 0, bp->col);
- glVertexPointer (3, GL_FLOAT, 0, bp->vtx);
-
- /* Somewhere near the midpoint of the view */
- sample_x = ((int) (bp->grid_w * GRID_SEG * 0.5) / gridmod) * gridmod;
- sample_y = ((int) (bp->grid_h * GRID_SEG * 0.75) / GRID_SEG) * GRID_SEG;
-
- /* Find the cumulative gravitational effect at the midpoint of each star,
- for the depth of the foot-circle. This duplicates some of the draw_row()
- logic. */
- for (i = 0; i < bp->nstars; i++)
- {
- star *s0 = &bp->stars[i];
- GLfloat x0 = s0->x;
- GLfloat y0 = s0->y;
- int j;
- s0->depth = s0->surface_gravity;
- for (j = 0; j < bp->nstars; j++)
- {
- star *s1;
- GLfloat x1, y1, d2;
- if (i == j) continue;
- s1 = &bp->stars[j];
- x1 = s1->x;
- y1 = s1->y;
- d2 = (x1-x0)*(x1-x0) + (y1-y0)*(y1-y0);
- s0->depth += s1->mass / d2;
- }
- }
-
- mi->polygon_count = 0;
- for (y = 0; y < (bp->grid_h - 1) * GRID_SEG; y += gridmod)
- draw_row (mi, bp->grid_w, y, False);
- for (x = 0; x < (bp->grid_w - 1) * GRID_SEG; x += gridmod)
- {
- draw_row (mi, bp->grid_h, x, True);
- if (x == sample_x)
- sample_z = bp->grid[sample_y];
- }
-
- if (mi->fps_p)
- {
- /* Mass of Sol is 2x10^30kg, or 332 kilo-Earths.
- But I'm not sure what the funniest number to put here is. */
- /* mi->recursion_depth = (int) sample_z/4; */
- mi->recursion_depth = (int) (sample_z * 30000);
- glColor4fv (bp->color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, bp->color);
- glBegin(GL_LINES);
- glVertex3f (sample_x-0.15, sample_y-0.15, sample_z);
- glVertex3f (sample_x+0.15, sample_y+0.15, sample_z);
- glVertex3f (sample_x-0.15, sample_y+0.15, sample_z);
- glVertex3f (sample_x+0.15, sample_y-0.15, sample_z);
- glEnd();
- }
-
- /* Draw a circle around the "footprint" at the bottom of the gravity well.
- */
- for (i = 0; i < bp->nstars; i++)
- {
- int steps = 16;
- star *s = &bp->stars[i];
- GLfloat th, color[4];
- int ci;
- ci = EASE (s->depth / MAX_MASS_COLOR) * bp->ncolors;
- if (ci < 0) ci = 0;
- if (ci >= bp->ncolors) ci = bp->ncolors - 1;
- color[0] = bp->colors[ci].red / 65536.0;
- color[1] = bp->colors[ci].green / 65536.0;
- color[2] = bp->colors[ci].blue / 65536.0;
- color[3] = 1;
- glColor4fv (color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glPushMatrix();
- glTranslatef (s->x, s->y, 0);
- glBegin (GL_LINE_LOOP);
- for (th = 0; th < M_PI * 2; th += M_PI/steps)
- glVertex3f (s->radius * cos(th), s->radius * sin(th), s->depth);
- glEnd();
- glPopMatrix();
- mi->polygon_count += steps;
- }
-
-#if 0
- {
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- GLfloat maxr = sqrt (s->mass / MASS_EPSILON);
- GLfloat th;
- glPushMatrix();
- glTranslatef (s->x, s->y, 0);
- glColor3f(0, 0, 1);
- glBegin (GL_LINE_LOOP);
- for (th = 0; th < M_PI * 2; th += M_PI/32)
- glVertex3f (s->radius * cos(th), s->radius * sin(th), 0);
- glEnd();
- glColor3f(0, 0, 0.5);
- glBegin (GL_LINE_LOOP);
- for (th = 0; th < M_PI * 2; th += M_PI/32)
- glVertex3f (maxr * cos(th), maxr * sin(th), 0);
- glEnd();
- glBegin (GL_LINES);
- glVertex3f ( 3000 * s->dx, 3000 * s->dy, 0);
- glVertex3f (-3000 * s->dx, -3000 * s->dy, 0);
- glEnd();
- glPopMatrix();
- }
- }
-#endif
-
- glPopMatrix ();
-
- if (! bp->button_down_p)
- move_stars (mi);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_gw (ModeInfo *mi)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (bp->user_trackball) gltrackball_free (bp->user_trackball);
- if (bp->stars) free (bp->stars);
- if (bp->grid) free (bp->grid);
- if (bp->vtx) free (bp->vtx);
- if (bp->col) free (bp->col);
- if (bp->segs) free (bp->segs);
- if (bp->colors) free (bp->colors);
-}
-
-XSCREENSAVER_MODULE_2 ("GravityWell", gravitywell, gw)
-
-#endif /* USE_GL */