X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fstairs.c;h=bbfe5ff4a4aa8210d137b7b0c5970561b4edf698;hb=50be9bb40dc60130c99ffa568e6677779904ff70;hp=5896e195a1e1792e1ad906aba0a3df92f636aca8;hpb=6bb727f03bff0389fbb1349d7df4c9d8d7532959;p=xscreensaver diff --git a/hacks/glx/stairs.c b/hacks/glx/stairs.c index 5896e195..bbfe5ff4 100644 --- a/hacks/glx/stairs.c +++ b/hacks/glx/stairs.c @@ -1,13 +1,10 @@ /* -*- Mode: C; tab-width: 4 -*- */ /* stairs --- Infinite Stairs, and Escher-like scene. */ -#if !defined( lint ) && !defined( SABER ) +#if 0 static const char sccsid[] = "@(#)stairs.c 4.07 97/11/24 xlockmore"; - #endif -#undef DEBUG_LISTS - /*- * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, @@ -33,9 +30,7 @@ static const char sccsid[] = "@(#)stairs.c 4.07 97/11/24 xlockmore"; * Since I'm not a native English speaker, my apologies for any grammatical * mistake. * - * My e-mail addresses are - * vianna@cat.cbpf.br - * and + * My e-mail address is * m-vianna@usa.net * * Marcelo F. Vianna (Jun-01-1997) @@ -56,20 +51,15 @@ static const char sccsid[] = "@(#)stairs.c 4.07 97/11/24 xlockmore"; * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono * is not officially supported for both OpenGL and Mesa, but seems to not crash * Mesa. -z * + * * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know). */ -#include - #ifdef STANDALONE -# define PROGCLASS "Stairs" -# define HACK_INIT init_stairs -# define HACK_DRAW draw_stairs -# define stairs_opts xlockmore_opts -# define DEFAULTS "*cycles: 1 \n" \ - "*delay: 200000 \n" \ - "*wireframe: False \n" +# define DEFAULTS "*delay: 20000 \n" \ + "*showFPS: False \n" + +# define refresh_stairs 0 # include "xlockmore.h" /* from the xscreensaver distribution */ #else /* !STANDALONE */ # include "xlock.h" /* from the xlockmore distribution */ @@ -78,17 +68,18 @@ z * #ifdef USE_GL -#include #include "e_textures.h" +#include "sphere.h" +#include "gltrackball.h" -ModeSpecOpt stairs_opts = +ENTRYPOINT ModeSpecOpt stairs_opts = {0, NULL, 0, NULL, NULL}; #ifdef USE_MODULES ModStruct stairs_description = {"stairs", "init_stairs", "draw_stairs", "release_stairs", "draw_stairs", "change_stairs", NULL, &stairs_opts, - 1000, 1, 1, 1, 1.0, "", + 1000, 1, 1, 1, 4, 1.0, "", "Shows Infinite Stairs, an Escher-like scene", 0, NULL}; #endif @@ -107,233 +98,220 @@ ModStruct stairs_description = typedef struct { GLint WindH, WindW; GLfloat step; - Bool direction; - int AreObjectsDefined[1]; - int sphere_position; + int rotating; + int AreObjectsDefined[1]; + int sphere_position; + int sphere_tick; GLXContext *glx_context; + trackball_state *trackball; + Bool button_down_p; + GLuint objects; } stairsstruct; -static float front_shininess[] = -{60.0}; -static float front_specular[] = -{0.7, 0.7, 0.7, 1.0}; -static float ambient[] = -{0.0, 0.0, 0.0, 1.0}; -static float diffuse[] = -{1.0, 1.0, 1.0, 1.0}; -static float position0[] = -{1.0, 1.0, 1.0, 0.0}; -static float position1[] = -{-1.0, -1.0, 1.0, 0.0}; -static float lmodel_ambient[] = -{0.5, 0.5, 0.5, 1.0}; -static float lmodel_twoside[] = -{GL_TRUE}; - -#if 0 -static float MaterialRed[] = -{0.7, 0.0, 0.0, 1.0}; -static float MaterialGreen[] = -{0.1, 0.5, 0.2, 1.0}; -static float MaterialBlue[] = -{0.0, 0.0, 0.7, 1.0}; -static float MaterialCyan[] = -{0.2, 0.5, 0.7, 1.0}; -static float MaterialMagenta[] = -{0.6, 0.2, 0.5, 1.0}; -static float MaterialGray[] = -{0.2, 0.2, 0.2, 1.0}; -static float MaterialGray5[] = -{0.5, 0.5, 0.5, 1.0}; -static float MaterialGray6[] = -{0.6, 0.6, 0.6, 1.0}; -static float MaterialGray8[] = -{0.8, 0.8, 0.8, 1.0}; -#endif -static float MaterialYellow[] = -{0.7, 0.7, 0.0, 1.0}; -static float MaterialWhite[] = -{0.7, 0.7, 0.7, 1.0}; - -static float positions[] = -{ - -2.5, 4.0, 0.0, /* First one is FUDGED :) */ - -3.0, 3.25, 1.0, - -3.0, 4.4, 1.5, - -3.0, 3.05, 2.0, - -3.0, 4.2, 2.5, - - -3.0, 2.85, 3.0, - -2.5, 4.0, 3.0, - -2.0, 2.75, 3.0, - -1.5, 3.9, 3.0, - -1.0, 2.65, 3.0, - -0.5, 3.8, 3.0, - 0.0, 2.55, 3.0, - 0.5, 3.7, 3.0, - 1.0, 2.45, 3.0, - 1.5, 3.6, 3.0, - 2.0, 2.35, 3.0, - - 2.0, 3.5, 2.5, - 2.0, 2.25, 2.0, - 2.0, 3.4, 1.5, - 2.0, 2.15, 1.0, - 2.0, 3.3, 0.5, - 2.0, 2.05, 0.0, - 2.0, 3.2, -0.5, - 2.0, 1.95, -1.0, - 2.0, 3.1, -1.5, - 2.0, 1.85, -2.0, - - 1.5, 2.9, -2.0, - 1.0, 1.65, -2.0, - 0.5, 2.7, -2.0, - 0.0, 1.55, -2.0, - -0.5, 2.5, -2.0, - -1.0, 1.45, -2.0, +static const float front_shininess[] = {60.0}; +static const float front_specular[] = {0.7, 0.7, 0.7, 1.0}; +static const float ambient[] = {0.0, 0.0, 0.0, 1.0}; +static const float diffuse[] = {1.0, 1.0, 1.0, 1.0}; +static const float position0[] = {1.0, 1.0, 1.0, 0.0}; +static const float position1[] = {-1.0, -1.0, 1.0, 0.0}; +static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0}; +static const float lmodel_twoside[] = {GL_TRUE}; + +static const float MaterialYellow[] = {0.7, 0.7, 0.0, 1.0}; +static const float MaterialWhite[] = {0.7, 0.7, 0.7, 1.0}; + +static const float ball_positions[] = { + -3.0, 3.0, 1.0, + -3.0, 2.8, 2.0, + -3.0, 2.6, 3.0, + + -2.0, 2.4, 3.0, + -1.0, 2.2, 3.0, + 0.0, 2.0, 3.0, + 1.0, 1.8, 3.0, + 2.0, 1.6, 3.0, + + 2.0, 1.5, 2.0, + 2.0, 1.4, 1.0, + 2.0, 1.3, 0.0, + 2.0, 1.2, -1.0, + 2.0, 1.1, -2.0, + + 1.0, 0.9, -2.0, + 0.0, 0.7, -2.0, + -1.0, 0.5, -2.0, }; -#define NPOSITIONS ((sizeof positions) / (sizeof positions[0])) -static stairsstruct *stairs = NULL; -static GLuint objects; +#define NPOSITIONS ((sizeof ball_positions) / (sizeof ball_positions[0]) / 3) +#define SPHERE_TICKS 32 -#define ObjSphere 0 - -#define PlankWidth 3.0 -#define PlankHeight 0.35 -#define PlankThickness 0.15 +static stairsstruct *stairs = NULL; -static void -mySphere(float radius) +static int +draw_block(GLfloat width, GLfloat height, GLfloat thickness) { - GLUquadricObj *quadObj; - - quadObj = gluNewQuadric(); - gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL); - gluSphere(quadObj, radius, 16, 16); - gluDeleteQuadric(quadObj); + int polys = 0; + glFrontFace(GL_CCW); + glBegin(GL_QUADS); + glNormal3f(0, 0, 1); + glTexCoord2f(0, 0); + glVertex3f(-width, -height, thickness); + glTexCoord2f(1, 0); + glVertex3f(width, -height, thickness); + glTexCoord2f(1, 1); + glVertex3f(width, height, thickness); + glTexCoord2f(0, 1); + glVertex3f(-width, height, thickness); + polys++; + glNormal3f(0, 0, -1); + glTexCoord2f(0, 0); + glVertex3f(-width, height, -thickness); + glTexCoord2f(1, 0); + glVertex3f(width, height, -thickness); + glTexCoord2f(1, 1); + glVertex3f(width, -height, -thickness); + glTexCoord2f(0, 1); + glVertex3f(-width, -height, -thickness); + polys++; + glNormal3f(0, 1, 0); + glTexCoord2f(0, 0); + glVertex3f(-width, height, thickness); + glTexCoord2f(1, 0); + glVertex3f(width, height, thickness); + glTexCoord2f(1, 1); + glVertex3f(width, height, -thickness); + glTexCoord2f(0, 1); + glVertex3f(-width, height, -thickness); + polys++; + glNormal3f(0, -1, 0); + glTexCoord2f(0, 0); + glVertex3f(-width, -height, -thickness); + glTexCoord2f(1, 0); + glVertex3f(width, -height, -thickness); + glTexCoord2f(1, 1); + glVertex3f(width, -height, thickness); + glTexCoord2f(0, 1); + glVertex3f(-width, -height, thickness); + polys++; + glNormal3f(1, 0, 0); + glTexCoord2f(0, 0); + glVertex3f(width, -height, thickness); + glTexCoord2f(1, 0); + glVertex3f(width, -height, -thickness); + glTexCoord2f(1, 1); + glVertex3f(width, height, -thickness); + glTexCoord2f(0, 1); + glVertex3f(width, height, thickness); + polys++; + glNormal3f(-1, 0, 0); + glTexCoord2f(0, 0); + glVertex3f(-width, height, thickness); + glTexCoord2f(1, 0); + glVertex3f(-width, height, -thickness); + glTexCoord2f(1, 1); + glVertex3f(-width, -height, -thickness); + glTexCoord2f(0, 1); + glVertex3f(-width, -height, thickness); + polys++; + glEnd(); + return polys; } static void -draw_block(stairsstruct * sp, GLfloat width, GLfloat height, GLfloat thickness) +draw_stairs_internal(ModeInfo * mi) { - glBegin(GL_QUADS); - glNormal3f(0, 0, 1); - glTexCoord2f(0, 0); - glVertex3f(-width, -height, thickness); - glTexCoord2f(1, 0); - glVertex3f(width, -height, thickness); - glTexCoord2f(1, 1); - glVertex3f(width, height, thickness); - glTexCoord2f(0, 1); - glVertex3f(-width, height, thickness); - glNormal3f(0, 0, -1); - glTexCoord2f(0, 0); - glVertex3f(-width, height, -thickness); - glTexCoord2f(1, 0); - glVertex3f(width, height, -thickness); - glTexCoord2f(1, 1); - glVertex3f(width, -height, -thickness); - glTexCoord2f(0, 1); - glVertex3f(-width, -height, -thickness); - glNormal3f(0, 1, 0); - glTexCoord2f(0, 0); - glVertex3f(-width, height, thickness); - glTexCoord2f(1, 0); - glVertex3f(width, height, thickness); - glTexCoord2f(1, 1); - glVertex3f(width, height, -thickness); - glTexCoord2f(0, 1); - glVertex3f(-width, height, -thickness); - glNormal3f(0, -1, 0); - glTexCoord2f(0, 0); - glVertex3f(-width, -height, -thickness); - glTexCoord2f(1, 0); - glVertex3f(width, -height, -thickness); - glTexCoord2f(1, 1); - glVertex3f(width, -height, thickness); - glTexCoord2f(0, 1); - glVertex3f(-width, -height, thickness); - glNormal3f(1, 0, 0); - glTexCoord2f(0, 0); - glVertex3f(width, -height, thickness); - glTexCoord2f(1, 0); - glVertex3f(width, -height, -thickness); - glTexCoord2f(1, 1); - glVertex3f(width, height, -thickness); - glTexCoord2f(0, 1); - glVertex3f(width, height, thickness); - glNormal3f(-1, 0, 0); - glTexCoord2f(0, 0); - glVertex3f(-width, height, thickness); - glTexCoord2f(1, 0); - glVertex3f(-width, height, -thickness); - glTexCoord2f(1, 1); - glVertex3f(-width, -height, -thickness); - glTexCoord2f(0, 1); - glVertex3f(-width, -height, thickness); - glEnd(); -} + GLfloat X; -static void -draw_degree(stairsstruct * sp, GLfloat w, GLfloat h , GLfloat t) -{ - draw_block(sp, w, h, t); -} + mi->polygon_count = 0; -static void -draw_stairs_internal(ModeInfo *mi) -{ - stairsstruct *sp = &stairs[MI_SCREEN(mi)]; - GLfloat X; - - glPushMatrix(); - glPushMatrix(); - glTranslatef(-3.0, 0.1, 2.0); - for (X=0; X< 2; X++) { - draw_degree(sp, 0.5, 2.7+0.1*X, 0.5); - glTranslatef( 0.0, 0.1,-1.0); - } + glPushMatrix(); + glPushMatrix(); + glTranslatef(-3.0, 0.1, 2.0); + for (X = 0; X < 2; X++) { + mi->polygon_count += draw_block(0.5, 2.7 + 0.1 * X, 0.5); + glTranslatef(0.0, 0.1, -1.0); + } glPopMatrix(); - glTranslatef(-3.0, 0.0, 3.0); - glPushMatrix(); - - for (X=0; X< 6; X++) { - draw_degree(sp, 0.5, 2.6-0.1*X, 0.5); - glTranslatef( 1.0,-0.1, 0.0); - } - glTranslatef(-1.0,-0.9,-1.0); - for (X=0; X< 5; X++) { - draw_degree(sp, 0.5, 3.0-0.1*X, 0.5); - glTranslatef( 0.0, 0.0,-1.0); - } - glTranslatef(-1.0,-1.1, 1.0); - for (X=0; X< 3; X++) { - draw_degree(sp, 0.5, 3.5-0.1*X, 0.5); - glTranslatef(-1.0,-0.1, 0.0); - } + glTranslatef(-3.0, 0.0, 3.0); + glPushMatrix(); + + for (X = 0; X < 6; X++) { + mi->polygon_count += draw_block(0.5, 2.6 - 0.1 * X, 0.5); + glTranslatef(1.0, -0.1, 0.0); + } + glTranslatef(-1.0, -0.9, -1.0); + for (X = 0; X < 5; X++) { + mi->polygon_count += draw_block(0.5, 3.0 - 0.1 * X, 0.5); + glTranslatef(0.0, 0.0, -1.0); + } + glTranslatef(-1.0, -1.1, 1.0); + for (X = 0; X < 3; X++) { + mi->polygon_count += draw_block(0.5, 3.5 - 0.1 * X, 0.5); + glTranslatef(-1.0, -0.1, 0.0); + } glPopMatrix(); glPopMatrix(); +} + +/*#define DEBUG*/ +/*#define DEBUG_PATH*/ + +static int +draw_sphere(int pos, int tick) +{ + int pos2 = (pos+1) % NPOSITIONS; + GLfloat x1 = ball_positions[pos*3]; + GLfloat y1 = ball_positions[pos*3+1]; + GLfloat z1 = ball_positions[pos*3+2]; + GLfloat x2 = ball_positions[pos2*3]; + GLfloat y2 = ball_positions[pos2*3+1]; + GLfloat z2 = ball_positions[pos2*3+2]; + GLfloat frac = tick / (GLfloat) SPHERE_TICKS; + GLfloat x = x1 + (x2 - x1) * frac; + GLfloat y = y1 + (y2 - y1) * frac + (2 * sin (M_PI * frac)); + GLfloat z = z1 + (z2 - z1) * frac; + int polys = 0; + + glPushMatrix(); - glPushMatrix(); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow); - - glTranslatef((GLfloat) positions[sp->sphere_position], - (GLfloat) positions[sp->sphere_position + 1], - (GLfloat) positions[sp->sphere_position + 2]); - if (sp->sphere_position == 0) /* FUDGE soo its not so obvious */ - mySphere(0.48); - else - mySphere(0.5); - glPopMatrix(); - sp->sphere_position += 3; - if (sp->sphere_position >= NPOSITIONS) - sp->sphere_position = 0; +# ifdef DEBUG_PATH + glVertex3f(x, y, z); + if (tick == 0) { + glVertex3f(x, y-7.5, z); + glVertex3f(x, y, z); glVertex3f(x, y, z-0.6); + glVertex3f(x, y, z); glVertex3f(x, y, z+0.6); + glVertex3f(x, y, z); glVertex3f(x+0.6, y, z); + glVertex3f(x, y, z); glVertex3f(x-0.6, y, z); + glVertex3f(x, y, z); + } + +# else /* !DEBUG_PATH */ + y += 0.5; + glTranslatef(x, y, z); + + glScalef (0.5, 0.5, 0.5); + + /* make ball a little smaller on the gap to obscure distance */ + if (pos == NPOSITIONS-1) + glScalef (0.95, 0.95, 0.95); + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow); + glDisable (GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glFrontFace(GL_CW); + polys += unit_sphere (32, 32, False); + glShadeModel(GL_FLAT); + glEnable (GL_TEXTURE_2D); +#endif /* !DEBUG_PATH */ + + glPopMatrix(); + return polys; } -static void -reshape(ModeInfo * mi, int width, int height) + + +ENTRYPOINT void +reshape_stairs (ModeInfo * mi, int width, int height) { stairsstruct *sp = &stairs[MI_SCREEN(mi)]; @@ -354,11 +332,64 @@ reshape(ModeInfo * mi, int width, int height) } } -static void -pinit(ModeInfo * mi) +ENTRYPOINT Bool +stairs_handle_event (ModeInfo *mi, XEvent *event) { -/* stairsstruct *sp = &stairs[MI_SCREEN(mi)];*/ + stairsstruct *sp = &stairs[MI_SCREEN(mi)]; + + if (event->xany.type == ButtonPress && + event->xbutton.button == Button1) + { + sp->button_down_p = True; + gltrackball_start (sp->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) + { + sp->button_down_p = False; + return True; + } + else if (event->xany.type == ButtonPress && + (event->xbutton.button == Button4 || + event->xbutton.button == Button5 || + event->xbutton.button == Button6 || + event->xbutton.button == Button7)) + { + gltrackball_mousewheel (sp->trackball, event->xbutton.button, 10, + !!event->xbutton.state); + return True; + } + else if (event->xany.type == MotionNotify && + sp->button_down_p) + { + gltrackball_track (sp->trackball, + event->xmotion.x, event->xmotion.y, + MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + else if (event->xany.type == KeyPress) + { + KeySym keysym; + char c = 0; + XLookupString (&event->xkey, &c, 1, &keysym, 0); + if (c == ' ') + { + gltrackball_reset (sp->trackball); + return True; + } + } + + return False; +} + +static void +pinit(void) +{ + int status; glClearDepth(1.0); glClearColor(0.0, 0.0, 0.0, 1.0); @@ -374,18 +405,30 @@ pinit(ModeInfo * mi) glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_NORMALIZE); - glFrontFace(GL_CCW); glCullFace(GL_BACK); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_CULL_FACE); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - gluBuild2DMipmaps(GL_TEXTURE_2D, 3, WoodTextureWidth, WoodTextureHeight, - GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData); + + clear_gl_error(); + status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, + WoodTextureWidth, WoodTextureHeight, + GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData); + if (status) + { + const char *s = (char *) gluErrorString (status); + fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n", + progname, WoodTextureWidth, WoodTextureHeight, + (s ? s : "(unknown)")); + exit (1); + } + check_gl_error("mipmapping"); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); @@ -396,8 +439,8 @@ pinit(ModeInfo * mi) glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); } -void -init_stairs(ModeInfo * mi) +ENTRYPOINT void +init_stairs (ModeInfo * mi) { int screen = MI_SCREEN(mi); stairsstruct *sp; @@ -408,24 +451,28 @@ init_stairs(ModeInfo * mi) return; } sp = &stairs[screen]; + sp->step = 0.0; - sp->direction = LRAND() & 1; - sp->sphere_position = NRAND(NPOSITIONS / 3) * 3; + sp->rotating = 0; + sp->sphere_position = NRAND(NPOSITIONS); + sp->sphere_tick = 0; if ((sp->glx_context = init_GL(mi)) != NULL) { - reshape(mi, MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi)); + reshape_stairs(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); glDrawBuffer(GL_BACK); - if (!glIsList(objects)) - objects = glGenLists(1); - pinit(mi); + if (!glIsList(sp->objects)) + sp->objects = glGenLists(1); + pinit(); } else { - MI_CLEARWINDOW(mi); + MI_CLEARWINDOW(mi); } + + sp->trackball = gltrackball_init (); } -void -draw_stairs(ModeInfo * mi) +ENTRYPOINT void +draw_stairs (ModeInfo * mi) { stairsstruct *sp = &stairs[MI_SCREEN(mi)]; @@ -443,32 +490,80 @@ draw_stairs(ModeInfo * mi) glTranslatef(0.0, 0.0, -10.0); - if (!MI_WIN_IS_ICONIC(mi)) { + if (!MI_IS_ICONIC(mi)) { glScalef(Scale4Window * sp->WindH / sp->WindW, Scale4Window, Scale4Window); } else { glScalef(Scale4Iconic * sp->WindH / sp->WindW, Scale4Iconic, Scale4Iconic); } + gltrackball_rotate (sp->trackball); + + glTranslatef(0, 0.5, 0); glRotatef(44.5, 1, 0, 0); - glRotatef(50 + ((sp->direction) ? 1 : -1 ) * - ((sp->step * 100 > 120) ? sp->step * 100 - 120 : 0), 0, 1, 0); - if (sp->step * 100 >= 360 + 120) { /* stop showing secrets */ - sp->step = 0; - sp->direction = LRAND() & 1; - } - draw_stairs_internal(mi); + glRotatef(50, 0, 1, 0); + + if (!sp->rotating) { + if ((LRAND() % 500) == 0) + sp->rotating = (LRAND() & 1) ? 1 : -1; + } + + if (sp->rotating) { + glRotatef(sp->rotating * sp->step, 0, 1, 0); + if (sp->step >= 360) { + sp->rotating = 0; + sp->step = 0; + } + +# ifndef DEBUG + if (!sp->button_down_p) + sp->step += 2; +# endif /* DEBUG */ + } + + draw_stairs_internal(mi); + + +# ifdef DEBUG + { + int i, j; +# ifdef DEBUG_PATH + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); + glBegin (GL_LINE_LOOP); +# endif /* DEBUG_PATH */ + for (i = 0; i < NPOSITIONS; i ++) + for (j = 0; j < SPHERE_TICKS; j++) + mi->polygon_count += draw_sphere(i, j); +# ifdef DEBUG_PATH + glEnd(); + glEnable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); +# endif /* DEBUG_PATH */ + } +#else /* !DEBUG */ + mi->polygon_count += draw_sphere(sp->sphere_position, sp->sphere_tick); +#endif /* !DEBUG */ + + if (sp->button_down_p) + ; + else if (++sp->sphere_tick >= SPHERE_TICKS) + { + sp->sphere_tick = 0; + if (++sp->sphere_position >= NPOSITIONS) + sp->sphere_position = 0; + } glPopMatrix(); + if (mi->fps_p) do_fps (mi); glFlush(); glXSwapBuffers(display, window); - - sp->step += 0.025; } -void -change_stairs(ModeInfo * mi) +#ifndef STANDALONE +ENTRYPOINT void +change_stairs (ModeInfo * mi) { stairsstruct *sp = &stairs[MI_SCREEN(mi)]; @@ -476,20 +571,27 @@ change_stairs(ModeInfo * mi) return; glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context)); - pinit(mi); + pinit(); } +#endif /* !STANDALONE */ -void -release_stairs(ModeInfo * mi) +ENTRYPOINT void +release_stairs (ModeInfo * mi) { if (stairs != NULL) { - (void) free((void *) stairs); - stairs = NULL; - } - if (glIsList(objects)) { - glDeleteLists(objects, 1); + int i; + for (i = 0; i < MI_NUM_SCREENS(mi); i++) { + stairsstruct *sp = &stairs[i]; + if (glIsList(sp->objects)) { + glDeleteLists(sp->objects, 1); + } + } + free(stairs); + stairs = NULL; } FreeAllGL(mi); } +XSCREENSAVER_MODULE ("Stairs", stairs) + #endif