X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fboing.c;h=22d512bf808ae1219c323751bfe0967f0d0d3655;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hp=828c754718a66a351983b0871d313d3d5dabca58;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/glx/boing.c b/hacks/glx/boing.c index 828c7547..22d512bf 100644 --- a/hacks/glx/boing.c +++ b/hacks/glx/boing.c @@ -1,4 +1,4 @@ -/* boing, Copyright (c) 2005 Jamie Zawinski +/* boing, Copyright (c) 2005-2014 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 @@ -42,7 +42,7 @@ #define DEF_SMOOTH "False" #define DEF_SCANLINES "True" #define DEF_SPEED "1.0" -#define DEF_SIZE "0.5" +#define DEF_BALL_SIZE "0.5" #define DEF_ANGLE "15" #define DEF_MERIDIANS "16" #define DEF_PARALLELS "8" @@ -62,6 +62,8 @@ typedef struct { trackball_state *trackball; Bool button_down_p; + GLfloat speed; + GLuint ball_list; double ball_x, ball_y, ball_z, ball_th; double ball_dx, ball_dy, ball_dz, ball_dth; @@ -109,6 +111,8 @@ static XrmOptionDescRec opts[] = { { "-ball-color2",".ballColor2",XrmoptionSepArg, 0 }, { "-grid-color", ".gridColor", XrmoptionSepArg, 0 }, { "-shadow-color",".shadowColor",XrmoptionSepArg, 0 }, + { "-background", ".boingBackground",XrmoptionSepArg, 0 }, + { "-bg", ".boingBackground",XrmoptionSepArg, 0 }, }; static argtype vars[] = { @@ -118,7 +122,7 @@ static argtype vars[] = { {&scanlines_p,"scanlines","Scanlines", DEF_SCANLINES, t_Bool}, {&speed, "speed", "Speed", DEF_SPEED, t_Float}, {&angle, "angle", "Angle", DEF_ANGLE, t_Int}, - {&ball_size, "ballSize", "BallSize", DEF_SIZE, t_Float}, + {&ball_size, "ballSize", "BallSize", DEF_BALL_SIZE, t_Float}, {&meridians, "meridians", "meridians", DEF_MERIDIANS, t_Int}, {¶llels, "parallels", "parallels", DEF_PARALLELS, t_Int}, {&tiles, "tiles", "Tiles", DEF_TILES, t_Int}, @@ -376,7 +380,7 @@ draw_scanlines (ModeInfo *mi) int lh, ls; int y; glLoadIdentity(); - gluOrtho2D (0, w, 0, h); + glOrtho (0, w, 0, h, -1, 1); if (h > 500) lh = 4, ls = 4; else if (h > 300) lh = 2, ls = 1; @@ -427,10 +431,10 @@ tick_physics (ModeInfo *mi) bp->ball_x += bp->ball_dx; if (bp->ball_x < min) bp->ball_x = min, bp->ball_dx = -bp->ball_dx, bp->ball_dth = -bp->ball_dth, - bp->ball_dx += (frand(speed/2) - speed); + bp->ball_dx += (frand(bp->speed/2) - bp->speed); else if (bp->ball_x > max) bp->ball_x = max, bp->ball_dx = -bp->ball_dx, bp->ball_dth = -bp->ball_dth, - bp->ball_dx += (frand(speed/2) - speed); + bp->ball_dx += (frand(bp->speed/2) - bp->speed); bp->ball_dy += bp->ball_ddy; bp->ball_y += bp->ball_dy; @@ -459,6 +463,13 @@ reshape_boing (ModeInfo *mi, int width, int height) glMatrixMode(GL_PROJECTION); glLoadIdentity(); + + if (height > width) + { + GLfloat s = width / (GLfloat) height; + glScalef (s, s, s); + } + gluPerspective (8.0, 1/h, 1.0, 10.0); glMatrixMode(GL_MODELVIEW); @@ -476,37 +487,10 @@ boing_handle_event (ModeInfo *mi, XEvent *event) { boing_configuration *bp = &bps[MI_SCREEN(mi)]; - if (event->xany.type == ButtonPress && - event->xbutton.button == Button1) - { - bp->button_down_p = True; - gltrackball_start (bp->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) - { - bp->button_down_p = False; - return True; - } - else if (event->xany.type == ButtonPress && - (event->xbutton.button == Button4 || - event->xbutton.button == Button5)) - { - gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10, - !!event->xbutton.state); - return True; - } - else if (event->xany.type == MotionNotify && - bp->button_down_p) - { - gltrackball_track (bp->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } + if (gltrackball_event_handler (event, bp->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &bp->button_down_p)) + return True; return False; } @@ -518,16 +502,7 @@ init_boing (ModeInfo *mi) boing_configuration *bp; int wire = MI_IS_WIREFRAME(mi); - if (!bps) { - bps = (boing_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (boing_configuration)); - if (!bps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - - bp = &bps[MI_SCREEN(mi)]; - } + MI_INIT (mi, bps, NULL); bp = &bps[MI_SCREEN(mi)]; @@ -588,18 +563,18 @@ init_boing (ModeInfo *mi) glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - speed = speed / 800.0; + bp->speed = speed / 800.0; - bp->ball_dth = (spin ? -speed * 7 * 360 : 0); + bp->ball_dth = (spin ? -bp->speed * 7 * 360 : 0); bp->ball_x = 0.5 - ((ball_size/2) + frand(1-ball_size)); bp->ball_y = 0.2; - bp->ball_dx = speed * 6 + frand(speed); - bp->ball_ddy = -speed; + bp->ball_dx = bp->speed * 6 + frand(bp->speed); + bp->ball_ddy = -bp->speed; - bp->ball_dz = speed * 6 + frand(speed); + bp->ball_dz = bp->speed * 6 + frand(bp->speed); - bp->trackball = gltrackball_init (); + bp->trackball = gltrackball_init (False); } @@ -627,6 +602,20 @@ draw_boing (ModeInfo *mi) tick_physics (mi); glPushMatrix (); + + { + double rot = current_device_rotation(); + glRotatef(rot, 0, 0, 1); +/* + if ((rot > 45 && rot < 135) || + (rot < -45 && rot > -135)) + { + GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi); + glScalef (1/s, s, 1); + } +*/ + } + gltrackball_rotate (bp->trackball); glLightfv (GL_LIGHT0, GL_POSITION, bp->lightpos);