From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / hacks / glx / mirrorblob.c
index 00ba44e17946ed8a63cbf62acf48312381a02cfc..825eb66a6f419356e340cdbe86ece57e6b588976 100644 (file)
@@ -44,9 +44,6 @@
                  "*chooseRandomImages:  True  \n"
 
 # define refresh_mirrorblob 0
-/*
-# define mirrorblob_handle_event 0
-*/
 # include "xlockmore.h"
 #else /* !STANDALONE */
 # include "xlock.h"        /* from the xlockmore distribution */
@@ -191,20 +188,20 @@ ModStruct   mirrorblob_description =
 
 typedef struct
 {
-  GLdouble x, y;
+  GLfloat x, y;
 } Vector2D;
 
 typedef struct
 {
-  GLdouble x, y, z;
+  GLfloat x, y, z;
 } Vector3D;
 
 typedef struct
 {
-  GLdouble w;
-  GLdouble x;
-  GLdouble y;
-  GLdouble z;
+  GLfloat w;
+  GLfloat x;
+  GLfloat y;
+  GLfloat z;
 } Quaternion;
 
 typedef struct
@@ -246,7 +243,7 @@ typedef struct
 #define PMM {  sqrt_3, -sqrt_3, -sqrt_3 }       /* +X, -Y, -Z */
 
 /* Structure describing a tetrahedron */
