http://svn.poeml.de/viewvc/ppc/src-unpacked/xscreensaver/xscreensaver-4.12.tar.bz2...
[xscreensaver] / hacks / glx / glplanet.c
index 5352a5db53d5dde5148037c0a3239080f2339579..316e6821205dc65c6fcb809febd8253cb3921434 100644 (file)
@@ -142,7 +142,13 @@ ModStruct   planet_description =
  "Animates texture mapped sphere (planet)", 0, NULL};
 #endif
 
+# ifdef __GNUC__
+  __extension__  /* don't warn about "string length is greater than the length
+                    ISO C89 compilers are required to support" when including
+                    the following XPM file... */
+# endif
 #include "../images/earth.xpm"
+
 #include "xpm-ximage.h"
 #include "rotator.h"
 #include "gltrackball.h"
@@ -167,6 +173,7 @@ ModStruct   planet_description =
 /* structure for holding the planet data */
 typedef struct {
   GLuint platelist;
+  GLuint latlonglist;
   GLuint starlist;
   int screen_width, screen_height;
   GLXContext *glx_context;
@@ -212,7 +219,10 @@ setup_xpm_texture (ModeInfo *mi, char **xpm_data)
   clear_gl_error();
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
-               GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+               GL_RGBA,
+               /* GL_UNSIGNED_BYTE, */
+               GL_UNSIGNED_INT_8_8_8_8_REV,
+               image->data);
   sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
   check_gl_error(buf);
 
@@ -239,7 +249,10 @@ setup_file_texture (ModeInfo *mi, char *filename)
   clear_gl_error();
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
-               GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+               GL_RGBA,
+               /* GL_UNSIGNED_BYTE, */
+               GL_UNSIGNED_INT_8_8_8_8_REV,
+               image->data);
   sprintf (buf, "texture: %.100s (%dx%d)",
            filename, image->width, image->height);
   check_gl_error(buf);
@@ -438,31 +451,6 @@ init_sun (ModeInfo * mi)
 
 #define RANDSIGN() ((random() & 1) ? 1 : -1)
 
-static void
-pick_velocity (ModeInfo * mi)
-{
-#if 0
-  planetstruct *gp = &planets[MI_SCREEN(mi)];
-
-  gp->box_width =  15.0;
-  gp->box_height = 15.0;
-  gp->box_depth =  5.0;
-
-  gp->tx = 0.0;
-  gp->ty = 0.0;
-  gp->tz = frand(360);
-
-  gp->dtx = (frand(0.4) + frand(0.3)) * RANDSIGN();
-  gp->dty = (frand(0.4) + frand(0.3)) * RANDSIGN();
-  gp->dtz = (frand(5.0) + frand(5.0));  /* the sun sets in the west */
-
-  gp->dx = (frand(0.2) + frand(0.2)) * RANDSIGN();
-  gp->dy = (frand(0.2) + frand(0.2)) * RANDSIGN();
-  gp->dz = (frand(0.2) + frand(0.2)) * RANDSIGN();
-#endif
-}
-
-
 void
 reshape_planet (ModeInfo *mi, int width, int height)
 {
@@ -527,8 +515,6 @@ init_planet (ModeInfo * mi)
   }
   gp = &planets[screen];
 
-  pick_velocity (mi);
-
   if ((gp->glx_context = init_GL(mi)) != NULL) {
        reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   }
@@ -594,6 +580,8 @@ init_planet (ModeInfo * mi)
   glEnable(GL_CULL_FACE);
   glCullFace(GL_BACK); 
 
+  /* construct the polygons of the planet
+   */
   gp->platelist = glGenLists(1);
   glNewList (gp->platelist, GL_COMPILE);
   glColor3f (1,1,1);
@@ -602,15 +590,27 @@ init_planet (ModeInfo * mi)
   glRotatef (90, 1, 0, 0);
   unit_sphere (resolution, resolution, wire);
   mi->polygon_count += resolution*resolution;
-#if 0
-  if (!wire)
-    {
-      glDisable(GL_LIGHTING);
-      glScalef(1.01,1.01,1.01);
-      unit_sphere (12, 24, 1);
-      glEnable(GL_LIGHTING);
-    }
-#endif
+  glPopMatrix ();
+  glEndList();
+
+  /* construct the polygons of the latitude/longitude/axis lines.
+   */
+  gp->latlonglist = glGenLists(1);
+  glNewList (gp->latlonglist, GL_COMPILE);
+  glPushMatrix ();
+  if (do_texture) glDisable (GL_TEXTURE_2D);
+  if (do_light)   glDisable (GL_LIGHTING);
+  glColor3f (0.1, 0.3, 0.1);
+  glScalef (RADIUS, RADIUS, RADIUS);
+  glScalef (1.01, 1.01, 1.01);
+  glRotatef (90, 1, 0, 0);
+  unit_sphere (12, 24, 1);
+  glBegin(GL_LINES);
+  glVertex3f(0, -2, 0);
+  glVertex3f(0,  2, 0);
+  glEnd();
+  if (do_light)   glEnable(GL_LIGHTING);
+  if (do_texture) glEnable(GL_TEXTURE_2D);
   glPopMatrix ();
   glEndList();
 }
@@ -657,11 +657,13 @@ draw_planet (ModeInfo * mi)
   glRotatef (gp->z * 360, 0.0, 0.0, 1.0);
   if (do_rotate && !gp->button_down_p)
     {
-      gp->z += 0.01;
-      if (gp->z > 1) gp->z -= 1;
+      gp->z -= 0.01;     /* the sun sets in the west */
+      if (gp->z < 0) gp->z += 1;
     }
 
   glCallList (gp->platelist);
+  if (gp->button_down_p)
+    glCallList (gp->latlonglist);
   glPopMatrix();
 
   if (mi->fps_p) do_fps (mi);