From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / hacks / glx / cubicgrid.c
index a7238b8244054d995c95adbfb210e8afdbc09195..3f72162c6e6d87caf087fd1ab83562fc4680ead1 100644 (file)
@@ -30,7 +30,7 @@
 
 #define DEF_SPEED   "1.0"
 #define DEF_DIV     "30"
-#define DEF_SIZE    "20.0"
+#define DEF_ZOOM    "20"
 #define DEF_BIGDOTS "True"
 
 #undef countof
@@ -48,7 +48,7 @@ static Bool bigdots;
 
 static argtype vars[] = {
   { &speed,   "speed",   "Speed",   DEF_SPEED,   t_Float },
-  { &size,    "zoom",    "Zoom",    DEF_SIZE,    t_Float },
+  { &size,    "zoom",    "Zoom",    DEF_ZOOM,    t_Float },
   { &ticks,   "ticks",   "Ticks",   DEF_DIV,     t_Int },
   { &bigdots, "bigdots", "BigDots", DEF_BIGDOTS, t_Bool },
 };
@@ -80,6 +80,7 @@ typedef struct {
   rotator *rot;
   trackball_state *trackball;
   Bool button_down_p;
+  int npoints;
 } cubicgrid_conf;
 
 static cubicgrid_conf *cubicgrid = NULL;
@@ -93,39 +94,10 @@ cubicgrid_handle_event (ModeInfo *mi, XEvent *event)
 {
   cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
 
-  if (event->xany.type == ButtonPress &&
-      event->xbutton.button == Button1)
-    {
-      cp->button_down_p = True;
-      gltrackball_start (cp->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)
-    {
-      cp->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 (cp->trackball, event->xbutton.button, 2,
-                              !!event->xbutton.state);
-      return True;
-    }
-  else if (event->xany.type == MotionNotify &&
-           cp->button_down_p)
-    {
-      gltrackball_track (cp->trackball,
-                         event->xmotion.x, event->xmotion.y,
-                         MI_WIDTH (mi), MI_HEIGHT (mi));
-      return True;
-    }
+  if (gltrackball_event_handler (event, cp->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &cp->button_down_p))
+    return True;
 
   return False;
 }
@@ -137,18 +109,23 @@ static Bool draw_main(cubicgrid_conf *cp)
 
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();
+
+  glRotatef (180, 1, 0, 0);  /* Make trackball track the right way */
+  glRotatef (180, 0, 1, 0);
+
   glTranslatef(0, 0, zpos);
 
   glScalef(size/ticks, size/ticks, size/ticks);
+
   gltrackball_rotate (cp->trackball);
+
   get_rotation (cp->rot, &x, &y, &z, !cp->button_down_p);
-  glRotatef (x * 360, 1.0, 0.0, 0.0);
-  glRotatef (y * 360, 0.0, 1.0, 0.0);
-  glRotatef (z * 360, 0.0, 0.0, 1.0);
+  glRotatef (-x * 360, 1.0, 0.0, 0.0);
+  glRotatef (-y * 360, 0.0, 1.0, 0.0);
+  glRotatef (-z * 360, 0.0, 0.0, 1.0);
 
   glTranslatef(-ticks/2.0, -ticks/2.0, -ticks/2.0);
   glCallList(cp->list);
-
   return True;
 }
 
@@ -158,7 +135,6 @@ static void init_gl(ModeInfo *mi)
   int x, y, z;
   float tf = ticks;
 
-  glClearColor(0.0, 0.0, 0.0, 1.0);
   glDrawBuffer(GL_BACK);
   if(bigdots) {
     glPointSize(2.0);
@@ -175,6 +151,7 @@ static void init_gl(ModeInfo *mi)
       for(y = 0; y < ticks; y++) {
         for(z = 0; z < ticks; z++) {
           glVertex3f(x, y, z);
+          cp->npoints++;
         }
       }
     }
@@ -188,6 +165,7 @@ static void init_gl(ModeInfo *mi)
         for(z = 0; z < ticks; z++) {
           glColor3f(x/tf, y/tf, z/tf);
           glVertex3f(x, y, z);
+          cp->npoints++;
         }
       }
     }
@@ -249,7 +227,7 @@ ENTRYPOINT void init_cubicgrid(ModeInfo *mi)
 
     cp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
                             spin_accel, 0, True);
-    cp->trackball = gltrackball_init ();
+    cp->trackball = gltrackball_init (True);
   }
 }
 
@@ -267,6 +245,7 @@ ENTRYPOINT void draw_cubicgrid(ModeInfo * mi)
     release_cubicgrid(mi);
     return;
   }
+  mi->polygon_count = cp->npoints;
   if (MI_IS_FPS(mi)) do_fps (mi);
   glFlush();
   glXSwapBuffers(display, window);