diff options
Diffstat (limited to 'hacks/glx/sballs.c')
| -rw-r--r-- | hacks/glx/sballs.c | 829 |
1 files changed, 0 insertions, 829 deletions
diff --git a/hacks/glx/sballs.c b/hacks/glx/sballs.c deleted file mode 100644 index 8252e5c..0000000 --- a/hacks/glx/sballs.c +++ /dev/null @@ -1,829 +0,0 @@ -/* sballs --- balls spinning like crazy in GL */ - -#if 0 -static const char sccsid[] = "@(#)sballs.c 5.02 2001/03/10 xlockmore"; -#endif - -/* Copyright (c) E. Lassauge, 2001. */ - -/* - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation. - * - * This file is provided AS IS with no warranties of any kind. The author - * shall have no liability with respect to the infringement of copyrights, - * trade secrets or any patents by this file or any part thereof. In no - * event will the author be liable for any lost revenue or profits or - * other special, indirect and consequential damages. - * - * The original code for this mode was written by - * Mustata Bogdan (LoneRunner) <lonerunner@planetquake.com> - * and can be found at http://www.cfxweb.net/lonerunner/ - * - * Eric Lassauge (November-07-2000) <lassauge@users.sourceforge.net> - * http://lassauge.free.fr/linux.html - * - * REVISION HISTORY: - * - * E.Lassauge - 03-Oct-2001: - * - minor bugfixes - get ready for xscreensaver - * E.Lassauge - 09-Mar-2001: - * - get rid of my framerate options to use showfps - * E.Lassauge - 28-Nov-2000: - * - add handling of polyhedrons (like in ico) - * - modified release part to add freeing of GL objects - * E.Lassauge - 14-Nov-2000: - * - use new common xpm_to_ximage function - * - */ - -#ifdef STANDALONE /* xscreensaver mode */ -#define DEFAULTS "*delay: 30000 \n" \ - "*size: 0 \n" \ - "*cycles: 4 \n" \ - "*showFPS: False \n" \ - "*wireframe: False \n" \ - -# define release_sballs 0 -#define MODE_sballs -#include "xlockmore.h" /* from the xscreensaver distribution */ -#include "gltrackball.h" -#else /* !STANDALONE */ -#include "xlock.h" /* from the xlockmore distribution */ -#include "visgl.h" -#endif /* !STANDALONE */ - -#define MINSIZE 32 /* minimal viewport size */ -#define FRAME 50 /* frame count interval */ -#define MAX_OBJ 8 /* number of 3D objects */ - -#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/sball_png.h" -# include "images/gen/sball-bg_png.h" - -/* Manage option vars */ -#define DEF_TEXTURE "True" -#define DEF_OBJECT "0" -static Bool do_texture; -static int object, object_arg; -static int spheres; - -static XrmOptionDescRec opts[] = { - {"-texture", ".sballs.texture", XrmoptionNoArg, "on"}, - {"+texture", ".sballs.texture", XrmoptionNoArg, "off"}, - {"-object", ".sballs.object", XrmoptionSepArg, 0}, - -}; - -static argtype vars[] = { - {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool}, - {&object_arg, "object", "Object", DEF_OBJECT, t_Int}, - -}; - -static OptionStruct desc[] = { - /*{"-count spheres", "set number of spheres"},*/ - /*{"-cycles speed", "set ball speed value"},*/ - {"-/+texture", "turn on/off texturing"}, - {"-object num", "number of the 3D object (0 means random)"}, -}; - -ENTRYPOINT ModeSpecOpt sballs_opts = - { sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc }; - -#ifdef USE_MODULES -ModStruct sballs_description = - { "sballs", "init_sballs", "draw_sballs", NULL, - "draw_sballs", "change_sballs", "free_sballs", &sballs_opts, - /* - delay,count,cycles,size,ncolors,sat - */ - 10000, 0, 10, 400, 64, 1.0, "", - "balls spinning like crazy in GL", 0, NULL -}; -#endif /* USE_MODULES */ - -/* misc types and defines */ -#define vinit(a,i,j,k) {\ - (a)[0]=i;\ - (a)[1]=j;\ - (a)[2]=k;\ -} -typedef float vec_t; -typedef vec_t vec3_t[3]; - -#define MAX_BALLS 20 - -/* the mode struct, contains all per screen variables */ -typedef struct { - GLint WIDTH, HEIGHT; /* display dimensions */ - GLXContext *glx_context; - - - XImage *btexture; /* back texture image bits */ - XImage *ftexture; /* face texture image bits */ - GLuint backid; /* back texture id: GL world */ - GLuint faceid; /* face texture id: GL world */ - - vec3_t eye; - vec3_t rotm; - int speed; - float radius[MAX_BALLS]; - - trackball_state *trackball; - Bool button_down_p; - -} sballsstruct; - -/* array of sballsstruct indexed by screen number */ -static sballsstruct *sballs = (sballsstruct *) NULL; - -/* lights */ -static const float LightAmbient[]= { 1.0f, 1.0f, 1.0f, 1.0f }; -static const float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; -static const float LightPosition[]= { 0.0f, 0.0f, 4.0f, 1.0f }; - -/* structure of the polyhedras */ -typedef struct { - const char *longname; /* long name of object */ - const char *shortname; /* short name of object */ - int numverts; /* number of vertices */ - float radius; /* radius */ - vec3_t v[MAX_BALLS];/* the vertices */ -} Polyinfo; - -static const Polyinfo polygons[] = -{ - -/* 0: objtetra - structure values for tetrahedron */ - { - "tetrahedron", "tetra", /* long and short names */ - 4, /* number of vertices */ - 0.8, - { /* vertices (x,y,z) */ - /* all points must be within radius 2 of the origin */ -#define T 1.0 - {T, T, T}, - {T, -T, -T}, - {-T, T, -T}, - {-T, -T, T}, -#undef T - } - }, - -/* 1: objcube - structure values for cube */ - - { - "hexahedron", "cube", /* long and short names */ - 8, /* number of vertices, edges, and faces */ - 0.6, - { /* vertices (x,y,z) */ - /* all points must be within radius 2 of the origin */ -#define T 1.0 - {T, T, T}, - {T, T, -T}, - {T, -T, -T}, - {T, -T, T}, - {-T, T, T}, - {-T, T, -T}, - {-T, -T, -T}, - {-T, -T, T}, -#undef T - } - }, - -/* 2: objocta - structure values for octahedron */ - - { - "octahedron", "octa", /* long and short names */ - 6, /* number of vertices */ - 0.6, - { /* vertices (x,y,z) */ - /* all points must be within radius 2 of the origin */ -#define T 1.5 - {T, 0, 0}, - {-T, 0, 0}, - {0, T, 0}, - {0, -T, 0}, - {0, 0, T}, - {0, 0, -T}, -#undef T - } - }, -/* 3: objdodec - structure values for dodecahedron */ - - { - "dodecahedron", "dodeca", /* long and short names */ - 20, /* number of vertices */ - 0.35, - { /* vertices (x,y,z) */ - /* all points must be within radius 2 of the origin */ - {0.000000, 0.500000, 1.000000}, - {0.000000, -0.500000, 1.000000}, - {0.000000, -0.500000, -1.000000}, - {0.000000, 0.500000, -1.000000}, - {1.000000, 0.000000, 0.500000}, - {-1.000000, 0.000000, 0.500000}, - {-1.000000, 0.000000, -0.500000}, - {1.000000, 0.000000, -0.500000}, - {0.500000, 1.000000, 0.000000}, - {-0.500000, 1.000000, 0.000000}, - {-0.500000, -1.000000, 0.000000}, - {0.500000, -1.000000, 0.000000}, - {0.750000, 0.750000, 0.750000}, - {-0.750000, 0.750000, 0.750000}, - {-0.750000, -0.750000, 0.750000}, - {0.750000, -0.750000, 0.750000}, - {0.750000, -0.750000, -0.750000}, - {0.750000, 0.750000, -0.750000}, - {-0.750000, 0.750000, -0.750000}, - {-0.750000, -0.750000, -0.750000}, - } - }, - -/* 4: objicosa - structure values for icosahedron */ - - { - "icosahedron", "icosa", /* long and short names */ - 12, /* number of vertices */ - 0.4, - { /* vertices (x,y,z) */ - /* all points must be within radius 2 of the origin */ - {0.00000000, 0.00000000, -0.95105650}, - {0.00000000, 0.85065080, -0.42532537}, - {0.80901698, 0.26286556, -0.42532537}, - {0.50000000, -0.68819095, -0.42532537}, - {-0.50000000, -0.68819095, -0.42532537}, - {-0.80901698, 0.26286556, -0.42532537}, - {0.50000000, 0.68819095, 0.42532537}, - {0.80901698, -0.26286556, 0.42532537}, - {0.00000000, -0.85065080, 0.42532537}, - {-0.80901698, -0.26286556, 0.42532537}, - {-0.50000000, 0.68819095, 0.42532537}, - {0.00000000, 0.00000000, 0.95105650} - } - }, - -/* 5: objplane - structure values for plane */ - - { - "plane", "plane", /* long and short names */ - 4, /* number of vertices */ - 0.7, - { /* vertices (x,y,z) */ - /* all points must be within radius 2 of the origin */ -#define T 1.1 - {T, 0, 0}, - {-T, 0, 0}, - {0, T, 0}, - {0, -T, 0}, -#undef T - } - }, - -/* 6: objpyr - structure values for pyramid */ - - { - "pyramid", "pyramid", /* long and short names */ - 5, /* number of vertices */ - 0.5, - { /* vertices (x,y,z) */ - /* all points must be within radius 1 of the origin */ -#define T 1.0 - {T, 0, 0}, - {-T, 0, 0}, - {0, T, 0}, - {0, -T, 0}, - {0, 0, T}, -#undef T - } - }, - -/* 7: objstar - structure values for octahedron star (stellated octahedron?) */ - { - "star", "star", /* long and short names */ - 8, /* number of vertices */ - 0.7, - { /* vertices (x,y,z) */ - /* all points must be within radius 1 of the origin */ -#define T 0.9 - {T, T, T}, - {T, -T, -T}, - {-T, T, -T}, - {-T, -T, T}, - {-T, -T, -T}, - {-T, T, T}, - {T, -T, T}, - {T, T, -T}, -#undef T - } - }, - -}; - - - - -/* - *----------------------------------------------------------------------------- - *----------------------------------------------------------------------------- - * Misc funcs. - *----------------------------------------------------------------------------- - *----------------------------------------------------------------------------- - */ - - -/* initialise textures */ -static void inittextures(ModeInfo * mi) -{ - sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - -#if defined( I_HAVE_XPM ) - if (do_texture) { - - glGenTextures(1, &sb->backid); -#ifdef HAVE_GLBINDTEXTURE - glBindTexture(GL_TEXTURE_2D, sb->backid); -#endif /* HAVE_GLBINDTEXTURE */ - - sb->btexture = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), - sball_bg_png, - sizeof(sball_bg_png)); - if (!(sb->btexture)) { - (void) fprintf(stderr, "Error reading the background texture.\n"); - glDeleteTextures(1, &sb->backid); - do_texture = False; - sb->faceid = 0; /* default textures */ - sb->backid = 0; - return; - } - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - clear_gl_error(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - sb->btexture->width, sb->btexture->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, sb->btexture->data); - check_gl_error("texture"); - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - -/* - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - Let's pixellate it instead: -*/ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - glGenTextures(1, &sb->faceid); -#ifdef HAVE_GLBINDTEXTURE - glBindTexture(GL_TEXTURE_2D, sb->faceid); -#endif /* HAVE_GLBINDTEXTURE */ - - sb->ftexture = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), - sball_png, sizeof(sball_png)); - if (!(sb->ftexture)) { - (void) fprintf(stderr, "Error reading the face texture.\n"); - glDeleteTextures(1, &sb->faceid); - sb->faceid = 0; - return; - } - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - clear_gl_error(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - sb->ftexture->width, sb->ftexture->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, sb->ftexture->data); - check_gl_error("texture"); - - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - -/* - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - Let's pixellate it instead: -*/ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - } - else - { - sb->faceid = 0; /* default textures */ - sb->backid = 0; - } -#else /* !I_HAVE_XPM */ - do_texture = False; - sb->faceid = 0; /* default textures */ - sb->backid = 0; -#endif /* !I_HAVE_XPM */ -} - -static void drawSphere(ModeInfo * mi,int sphere_num) -{ - sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - float x = polygons[object].v[sphere_num][0]; - float y = polygons[object].v[sphere_num][1]; - float z = polygons[object].v[sphere_num][2]; - int numMajor = 15; - int numMinor = 30; - float radius = sb->radius[sphere_num]; - double majorStep = (M_PI / numMajor); - double minorStep = (2.0 * M_PI / numMinor); - int i, j; - - glPushMatrix(); - glTranslatef(x, y, z); - - glColor4f(1, 1, 1, 1); - for (i = 0; i < numMajor; ++i) - { - double a = i * majorStep; - double b = a + majorStep; - double r0 = radius * sin(a); - double r1 = radius * sin(b); - GLfloat z0 = radius * cos(a); - GLfloat z1 = radius * cos(b); - - glBegin(MI_IS_WIREFRAME(mi) ? GL_LINE_STRIP: GL_TRIANGLE_STRIP); - for (j = 0; j <= numMinor; ++j) - { - double c = j * minorStep; - GLfloat x = cos(c); - GLfloat y = sin(c); - - glNormal3f((x * r0) / radius, (y * r0) / radius, z0 / radius); - glTexCoord2f(j / (GLfloat) numMinor, i / (GLfloat) numMajor); - glVertex3f(x * r0, y * r0, z0); - - glNormal3f((x * r1) / radius, (y * r1) / radius, z1 / radius); - glTexCoord2f(j / (GLfloat) numMinor, (i + 1) / (GLfloat) numMajor); - glVertex3f(x * r1, y * r1, z1); - - mi->polygon_count++; - } - glEnd(); - } - - glPopMatrix(); -} - -/* - *----------------------------------------------------------------------------- - *----------------------------------------------------------------------------- - * GL funcs. - *----------------------------------------------------------------------------- - *----------------------------------------------------------------------------- - */ - -#ifndef STANDALONE -static void Reshape(ModeInfo * mi) -#else -ENTRYPOINT void reshape_sballs(ModeInfo * mi, int width, int height) -#endif -{ - - sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - int size = MI_SIZE(mi); - - /* Viewport is specified size if size >= MINSIZE && size < screensize */ - if (size <= 1) { - sb->WIDTH = MI_WIDTH(mi); - sb->HEIGHT = MI_HEIGHT(mi); - } else if (size < MINSIZE) { - sb->WIDTH = MINSIZE; - sb->HEIGHT = MINSIZE; - } else { - sb->WIDTH = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size; - sb->HEIGHT = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size; - } - - if (width > height * 5) { /* tiny window: show middle */ - sb->WIDTH = width; - sb->HEIGHT = sb->WIDTH*0.75; - } - - glViewport((MI_WIDTH(mi) - sb->WIDTH) / 2, (MI_HEIGHT(mi) - sb->HEIGHT) / 2, sb->WIDTH, sb->HEIGHT); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(55.0, (float)sb->WIDTH / (float) sb->HEIGHT, 1.0, 300.0); - - glMatrixMode(GL_MODELVIEW); - -} - -static void Draw(ModeInfo * mi) -{ - sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - int sphere; - - mi->polygon_count = 0; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glEnable(GL_DEPTH_TEST); - - /* move eyes */ - glTranslatef (-sb->eye[0], -sb->eye[1], -sb->eye[2]); - - /* draw background */ - if (do_texture) - { - glEnable(GL_LIGHTING); - glEnable(GL_TEXTURE_2D); - glColor3f(1, 1, 1); -#ifdef HAVE_GLBINDTEXTURE - glBindTexture(GL_TEXTURE_2D, sb->backid); -#endif /* HAVE_GLBINDTEXTURE */ - } - else - { - glColor3f(0, 0, 0); - } - glBegin(GL_QUAD_STRIP); - if (MI_WIDTH(mi) > MI_HEIGHT(mi)) - { - /* Letterbox the background image */ - glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(8, 4.1, -4); - glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(8, -4.1, -4); - glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-8, 4.1, -4); - glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-8, -4.1, -4); - } - else - { - /* Fill the iPhone screen. Letterboxing looks dumb there. */ - glNormal3f(0, 0, 1); glTexCoord2f(0,0); glVertex3f(4, 5.2, -4); - glNormal3f(0, 0, 1); glTexCoord2f(0,1); glVertex3f(4, -5.2, -4); - glNormal3f(0, 0, 1); glTexCoord2f(1,0); glVertex3f(-4, 5.2, -4); - glNormal3f(0, 0, 1); glTexCoord2f(1,1); glVertex3f(-4, -5.2, -4); - } - - glEnd(); - mi->polygon_count++; - - gltrackball_rotate (sb->trackball); - - /* rotate the balls */ - glRotatef(sb->rotm[0], 1.0f, 0.0f, 0.0f); - glRotatef(sb->rotm[1], 0.0f, 1.0f, 0.0f); - glRotatef(sb->rotm[2], 0.0f, 0.0f, 1.0f); - - if (! sb->button_down_p) { - sb->rotm[0] += sb->speed; - sb->rotm[1] += -(sb->speed); - sb->rotm[2] += 0; - } - - /* draw the balls */ - if (do_texture) -#ifdef HAVE_GLBINDTEXTURE - glBindTexture(GL_TEXTURE_2D, sb->faceid); - else -#endif /* HAVE_GLBINDTEXTURE */ - glEnable(GL_LIGHTING); - for (sphere=0;sphere<spheres;sphere++) - { - drawSphere(mi,sphere); - } - - glDisable(GL_TEXTURE_2D); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - - /* manage framerate display */ - if (MI_IS_FPS(mi)) do_fps (mi); - glPopMatrix(); -} - - -static void Init(ModeInfo * mi) -{ - sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - int i; - - /* Default settings */ - if (MI_IS_WIREFRAME(mi)) - do_texture = False; - if (do_texture) - inittextures(mi); - else - { - sb->btexture = (XImage*) NULL; - sb->ftexture = (XImage*) NULL; - } - - vinit(sb->eye ,0.0f, 0.0f, 6.0f); - vinit(sb->rotm ,0.0f, 0.0f, 0.0f); - sb->speed = MI_CYCLES(mi); - - /* initialise object number */ - object = object_arg-1; - if (object < 0 || object >= MAX_OBJ) - object = NRAND(MAX_OBJ); - - /* initialise sphere number */ - spheres = MI_COUNT(mi); - if (MI_COUNT(mi) > polygons[object].numverts) - spheres = polygons[object].numverts; - if (MI_COUNT(mi) < 1) - spheres = polygons[object].numverts; - /* initialise sphere radius */ - for(i=0; i < spheres;i++) - { -#if RANDOM_RADIUS - sb->radius[i] = ((float) LRAND() / (float) MAXRAND); - if (sb->radius[i] < 0.3) - sb->radius[i] = 0.3; - if (sb->radius[i] > 0.7) - sb->radius[i] = 0.7; -#else - sb->radius[i] = polygons[object].radius; -#endif - } - - if (MI_IS_DEBUG(mi)) { - (void) fprintf(stderr, - "%s:\n\tobject=%s\n\tspheres=%d\n\tspeed=%d\n\ttexture=%s\n", - MI_NAME(mi), - polygons[object].shortname, - spheres, - (int) MI_CYCLES(mi), - do_texture ? "on" : "off" - ); - } - - glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); - glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); - glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); - glEnable(GL_LIGHT1); -} - -/* - *----------------------------------------------------------------------------- - *----------------------------------------------------------------------------- - * Xlock hooks. - *----------------------------------------------------------------------------- - *----------------------------------------------------------------------------- - */ - -/* - *----------------------------------------------------------------------------- - * Initialize sballs. Called each time the window changes. - *----------------------------------------------------------------------------- - */ - -ENTRYPOINT void init_sballs(ModeInfo * mi) -{ - sballsstruct *sb; - - MI_INIT(mi, sballs); - sb = &sballs[MI_SCREEN(mi)]; - - sb->trackball = gltrackball_init (True); - - if ((sb->glx_context = init_GL(mi)) != NULL) { - -#ifndef STANDALONE - Reshape(mi); /* xlock mode */ -#else - reshape_sballs(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */ -#endif - glDrawBuffer(GL_BACK); - Init(mi); - - } else { - MI_CLEARWINDOW(mi); - } -} - -/* - *----------------------------------------------------------------------------- - * Called by the mainline code periodically to update the display. - *----------------------------------------------------------------------------- - */ -ENTRYPOINT void draw_sballs(ModeInfo * mi) -{ - Display *display = MI_DISPLAY(mi); - Window window = MI_WINDOW(mi); - sballsstruct *sb; - - if (sballs == NULL) - return; - sb = &sballs[MI_SCREEN(mi)]; - - MI_IS_DRAWN(mi) = True; - if (!sb->glx_context) - return; - - glXMakeCurrent(display, window, *sb->glx_context); - Draw(mi); -#ifndef STANDALONE - Reshape(mi); /* xlock mode */ -#else - reshape_sballs(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */ -#endif - - glFinish(); - glXSwapBuffers(display, window); -} - - -/* - *----------------------------------------------------------------------------- - * The display is being taken away from us. Free up malloc'ed - * memory and X resources that we've alloc'ed. - *----------------------------------------------------------------------------- - */ - -ENTRYPOINT void free_sballs(ModeInfo * mi) -{ - sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - - if (!sb->glx_context) return; - glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *sb->glx_context); - - gltrackball_free (sb->trackball); - - if (sb->btexture) - { - glDeleteTextures(1,&sb->backid); - XDestroyImage(sb->btexture); - sb->btexture = 0; - } - if (sb->ftexture) - { - glDeleteTextures(1,&sb->faceid); - XDestroyImage(sb->ftexture); - sb->ftexture = 0; - } -} - -ENTRYPOINT Bool -sballs_handle_event (ModeInfo *mi, XEvent *event) -{ - sballsstruct *sb = &sballs[MI_SCREEN(mi)]; - - if (gltrackball_event_handler (event, sb->trackball, - MI_WIDTH (mi), MI_HEIGHT (mi), - &sb->button_down_p)) - return True; - - return False; -} - - -#ifndef STANDALONE -ENTRYPOINT void change_sballs(ModeInfo * mi) -{ - sballsstruct *sb; - - if (sballs == NULL) - return; - sb = &sballs[MI_SCREEN(mi)]; - - if (!sb->glx_context) - return; - - /* initialise object number */ - if ((object == 0) || (object > MAX_OBJ)) - object = NRAND(MAX_OBJ-1)+1; - object--; - - /* correct sphere number */ - spheres = MI_COUNT(mi); - if (MI_COUNT(mi) > polygons[object].numverts) - spheres = polygons[object].numverts; - if (MI_COUNT(mi) < 1) - spheres = polygons[object].numverts; - - if (MI_IS_DEBUG(mi)) { - (void) fprintf(stderr, - "%s:\n\tobject=%s\n\tspheres=%d\n\tspeed=%d\n\ttexture=%s\n", - MI_NAME(mi), - polygons[object].shortname, - spheres, - (int) MI_CYCLES(mi), - do_texture ? "on" : "off" - ); - } - glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *sb->glx_context); - -} -#endif /* !STANDALONE */ - -XSCREENSAVER_MODULE ("SBalls", sballs) - -#endif /* MODE_sballs */ |
