diff options
author | Alastair Tse <liquidx@gentoo.org> | 2003-06-16 22:38:59 +0000 |
---|---|---|
committer | Alastair Tse <liquidx@gentoo.org> | 2003-06-16 22:38:59 +0000 |
commit | 91923acb1f54accc86927a55236592429da4a355 (patch) | |
tree | fb6d0b6353581052ef6ecba1278f9e1234b5c7c4 /x11-misc/xscreensaver/files | |
parent | new experimental ebuild (diff) | |
download | gentoo-2-91923acb1f54accc86927a55236592429da4a355.tar.gz gentoo-2-91923acb1f54accc86927a55236592429da4a355.tar.bz2 gentoo-2-91923acb1f54accc86927a55236592429da4a355.zip |
fixed compile problem with gcc 2.95
Diffstat (limited to 'x11-misc/xscreensaver/files')
-rw-r--r-- | x11-misc/xscreensaver/files/xscreensaver-4.10-klein.c | 424 |
1 files changed, 424 insertions, 0 deletions
diff --git a/x11-misc/xscreensaver/files/xscreensaver-4.10-klein.c b/x11-misc/xscreensaver/files/xscreensaver-4.10-klein.c new file mode 100644 index 000000000000..b068e3f4e7ff --- /dev/null +++ b/x11-misc/xscreensaver/files/xscreensaver-4.10-klein.c @@ -0,0 +1,424 @@ +/* -*- Mode: C; tab-width: 4 -*- */ +/* Klein --- Klein Bottle, Moebius and other parametric surfaces + * visualization */ + +/* + * Revision History: + * 2000: written by Andrey Mirtchovski <mirtchov@cpsc.ucalgary.ca + * + * 01-Mar-2003 mirtchov modified as a xscreensaver hack + * + */ + +/*- + * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock. + * otherwise caddr_t is not defined correctly + */ + +#include <X11/Intrinsic.h> + +#ifdef STANDALONE +# define PROGCLASS "Klein" +# define HACK_INIT init_klein +# define HACK_DRAW draw_klein +# define HACK_RESHAPE reshape_klein +# define HACK_HANDLE_EVENT klein_handle_event +# define EVENT_MASK PointerMotionMask +# define klein_opts xlockmore_opts + + +#define DEF_SPIN "True" +#define DEF_WANDER "False" +#define DEF_RANDOM "False" +#define DEF_SPEED "150" + +# define DEFAULTS "*delay: 20000 \n" \ + "*showFPS: False \n" \ + "*wireframe: False \n" \ + "*random: " DEF_RANDOM "\n" \ + "*speed: " DEF_SPEED "\n" \ + "*spin: " DEF_SPIN "\n" \ + "*wander: " DEF_WANDER "\n" \ + +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +#include <GL/glu.h> +#include "rotator.h" +#include "gltrackball.h" + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +/* surfaces being drawn */ +enum { + KLEIN = 0, + DINI, + ENNEPER, + KUEN, + MOEBIUS, + SEASHELL, + SWALLOWTAIL, + BOHEM, + SURFACE_LAST, +}; + +/* primitives to draw with + * note that we skip the polygons and + * triangle fans -- too slow + * + * also removed triangle_strip and quads -- + * just doesn't look good enough + */ +enum { + MY_POINTS = 0, + MY_LINES, + MY_LINE_LOOP, + MY_PRIM_LAST, +}; + + +static Bool rand; +static int render; +static int speed; +static Bool do_spin; +static Bool do_wander; + +static XrmOptionDescRec opts[] = { + {"-speed", ".speed", XrmoptionSepArg, (caddr_t) 0 }, + { "-spin", ".spin", XrmoptionNoArg, "True" }, + { "+spin", ".spin", XrmoptionNoArg, "False" }, + { "-wander", ".wander", XrmoptionNoArg, "True" }, + { "+wander", ".wander", XrmoptionNoArg, "False" }, + { "-random", ".rand", XrmoptionNoArg, "True" }, + { "+random", ".rand", XrmoptionNoArg, "False" }, +}; + +static argtype vars[] = { + {(caddr_t *) &rand, "rand", "Random", DEF_RANDOM, t_Bool}, + {(caddr_t *) &do_spin, "spin", "Spin", DEF_SPIN, t_Bool}, + {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool}, + {(caddr_t *) &speed, "speed", "Speed", DEF_SPEED, t_Int}, +}; + + +ModeSpecOpt klein_opts = {countof(opts), opts, countof(vars), vars, NULL}; + + + +typedef struct{ + GLfloat x; + GLfloat y; + GLfloat z; +} GL_VECTOR; + +typedef struct { + GLXContext *glx_context; + Window window; + rotator *rot; + trackball_state *trackball; + Bool button_down_p; + + int render; + int surface; + + float du, dv; + float a, b, c; + +} kleinstruct; + +static kleinstruct *klein = NULL; + + +static void +draw(ModeInfo *mi) +{ + kleinstruct *kp = &klein[MI_SCREEN(mi)]; + static float step = 0.0; + double u, v; + float coord[3]; + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + glEnable(GL_CULL_FACE); + + glPushMatrix(); + + { + double x, y, z; + get_position (kp->rot, &x, &y, &z, !kp->button_down_p); + glTranslatef((x - 0.5) * 10, + (y - 0.5) * 10, + (z - 0.5) * 20); + + gltrackball_rotate (kp->trackball); + + get_rotation (kp->rot, &x, &y, &z, !kp->button_down_p); + glRotatef (x * 360, 1.0, 0.0, 0.0); + glRotatef (y * 360, 0.0, 1.0, 0.0); + glRotatef (z * 360, 0.0, 0.0, 1.0); + } + + glScalef( 4.0, 4.0, 4.0 ); + + glBegin(kp->render); + switch(kp->surface) { + case KLEIN: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = cos(u)*(kp->a + sin(v)*cos(u/2) - + sin(2*v)*sin(u/2)/2); + coord[1] = sin(u)*(kp->a + sin(v)*cos(u/2) - + sin(2*v)*sin(u/2)/2); + coord[2] = sin(u/2)*sin(v) + cos(u/2)*sin(2*v)/2; + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + case DINI: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = kp->a*cos(u)*sin(v); + coord[1] = kp->a*sin(u)*sin(v); + coord[2] = kp->a*(cos(v) + sin(tan((v/2))))+0.2*u; + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + case ENNEPER: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = kp->a*(u-(u*u*u/3)+u*v*v); + coord[1] = kp->b*(v-(v*v*v/3)+u*u*v); + coord[2] = u*u-v*v; + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + case KUEN: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = 2*(cos(u)+u*sin(u))*sin(v)/(1+u*u*sin(v)*sin(v)); + coord[1] = 2*(sin(u)-u*cos(u))*sin(v)/(1+u*u*sin(v)*sin(v)); + coord[2] = sin(tan(v/2))+2*cos(v)/(1+u*u*sin(v)*sin(v)); + + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + case MOEBIUS: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = cos(u)+v*cos(u/2)*cos(u); + coord[1] = sin(u)+v*cos(u/2)*sin(u); + coord[2] = v*sin(u/2); + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + case SEASHELL: + for(u = 0; u < 2*M_PI; u+=kp->du){ + for(v = 0; v < 2*M_PI; v+=kp->dv){ + coord[0] = kp->a*(1-v/(2*M_PI))*cos(2*v)*(1+cos(u))+sin(kp->c+=0.00001)*cos(2*v); + coord[1] = kp->a*(1-v/(2*M_PI))*sin(2*v)*(1+cos(u))+cos(kp->c+=0.00001)*sin(2*v); + coord[2] = sin(kp->b+=0.00001)*v/(2*M_PI)+kp->a*(1-v/(2*M_PI))*sin(u); + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + case SWALLOWTAIL: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = u*pow(v,2) + 3*pow(v,4); + coord[1] = -2*u*v - 4*pow(v,3); + coord[2] = u; + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + case BOHEM: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = kp->a*cos(u); + coord[1] = 1.5*cos(v) + kp->a*sin(u); + coord[2] = sin(v); + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + default: + for(u = -M_PI; u < M_PI; u+=kp->du){ + for(v = -M_PI; v < M_PI; v+=kp->dv){ + coord[0] = sin(u)*kp->a; + coord[1] = cos(u)*kp->a; + coord[2] = sin(u/2)*cos(v) + cos(u/2)*sin(v); + glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7); + glVertex3fv(coord); + } + } + break; + } + glEnd(); + glPopMatrix(); + + + kp->a = sin(step+=0.01); + kp->b = cos(step+=0.01); +} + + +/* new window size or exposure */ +void +reshape_klein(ModeInfo *mi, int width, int height) +{ + GLfloat h = (GLfloat) height / (GLfloat) width; + + glViewport(0, 0, (GLint) width, (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective (30.0, 1/h, 1.0, 100.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt( 0.0, 0.0, 30.0, + 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0); + + glClear(GL_COLOR_BUFFER_BIT); +} + + +Bool +klein_handle_event (ModeInfo *mi, XEvent *event) +{ + kleinstruct *kp = &klein[MI_SCREEN(mi)]; + + if (event->xany.type == ButtonPress && event->xbutton.button & Button1) { + kp->button_down_p = True; + gltrackball_start (kp->trackball, event->xbutton.x, event->xbutton.y, MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } else if (event->xany.type == ButtonRelease && event->xbutton.button & Button1) { + kp->button_down_p = False; + return True; + } else if (event->xany.type == MotionNotify && kp->button_down_p) { + gltrackball_track (kp->trackball, event->xmotion.x, event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + + return False; +} + + +void +init_klein(ModeInfo *mi) +{ + int screen = MI_SCREEN(mi); + kleinstruct *kp; + + if (klein == NULL) { + if ((klein = (kleinstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (kleinstruct))) == NULL) + return; + } + kp = &klein[screen]; + + kp->window = MI_WINDOW(mi); + + { + double spin_speed = 1.0; + double wander_speed = 0.03; + kp->rot = make_rotator (do_spin ? spin_speed : 0, + do_spin ? spin_speed : 0, + do_spin ? spin_speed : 0, + 1.0, + do_wander ? wander_speed : 0, + True); + kp->trackball = gltrackball_init (); + } + + if(rand) { + render = random() % MY_PRIM_LAST; + kp->surface = random() % SURFACE_LAST; + } else { + render = MY_LINE_LOOP; + kp->surface = KLEIN; + } + + switch (render) { + case MY_POINTS: kp->render = GL_POINTS; break; + case MY_LINES: kp->render = GL_LINES; break; + case MY_LINE_LOOP: kp->render = GL_LINE_LOOP; break; + default: + kp->render = GL_LINE_LOOP; + } +/*kp->render=GL_TRIANGLE_FAN;*/ +/*kp->render=GL_POLYGON;*/ + + kp->du = 0.07; + kp->dv = 0.07; + kp->a = kp->b = 1; + kp->c = 0.1; + + + if ((kp->glx_context = init_GL(mi)) != NULL) { + reshape_klein(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + } else { + MI_CLEARWINDOW(mi); + } +} + +void +draw_klein(ModeInfo * mi) +{ + kleinstruct *kp = &klein[MI_SCREEN(mi)]; + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + if (!kp->glx_context) return; + + glDrawBuffer(GL_BACK); + + glXMakeCurrent(display, window, *(kp->glx_context)); + draw(mi); + if (mi->fps_p) do_fps (mi); + glFinish(); + glXSwapBuffers(display, window); +} + +void +release_klein(ModeInfo * mi) +{ + if (klein != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + kleinstruct *kp = &klein[screen]; + + if (kp->glx_context) { + /* Display lists MUST be freed while their glXContext is current. */ + glXMakeCurrent(MI_DISPLAY(mi), kp->window, *(kp->glx_context)); + } + } + (void) free((void *) klein); + klein = NULL; + } + FreeAllGL(mi); +} + + +/*********************************************************/ + +#endif |