From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / timetunnel.c
index c74410198fa1b6ab10749448cca450516f8713b9..1dd5065ddc86f1a5d479defd90fbdca10daf3fc0 100644 (file)
@@ -1,5 +1,5 @@
 /* timetunnel. Based on dangerball.c, hack by Sean Brennan <zettix@yahoo.com>*/
-/* dangerball, Copyright (c) 2001-2004 Jamie Zawinski <jwz@jwz.org>
+/* dangerball, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -33,7 +33,6 @@
 #include "rotator.h"
 #include "gltrackball.h"
 
-
 #define DEF_START      "0.00"
 #define DEF_DILATE     "1.00"
 #define DEF_END                "27.79"
@@ -377,37 +376,10 @@ tunnel_handle_event (ModeInfo *mi, XEvent *event)
 {
   tunnel_configuration *tc = &tconf[MI_SCREEN(mi)];
 
-  if (event->xany.type == ButtonPress &&
-      event->xbutton.button == Button1)
-    {
-      tc->button_down_p = True;
-      gltrackball_start (tc->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)
-    {
-      tc->button_down_p = False;
-      return True;
-    }
-  else if (event->xany.type == ButtonPress &&
-           (event->xbutton.button == Button4 ||
-            event->xbutton.button == Button5))
-    {
-      gltrackball_mousewheel (tc->trackball, event->xbutton.button, 10,
-                              !!event->xbutton.state);
-      return True;
-    }
-  else if (event->xany.type == MotionNotify &&
-           tc->button_down_p)
-    {
-      gltrackball_track (tc->trackball,
-                         event->xmotion.x, event->xmotion.y,
-                         MI_WIDTH (mi), MI_HEIGHT (mi));
-      return True;
-    }
+  if (gltrackball_event_handler (event, tc->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &tc->button_down_p))
+    return True;
 
   return False;
 }
@@ -486,6 +458,7 @@ static void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z,  float al
                GLuint tex, int blend_mode)
 {
 
+#ifndef HAVE_JWZGLES
        if (alpha > 0.0) {
                mi->polygon_count ++;
                /* glEnable(GL_BLEND); */
@@ -527,6 +500,7 @@ static void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z,  float al
                /* glDisable(GL_BLEND); */
 
        }
+#endif /* !HAVE_JWZGLES */
 } /* draw sign */
 
 
@@ -535,6 +509,7 @@ static void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z,  float al
    tunnel does not move, and is acutally a display list.  if alpha = 0, skip */
 static void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int texnum, int listnum, int shiftnum)
 {
+#ifndef HAVE_JWZGLES
        if (alpha > 0.0) {
                if (listnum  ==  tc->diamondlist)
                        mi->polygon_count += 4;
@@ -559,6 +534,7 @@ static void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int te
                glMatrixMode(GL_MODELVIEW); 
                /* glDisable(GL_BLEND); */
        }
+#endif /* HAVE_JWZGLES */
 }
 
 
@@ -902,6 +878,7 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t
        }
 
        if (rescale) {
+#ifndef HAVE_JWZGLES
                tmpbuf = calloc(bx * by * 4, sizeof(unsigned char));
                if (gluScaleImage(GL_RGBA, teximage->width, teximage->height, GL_UNSIGNED_BYTE, teximage->data,
                                bx, by, GL_UNSIGNED_BYTE, tmpbuf))
@@ -911,6 +888,7 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t
                teximage->data = (char *) tmpbuf;
                teximage->width = bx;
                teximage->height= by;
+#endif /* !HAVE_JWZGLES */
        }
        /* end rescale code */
                
@@ -989,6 +967,7 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t
         clear_gl_error();
 #ifdef HAVE_GLBINDTEXTURE
         glBindTexture(GL_TEXTURE_2D, texbind);
+        clear_gl_error(); /* WTF? sometimes "invalid op" from glBindTexture! */
 #endif
         glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height,
@@ -1048,14 +1027,11 @@ init_tunnel (ModeInfo *mi)
   
   wire = MI_IS_WIREFRAME(mi);
 
-  if (!tconf) {
-    tconf = (tunnel_configuration *)
-      calloc (MI_NUM_SCREENS(mi), sizeof (tunnel_configuration));
-    if (!tconf) {
-      fprintf(stderr, "%s: out of memory\n", progname);
-      exit(1);
-    }
-  }
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+  wire = 0;
+# endif
+
+  MI_INIT (mi, tconf, NULL);
 
   tc = &tconf[MI_SCREEN(mi)];
 
@@ -1109,20 +1085,26 @@ init_tunnel (ModeInfo *mi)
           LoadTexture(mi, tunnelstar_xpm, NULL, tc->texture_binds[4], 0, 0.0, False, False);
          if (strcasecmp (do_tx1, "(none)")) /* marquee */
                LoadTexture(mi, NULL, do_tx1, tc->texture_binds[3],  0,0.0, False, False);
+#ifndef HAVE_JWZGLES  /* logo_180_xpm is 180px which is not a power of 2! */
          else
                LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[3],  0,0.0, False, False);
+#endif
          if (strcasecmp (do_tx2, "(none)")) /* tardis */
                LoadTexture(mi, NULL, do_tx2, tc->texture_binds[1], 0, 0.0 ,False, False);
+#ifndef HAVE_JWZGLES  /* logo_180_xpm is 180px which is not a power of 2! */
          else
                LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[1],  0,0.0, False, False);
+#endif
          if (strcasecmp (do_tx3, "(none)")) { /* head */
                LoadTexture(mi,  NULL, do_tx3, tc->texture_binds[6], 0, 0.0 ,False, False);
                /* negative */
                LoadTexture(mi,  NULL, do_tx3, tc->texture_binds[9],  2,1.0, True, True);
+#ifndef HAVE_JWZGLES  /* logo_180_xpm is 180px which is not a power of 2! */
          } else {
                LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[6],  0,0.0, False, False);
                /* negative */
                LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[9],  2,1.0, True, True);
+#endif
          }
           glEnable(GL_TEXTURE_2D);
          check_gl_error("tex");
@@ -1141,7 +1123,7 @@ init_tunnel (ModeInfo *mi)
       glAlphaFunc(GL_GREATER, 0.5);
     }
 
-    tc->trackball = gltrackball_init ();
+    tc->trackball = gltrackball_init (True);
 
 
   tc->texshift = calloc(tc->num_texshifts, sizeof(GLfloat));