X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fflyingtoasters.c;h=19a58972b9f98424e4740c3bf9be1686f94aab9d;hb=78add6e627ee5f10e1fa6f3852602ea5066eee5a;hp=52e59586db08d610b44b1ea06ea4b022111250f4;hpb=6b1c86cf395f59389e4ece4ea8f4bea2c332745b;p=xscreensaver diff --git a/hacks/glx/flyingtoasters.c b/hacks/glx/flyingtoasters.c index 52e59586..19a58972 100644 --- a/hacks/glx/flyingtoasters.c +++ b/hacks/glx/flyingtoasters.c @@ -1,4 +1,4 @@ -/* flyingtoasters, Copyright (c) 2003-2006 Jamie Zawinski +/* flyingtoasters, Copyright (c) 2003-2018 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 @@ -32,7 +32,7 @@ /* #define DEBUG */ -# define refresh_toasters 0 +# define free_toasters 0 # define release_toasters 0 #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -47,11 +47,15 @@ #include "xlockmore.h" #include "gltrackball.h" -#include "xpm-ximage.h" +#include "ximage-loader.h" #include -#include "../images/chromesphere.xpm" -#include "../images/toast.xpm" +#define HAVE_TEXTURE +#ifdef HAVE_TEXTURE +# include "images/gen/chromesphere_png.h" +# include "images/gen/toast_png.h" +#endif /* HAVE_TEXTURE */ + #ifdef USE_GL /* whole file */ @@ -118,8 +122,11 @@ typedef struct { int track_tick; GLuint *dlists; + +# ifdef HAVE_TEXTURE GLuint chrome_texture; GLuint toast_texture; +# endif int nfloaters; floater *floaters; @@ -284,8 +291,15 @@ ENTRYPOINT void reshape_toasters (ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; + + if (width > height * 5) { /* tiny window: show middle */ + height = width * 9/16; + y = -height/2; + h = height / (GLfloat) width; + } - glViewport (0, 0, (GLint) width, (GLint) height); + glViewport (0, y, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -297,6 +311,14 @@ reshape_toasters (ModeInfo *mi, int width, int height) 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); +# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */ + { + int o = (int) current_device_rotation(); + if (o != 0 && o != 180 && o != -180) + glScalef (1/h, 1/h, 1/h); + } +# endif + glClear(GL_COLOR_BUFFER_BIT); } @@ -306,90 +328,62 @@ toasters_handle_event (ModeInfo *mi, XEvent *event) { toaster_configuration *bp = &bps[MI_SCREEN(mi)]; - if (event->xany.type == ButtonPress && - event->xbutton.button == Button1) - { - bp->button_down_p = True; - gltrackball_start (bp->user_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->user_trackball, event->xbutton.button, 5, - !event->xbutton.state); - return True; - } - else if (event->xany.type == MotionNotify && - bp->button_down_p) - { - gltrackball_track (bp->user_trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } + if (gltrackball_event_handler (event, bp->user_trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &bp->button_down_p)) + return True; return False; } +#ifdef HAVE_TEXTURE + static void load_textures (ModeInfo *mi) { toaster_configuration *bp = &bps[MI_SCREEN(mi)]; XImage *xi; - xi = xpm_to_ximage (mi->dpy, mi->xgwa.visual, mi->xgwa.colormap, - chromesphere_xpm); + xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual, + chromesphere_png, sizeof(chromesphere_png)); clear_gl_error(); +#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */ glGenTextures (1, &bp->chrome_texture); glBindTexture (GL_TEXTURE_2D, bp->chrome_texture); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, - xi->width, xi->height, 0, - GL_RGBA, - /* GL_UNSIGNED_BYTE, */ - GL_UNSIGNED_INT_8_8_8_8_REV, - xi->data); + xi->width, xi->height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, xi->data); check_gl_error("texture"); + XDestroyImage (xi); + xi = 0; +#endif - xi = xpm_to_ximage (mi->dpy, mi->xgwa.visual, mi->xgwa.colormap, - toast_xpm); + xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual, + toast_png, sizeof(toast_png)); glGenTextures (1, &bp->toast_texture); glBindTexture (GL_TEXTURE_2D, bp->toast_texture); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - 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_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, xi->width, xi->height, 0, - GL_RGBA, - /* GL_UNSIGNED_BYTE, */ - GL_UNSIGNED_INT_8_8_8_8_REV, - xi->data); + GL_RGBA, GL_UNSIGNED_BYTE, xi->data); check_gl_error("texture"); - - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glEnable(GL_TEXTURE_2D); + XDestroyImage (xi); + xi = 0; } +#endif /* HAVE_TEXTURE */ + + ENTRYPOINT void init_toasters (ModeInfo *mi) @@ -398,16 +392,7 @@ init_toasters (ModeInfo *mi) int wire = MI_IS_WIREFRAME(mi); int i; - if (!bps) { - bps = (toaster_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (toaster_configuration)); - if (!bps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - - bp = &bps[MI_SCREEN(mi)]; - } + MI_INIT (mi, bps); bp = &bps[MI_SCREEN(mi)]; @@ -440,10 +425,12 @@ init_toasters (ModeInfo *mi) glLightfv(GL_LIGHT0, GL_SPECULAR, spc); } +# ifdef HAVE_TEXTURE if (!wire && do_texture) load_textures (mi); +# endif - bp->user_trackball = gltrackball_init (); + bp->user_trackball = gltrackball_init (False); auto_track_init (mi); bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint)); @@ -467,6 +454,7 @@ init_toasters (ModeInfo *mi) glScalef (6, 6, 6); glBindTexture (GL_TEXTURE_2D, 0); + glDisable (GL_TEXTURE_2D); if (i == BASE_TOASTER) { @@ -476,10 +464,19 @@ init_toasters (ModeInfo *mi) glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); +#ifdef HAVE_TEXTURE if (do_texture) - glBindTexture (GL_TEXTURE_2D, bp->chrome_texture); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + { +#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */ + glEnable (GL_TEXTURE_2D); + glEnable (GL_TEXTURE_GEN_S); + glEnable (GL_TEXTURE_GEN_T); + glBindTexture (GL_TEXTURE_2D, bp->chrome_texture); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); +#endif + } +# endif } else if (i == TOAST || i == TOAST_BITTEN) { @@ -489,10 +486,17 @@ init_toasters (ModeInfo *mi) glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny); +#ifdef HAVE_TEXTURE if (do_texture) - glBindTexture (GL_TEXTURE_2D, bp->toast_texture); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + { + glEnable (GL_TEXTURE_2D); + glEnable (GL_TEXTURE_GEN_S); + glEnable (GL_TEXTURE_GEN_T); + glBindTexture (GL_TEXTURE_2D, bp->toast_texture); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + } +# endif glMatrixMode(GL_TEXTURE); glTranslatef(0.5, 0.5, 0); @@ -797,10 +801,14 @@ draw_toasters (ModeInfo *mi) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); + glRotatef(current_device_rotation(), 0, 0, 1); glRotatef(bp->view_x, 1, 0, 0); glRotatef(bp->view_y, 0, 1, 0); - gltrackball_rotate (bp->user_trackball); + /* Rotate the scene around a point that's a little deeper in. */ + glTranslatef (0, 0, -50); + gltrackball_rotate (bp->user_trackball); + glTranslatef (0, 0, 50); #if 0 {