X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fbouncingcow.c;h=b769c1172c9eea34f4dc829bf6c5da125c77e1da;hb=6f5482d73adb0165c0130bb47d852644ab0c4869;hp=667dd1e8486ca8a473ea5cf14f94fe3ad8161554;hpb=40eacb5812ef7c0e3374fb139afbb4f5bc8bbfb5;p=xscreensaver diff --git a/hacks/glx/bouncingcow.c b/hacks/glx/bouncingcow.c index 667dd1e8..b769c117 100644 --- a/hacks/glx/bouncingcow.c +++ b/hacks/glx/bouncingcow.c @@ -1,4 +1,4 @@ -/* bouncingcow, Copyright (c) 2003 Jamie Zawinski +/* bouncingcow, Copyright (c) 2003-2006 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -11,29 +11,15 @@ * Boing, boing, boing. Cow, cow, cow. */ -#include - -extern XtAppContext app; - -#define PROGCLASS "BouncingCow" -#define HACK_INIT init_cow -#define HACK_DRAW draw_cows -#define HACK_RESHAPE reshape_cow -#define HACK_HANDLE_EVENT cow_handle_event -#define EVENT_MASK PointerMotionMask -#define sws_opts xlockmore_opts - -#define DEF_SPEED "1.0" -#define DEF_TEXTURE "(none)" - #define DEFAULTS "*delay: 30000 \n" \ "*count: 1 \n" \ "*showFPS: False \n" \ "*wireframe: False \n" \ - "*speed: " DEF_SPEED " \n" \ - "*texture: " DEF_TEXTURE "\n" \ -/* #define DEBUG */ +# define refresh_cow 0 +# define release_cow 0 +#define DEF_SPEED "1.0" +#define DEF_TEXTURE "(none)" #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -51,15 +37,12 @@ extern XtAppContext app; #ifdef USE_GL /* whole file */ -#include - - #include "gllist.h" extern struct gllist *cow_face, *cow_hide, *cow_hoofs, *cow_horns, *cow_tail, *cow_udder; -struct gllist **all_objs[] = { +static struct gllist **all_objs[] = { &cow_face, &cow_hide, &cow_hoofs, &cow_horns, &cow_tail, &cow_udder }; @@ -100,15 +83,15 @@ static const char *do_texture; static XrmOptionDescRec opts[] = { { "-speed", ".speed", XrmoptionSepArg, 0 }, {"-texture", ".texture", XrmoptionSepArg, 0 }, - {"+texture", ".texture", XrmoptionNoArg, (caddr_t) "(none)" }, + {"+texture", ".texture", XrmoptionNoArg, "(none)" }, }; static argtype vars[] = { - {(caddr_t *) &speed, "speed", "Speed", DEF_SPEED, t_Float}, - {(caddr_t *) &do_texture, "texture", "Texture", DEF_TEXTURE, t_String}, + {&speed, "speed", "Speed", DEF_SPEED, t_Float}, + {&do_texture, "texture", "Texture", DEF_TEXTURE, t_String}, }; -ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL}; +ENTRYPOINT ModeSpecOpt cow_opts = {countof(opts), opts, countof(vars), vars, NULL}; #define BOTTOM 28.0 @@ -169,7 +152,7 @@ tick_floater (ModeInfo *mi, floater *f) /* Window management, etc */ -void +ENTRYPOINT void reshape_cow (ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; @@ -190,13 +173,13 @@ reshape_cow (ModeInfo *mi, int width, int height) } -Bool +ENTRYPOINT Bool cow_handle_event (ModeInfo *mi, XEvent *event) { cow_configuration *bp = &bps[MI_SCREEN(mi)]; if (event->xany.type == ButtonPress && - event->xbutton.button & Button1) + event->xbutton.button == Button1) { bp->button_down_p = True; gltrackball_start (bp->trackball, @@ -205,11 +188,21 @@ cow_handle_event (ModeInfo *mi, XEvent *event) return True; } else if (event->xany.type == ButtonRelease && - event->xbutton.button & Button1) + event->xbutton.button == Button1) { bp->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 (bp->trackball, event->xbutton.button, 10, + !event->xbutton.state); + return True; + } else if (event->xany.type == MotionNotify && bp->button_down_p) { @@ -261,25 +254,18 @@ load_texture (ModeInfo *mi, const char *filename) glPixelStorei (GL_UNPACK_ALIGNMENT, 4); glPixelStorei (GL_UNPACK_ROW_LENGTH, image->width); - glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glEnable(GL_TEXTURE_2D); + return True; } -void +ENTRYPOINT void init_cow (ModeInfo *mi) { cow_configuration *bp; int wire = MI_IS_WIREFRAME(mi); int i; + Bool tex_p = False; if (!bps) { bps = (cow_configuration *) @@ -288,8 +274,6 @@ init_cow (ModeInfo *mi) fprintf(stderr, "%s: out of memory\n", progname); exit(1); } - - bp = &bps[MI_SCREEN(mi)]; } bp = &bps[MI_SCREEN(mi)]; @@ -329,45 +313,48 @@ init_cow (ModeInfo *mi) for (i = 0; i < countof(all_objs); i++) bp->dlists[i] = glGenLists (1); + tex_p = load_texture (mi, do_texture); + if (tex_p) + glBindTexture (GL_TEXTURE_2D, bp->texture); + for (i = 0; i < countof(all_objs); i++) { GLfloat black[4] = {0, 0, 0, 1}; - struct gllist *gll = *all_objs[i]; - if (wire) - gll->primitive = GL_LINE_LOOP; + const struct gllist *gll = *all_objs[i]; glNewList (bp->dlists[i], GL_COMPILE); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glMatrixMode(GL_MODELVIEW); - - glBindTexture (GL_TEXTURE_2D, 0); + glDisable (GL_TEXTURE_2D); if (i == HIDE) { GLfloat color[4] = {0.63, 0.43, 0.36, 1.00}; - - if (load_texture (mi, do_texture)) + if (tex_p) { - glBindTexture (GL_TEXTURE_2D, bp->texture); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - /* approximately line it up with ../images/earth.xpm */ - glMatrixMode(GL_TEXTURE); - glTranslatef(0.45, 0.58, 0); - glScalef(0.08, 0.16, 1); - glRotatef(-5, 0, 0, 1); - glMatrixMode(GL_MODELVIEW); - /* if we have a texture, make the base color be white. */ color[0] = color[1] = color[2] = 1.0; - } + glEnable (GL_TEXTURE_2D); + + glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_2D); + + /* approximately line it up with ../images/earth.xpm */ + glMatrixMode (GL_TEXTURE); + glLoadIdentity(); + glTranslatef (0.45, 0.58, 0); + glScalef (0.08, 0.16, 1); + glRotatef (-5, 0, 0, 1); + glMatrixMode (GL_MODELVIEW); + } glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128); @@ -414,12 +401,7 @@ init_cow (ModeInfo *mi) glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); } - renderList (gll); - - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + renderList (gll, wire); glEndList (); } @@ -465,6 +447,8 @@ draw_floater (ModeInfo *mi, floater *f) glPushMatrix(); glTranslatef (f->x, f->y, f->z); + gltrackball_rotate (bp->trackball); + glRotatef (y * 360, 0.0, 1.0, 0.0); if (f->spinner_p) { @@ -502,8 +486,8 @@ draw_floater (ModeInfo *mi, floater *f) -void -draw_cows (ModeInfo *mi) +ENTRYPOINT void +draw_cow (ModeInfo *mi) { cow_configuration *bp = &bps[MI_SCREEN(mi)]; Display *dpy = MI_DISPLAY(mi); @@ -513,10 +497,12 @@ draw_cows (ModeInfo *mi) 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 (); - gltrackball_rotate (bp->trackball); + glRotatef(current_device_rotation(), 0, 0, 1); glScalef (0.5, 0.5, 0.5); @@ -553,4 +539,6 @@ draw_cows (ModeInfo *mi) glXSwapBuffers(dpy, window); } +XSCREENSAVER_MODULE_2 ("BouncingCow", bouncingcow, cow) + #endif /* USE_GL */