"*showFPS: False \n"
# define refresh_stairs 0
+# define release_stairs 0
# include "xlockmore.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#ifdef USE_GL
+#if 0
#include "e_textures.h"
+#else
+#include "xpm-ximage.h"
+#include "../images/wood.xpm"
+#endif
+
#include "sphere.h"
#include "gltrackball.h"
#ifdef USE_MODULES
ModStruct stairs_description =
-{"stairs", "init_stairs", "draw_stairs", "release_stairs",
+{"stairs", "init_stairs", "draw_stairs", NULL,
"draw_stairs", "change_stairs", NULL, &stairs_opts,
1000, 1, 1, 1, 4, 1.0, "",
"Shows Infinite Stairs, an Escher-like scene", 0, NULL};
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow);
glDisable (GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
+ glFrontFace(GL_CCW);
polys += unit_sphere (32, 32, False);
glShadeModel(GL_FLAT);
glEnable (GL_TEXTURE_2D);
{
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;
- }
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
+ return True;
else if (event->xany.type == KeyPress)
{
KeySym keysym;
char c = 0;
XLookupString (&event->xkey, &c, 1, &keysym, 0);
- if (c == ' ')
+ if (c == ' ' || c == '\t')
{
- gltrackball_reset (sp->trackball);
+ gltrackball_reset (sp->trackball, 0, 0);
return True;
}
}
static void
-pinit(void)
+pinit(ModeInfo *mi)
{
- int status;
+ /* int status; */
glClearDepth(1.0);
- glClearColor(0.0, 0.0, 0.0, 1.0);
-
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, position0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+#if 0
clear_gl_error();
status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
WoodTextureWidth, WoodTextureHeight,
exit (1);
}
check_gl_error("mipmapping");
+#else
+ {
+ XImage *img = xpm_to_ximage (mi->dpy,
+ mi->xgwa.visual,
+ mi->xgwa.colormap,
+ wood_texture);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ img->width, img->height, 0,
+ GL_RGBA,
+ /* GL_UNSIGNED_BYTE, */
+ GL_UNSIGNED_INT_8_8_8_8_REV,
+ img->data);
+ check_gl_error("texture");
+ XDestroyImage (img);
+ }
+#endif
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
}
+static void free_stairs (ModeInfo * mi);
+
ENTRYPOINT void
init_stairs (ModeInfo * mi)
{
int screen = MI_SCREEN(mi);
stairsstruct *sp;
- if (stairs == NULL) {
- if ((stairs = (stairsstruct *) calloc(MI_NUM_SCREENS(mi),
- sizeof (stairsstruct))) == NULL)
- return;
- }
+ MI_INIT (mi, stairs, free_stairs);
sp = &stairs[screen];
sp->step = 0.0;
glDrawBuffer(GL_BACK);
if (!glIsList(sp->objects))
sp->objects = glGenLists(1);
- pinit();
+ pinit(mi);
} else {
MI_CLEARWINDOW(mi);
}
- sp->trackball = gltrackball_init ();
+ sp->trackball = gltrackball_init (False);
}
ENTRYPOINT void
draw_stairs (ModeInfo * mi)
{
stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+ GLfloat rot = current_device_rotation();
Display *display = MI_DISPLAY(mi);
Window window = MI_WINDOW(mi);
glPushMatrix();
+ glRotatef(rot, 0, 0, 1);
+
glTranslatef(0.0, 0.0, -10.0);
if (!MI_IS_ICONIC(mi)) {
glScalef(Scale4Iconic * sp->WindH / sp->WindW, Scale4Iconic, Scale4Iconic);
}
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ if (rot != 0 && rot != 180 && rot != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
gltrackball_rotate (sp->trackball);
glTranslatef(0, 0.5, 0);
}
#endif /* !STANDALONE */
-ENTRYPOINT void
-release_stairs (ModeInfo * mi)
+static void
+free_stairs (ModeInfo * mi)
{
- if (stairs != NULL) {
- 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;
+ stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+ if (glIsList(sp->objects)) {
+ glDeleteLists(sp->objects, 1);
}
- FreeAllGL(mi);
}
XSCREENSAVER_MODULE ("Stairs", stairs)