-Vector3D tetrahedron[4][3] = {
+static Vector3D tetrahedron[4][3] = {
     {PPP, MMP, MPM},
     {PMM, MPM, MMP},
     {PPP, MPM, PMM},
@@ -257,7 +254,7 @@ Vector3D tetrahedron[4][3] = {
  * Static blob data
  *****************************************************************************/
 
-const Vector3D zero_vector = { 0.0, 0.0, 0.0 };
+static const Vector3D zero_vector = { 0.0, 0.0, 0.0 };
 
 /* Use 2 textures to allow a gradual fade between images */
 #define NUM_TEXTURES 2
@@ -461,9 +458,9 @@ normalise (const Vector3D v)
  * Calculate the transform matrix for the given quaternion
  */
 static void
-quaternion_transform (Quaternion q, GLdouble * transform)
+quaternion_transform (Quaternion q, GLfloat * transform)
 {
-  GLdouble x, y, z, w;
+  GLfloat x, y, z, w;
   x = q.x;
   y = q.y;
   z = q.z;
@@ -495,7 +492,7 @@ quaternion_transform (Quaternion q, GLdouble * transform)
  * Apply a matrix transform to the given vector
  */
 static inline Vector3D
-vector_transform (Vector3D u, GLdouble * t)
+vector_transform (Vector3D u, GLfloat * t)
 {
   Vector3D result;
 
@@ -516,7 +513,7 @@ partial (Vector3D node1, Vector3D node2, double distance)
 {
   Vector3D result;
   Vector3D rotation_axis;
-  GLdouble transformation[16];
+  GLfloat transformation[16];
   double angle;
   Quaternion rotation;
 
@@ -605,6 +602,10 @@ grab_texture(ModeInfo *mi, int texture_index)
 static void
 set_parameters(void)
 {
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+  wireframe = 0;
+# endif
+
   /* In wire frame mode do not draw a texture */
   if (wireframe)
     {
@@ -687,9 +688,6 @@ initialize_gl(ModeInfo *mi, GLsizei width, GLsizei height)
   /* Set the shading model to smooth (Gouraud shading). */
   glShadeModel (GL_SMOOTH);
 
-  /* Set the clear color. */
-  glClearColor( 0, 0, 0, 0 );
-
   glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambientLight);
   glLightfv (GL_LIGHT0, GL_AMBIENT, whiteLight0);
   glLightfv (GL_LIGHT0, GL_DIFFUSE, sourceLight0);
@@ -740,7 +738,7 @@ initialize_gl(ModeInfo *mi, GLsizei width, GLsizei height)
  * Initialise the openGL state data.
  */
 static void
-set_blob_gl_state(GLdouble alpha)
+set_blob_gl_state(GLfloat alpha)
 {
   if (do_antialias)
     {
@@ -779,12 +777,12 @@ set_blob_gl_state(GLdouble alpha)
       glEnable (GL_BLEND);
       glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
       /* Set the default blob colour to off-white. */
-      glColor4d (0.9, 0.9, 1.0, alpha);
+      glColor4f (0.9, 0.9, 1.0, alpha);
     }
   else
     {
       glDisable(GL_BLEND);
-      glColor4d (0.9, 0.9, 1.0, 1.0);
+      glColor4f (0.9, 0.9, 1.0, 1.0);
     }
     
   glEnable(GL_DEPTH_TEST);
@@ -1122,11 +1120,13 @@ initialise_blob(mirrorblobstruct *gp,
  *
  * Return the magnitude of the given vector
  */
+#if 0
 static inline double
 length (Vector3D u)
 {
   return sqrt (u.x * u.x + u.y * u.y + u.z * u.z);
 }
+#endif
 
 /******************************************************************************
  *
@@ -1397,10 +1397,10 @@ draw_vertex(mirrorblobstruct *gp, int index)
     }
   if (load_textures)
     {
-      glTexCoord3dv((GLdouble *) &gp->tex_coords[index]);
+      glTexCoord2fv(&gp->tex_coords[index].x);
     }
-  glNormal3dv((GLdouble *) &gp->normals[index]);
-  glVertex3dv((GLdouble *) &gp->dots[index]);
+  glNormal3fv(&gp->normals[index].x);
+  glVertex3fv(&gp->dots[index].x);
 }
 
 /******************************************************************************
@@ -1415,6 +1415,7 @@ draw_blob (mirrorblobstruct *gp)
 
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
+  glRotatef(current_device_rotation(), 0, 0, 1);
 
   /* Move down the z-axis. */
   glTranslatef (0.0, 0.0, -4.0);
@@ -1438,9 +1439,9 @@ draw_blob (mirrorblobstruct *gp)
       if (gp->normals[gp->faces[face].node1].z > 0.0)
         {
           Vector3D end = gp->dots[gp->faces[face].node1];
-          glVertex3dv((GLdouble *) &end);
+          glVertex3dv(&end);
           add(&end, scale(gp->normals[gp->faces[face].node1], 0.25));
-          glVertex3dv((GLdouble *) &end);
+          glVertex3dv(&end);
         }
     }
   glEnd();
@@ -1457,6 +1458,7 @@ static void
 draw_background (ModeInfo *mi)
 {
   mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN(mi)];
+  GLfloat rot = current_device_rotation();
     
   glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
   glEnable (GL_TEXTURE_2D);
@@ -1470,6 +1472,14 @@ draw_background (ModeInfo *mi)
   glPushMatrix();
   glLoadIdentity();
 
+  glRotatef (rot, 0, 0, 1);
+  if ((rot >  45 && rot <  135) ||
+      (rot < -45 && rot > -135))
+    {
+      GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+      glScalef (s, 1/s, 1);
+    }
+
   glOrtho(0.0, MI_WIDTH(mi), MI_HEIGHT(mi), 0.0, -1000.0, 1000.0);
 
   glBegin (GL_QUADS);
@@ -1506,13 +1516,13 @@ draw_scene(ModeInfo * mi)
   check_gl_error ("draw_scene");
 
   mi->polygon_count = 0;
-  glColor4d(1.0, 1.0, 1.0, 1.0);
+  glColor4(1.0, 1.0, 1.0, 1.0);
 
   current_time = double_time();
   switch (gp->state)
     {
     case INITIALISING:
-      glColor4d(0.0, 0.0, 0.0, 1.0);
+      glColor4(0.0, 0.0, 0.0, 1.0);
       fade = 1.0;
       break;
 
@@ -1543,7 +1553,7 @@ draw_scene(ModeInfo * mi)
         {
           glClear(GL_DEPTH_BUFFER_BIT);
           glEnable (GL_BLEND);
-          glColor4d (1.0, 1.0, 1.0, motion_blur);
+          glColor4f (1.0, 1.0, 1.0, motion_blur);
         }
       else
         {
@@ -1560,7 +1570,7 @@ draw_scene(ModeInfo * mi)
           glEnable (GL_BLEND);
           /* Select the texture to transition to */
           glBindTexture (GL_TEXTURE_2D, gp->textures[1 - gp->current_texture]);
-          glColor4d (1.0, 1.0, 1.0, 1.0 - fade);
+          glColor4f (1.0, 1.0, 1.0, 1.0 - fade);
 
           draw_background (mi);
           mi->polygon_count++;
@@ -1574,7 +1584,7 @@ draw_scene(ModeInfo * mi)
   else if (motion_blur > 0.0)
     {
       glEnable (GL_BLEND);
-      glColor4d (0.0, 0.0, 0.0, motion_blur);
+      glColor4f (0.0, 0.0, 0.0, motion_blur);
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
       glTranslatef (0.0, 0.0, -4.0);
       glRectd (-10.0, -10.0, 10.0, 10.0);
@@ -1672,7 +1682,7 @@ draw_scene(ModeInfo * mi)
                 }
               else
                 {
-                  glColor4d(0.9, 0.9, 1.0, (1.0 - fade) * blend);
+                  glColor4(0.9, 0.9, 1.0, (1.0 - fade) * blend);
                 }
 
               draw_blob (gp);
@@ -1744,21 +1754,7 @@ mirrorblob_handle_event (ModeInfo * mi, XEvent * event)
   mirrorblobstruct *gp = &Mirrorblob[MI_SCREEN (mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button == Button1)
-    {
-      gp->button_down = 1;
-      gltrackball_start (gp->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)
-    {
-      gp->button_down = 0;
-      return True;
-    }
-  else if (event->xany.type == ButtonPress &&
-           event->xbutton.button == Button4)
+      event->xbutton.button == Button4)
     {
       zoom *= 1.1;
       return True;
@@ -1770,12 +1766,19 @@ mirrorblob_handle_event (ModeInfo * mi, XEvent * event)
       zoom *= 0.9;
       return True;
     }
-  else if (event->xany.type == MotionNotify && gp->button_down)
+  else if (gltrackball_event_handler (event, gp->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &gp->button_down))
     {
-      gltrackball_track (gp->trackball, event->xmotion.x,
-                         event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi));
       return True;
     }
+  else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+    {
+      gp->state_start_time = 0;
+      gp->state = HOLDING;
+      return True;
+    }
+
   return False;
 }
 
@@ -1810,7 +1813,7 @@ init_mirrorblob(ModeInfo * mi)
     {
       MI_CLEARWINDOW(mi);
     }
-  gp->trackball = gltrackball_init();
+  gp->trackball = gltrackball_init(False);
     
   initialise_blob(gp, MI_WIDTH(mi), MI_HEIGHT(mi), BUMP_ARRAY_SIZE);
   gp->state = INITIALISING;