http://packetstormsecurity.org/UNIX/admin/xscreensaver-3.29.tar.gz
[xscreensaver] / hacks / glx / glplanet.c
index ad26b3d667f7f4b44ed5814de1af04617c209540..58807895bf4c740b9cb2e36d707fda41d1c460e2 100644 (file)
@@ -58,8 +58,10 @@ static const char sccsid[] = "@(#)plate.c    4.07 97/11/24 xlockmore";
 # define PROGCLASS                                             "Planet"
 # define HACK_INIT                                             init_planet
 # define HACK_DRAW                                             draw_planet
+# define HACK_RESHAPE                                  reshape_planet
 # define planet_opts                                   xlockmore_opts
 #define DEFAULTS       "*delay:                        15000   \n"     \
+                                       "*showFPS:                      False   \n" \
                     "*rotate:           True    \n" \
                     "*roll:             True    \n" \
                     "*bounce:           True    \n" \
@@ -161,8 +163,8 @@ ModStruct   planet_description =
  */
 
 #define NUM_STARS 1000
-#define SLICES 15
-#define STACKS 15
+#define SLICES 32
+#define STACKS 32
 
 /* radius of the sphere- fairly arbitrary */
 #define RADIUS 4
@@ -618,33 +620,20 @@ rotate_and_move (ModeInfo * mi)
 
   if (do_bounce)
        {
-         /* Move in the direction we had been moving in. */
-         gp->xpos += gp->dx;
-         gp->ypos += gp->dy;
-         gp->zpos += gp->dz;
-
-         /* Bounce. */
-         if (gp->xpos > gp->box_depth)
-               gp->xpos = gp->box_depth, gp->dx = -gp->dx;
-         else if (gp->xpos < 0)
-               gp->xpos = 0, gp->dx = -gp->dx;
-
-         if (gp->ypos > gp->box_width/2)
-               gp->ypos = gp->box_width/2, gp->dy = -gp->dy;
-         else if (gp->ypos < -gp->box_width/2)
-               gp->ypos = -gp->box_width/2, gp->dy = -gp->dy;
-
-         if (gp->zpos > gp->box_height/2)
-               gp->zpos = gp->box_height/2, gp->dz = -gp->dz;
-         else if (gp->zpos < -gp->box_height/2)
-               gp->zpos = -gp->box_height/2, gp->dz = -gp->dz;
+      static int frame = 0;
+#     define SINOID(SCALE,SIZE) \
+        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
+      gp->xpos = SINOID(0.031, gp->box_width);
+      gp->ypos = SINOID(0.023, gp->box_height);
+      gp->zpos = SINOID(0.017, gp->box_depth);
+      frame++;
        }
 }
 
 
 /* Standard reshape function */
-static void
-reshape(int width, int height)
+void
+reshape_planet(ModeInfo *mi, int width, int height)
 {
   GLfloat light[4];
   GLfloat h = (GLfloat) height / (GLfloat) width;
@@ -715,7 +704,7 @@ init_planet(ModeInfo * mi)
 
   gp->window = MI_WINDOW(mi);
   if ((gp->glx_context = init_GL(mi)) != NULL) {
-       reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+       reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
        pinit(mi);
   } else {
        MI_CLEARWINDOW(mi);
@@ -772,6 +761,7 @@ draw_planet(ModeInfo * mi)
 
 
 
+  if (mi->fps_p) do_fps (mi);
   glFinish();
   glXSwapBuffers(display, window);