X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fbouncingcow.c;h=2229f7157d13c1a043e74bc6fd4901267112e221;hb=39809ded547bdbb08207d3e514950425215b4410;hp=21ece3c7dc714d70dc88716f40f40faf61ac0974;hpb=f8cf5ac7b2f53510f80a0eaf286a25298be17bfe;p=xscreensaver diff --git a/hacks/glx/bouncingcow.c b/hacks/glx/bouncingcow.c index 21ece3c7..2229f715 100644 --- a/hacks/glx/bouncingcow.c +++ b/hacks/glx/bouncingcow.c @@ -1,4 +1,4 @@ -/* bouncingcow, Copyright (c) 2003-2006 Jamie Zawinski +/* bouncingcow, Copyright (c) 2003-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 @@ -16,7 +16,7 @@ "*showFPS: False \n" \ "*wireframe: False \n" \ -# define refresh_cow 0 +# define free_cow 0 # define release_cow 0 #define DEF_SPEED "1.0" #define DEF_TEXTURE "(none)" @@ -156,8 +156,15 @@ ENTRYPOINT void reshape_cow (ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; - glViewport (0, 0, (GLint) width, (GLint) height); + if (width > height * 5) { /* tiny window: show middle */ + height = width * 9/16; + y = -height/2; + h = height / (GLfloat) width; + } + + glViewport (0, y, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -178,39 +185,10 @@ cow_handle_event (ModeInfo *mi, XEvent *event) { cow_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 || - 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) - { - 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; } @@ -240,6 +218,7 @@ load_texture (ModeInfo *mi, const char *filename) } image = xpm_file_to_ximage (dpy, visual, cmap, filename); + if (!image) return False; clear_gl_error(); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, @@ -267,14 +246,7 @@ init_cow (ModeInfo *mi) int i; Bool tex_p = False; - if (!bps) { - bps = (cow_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (cow_configuration)); - if (!bps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - } + MI_INIT (mi, bps); bp = &bps[MI_SCREEN(mi)]; @@ -307,7 +279,7 @@ init_cow (ModeInfo *mi) glLightfv(GL_LIGHT0, GL_SPECULAR, spc); } - bp->trackball = gltrackball_init (); + bp->trackball = gltrackball_init (False); bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint)); for (i = 0; i < countof(all_objs); i++) @@ -334,8 +306,6 @@ init_cow (ModeInfo *mi) /* 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); @@ -357,8 +327,8 @@ init_cow (ModeInfo *mi) } 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); - } + glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128); + } else if (i == TAIL) { GLfloat color[4] = {0.63, 0.43, 0.36, 1.00}; @@ -447,6 +417,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) { @@ -500,8 +472,16 @@ draw_cow (ModeInfo *mi) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); - gltrackball_rotate (bp->trackball); - glRotatef(current_device_rotation(), 0, 0, 1); + +# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */ + { + GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi); + int o = (int) current_device_rotation(); + if (o != 0 && o != 180 && o != -180) + glScalef (1/h, 1/h, 1/h); + glRotatef(o, 0, 0, 1); + } +# endif glScalef (0.5, 0.5, 0.5);