From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / hypertorus.c
index 17f948f144a0d8a3cef3b56122b1402428cbad8b..7e1cc3e7651839b2fbefb45f6ae3ce64ee57257d 100644 (file)
@@ -4,7 +4,7 @@
 static const char sccsid[] = "@(#)hypertorus.c  1.2 05/09/28 xlockmore";
 #endif
 
-/* Copyright (c) 2003-2007 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2003-2009 Carsten Steger <carsten@mirsanmir.org>. */
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
@@ -24,6 +24,7 @@ static const char sccsid[] = "@(#)hypertorus.c  1.2 05/09/28 xlockmore";
  * C. Steger - 05/09/28: Added the spirals appearance mode
  *                       and trackball support
  * C. Steger - 07/01/23: Improved 4d trackball support
+ * C. Steger - 09/08/22: Removed check-config.pl warnings
  */
 
 /*
@@ -55,74 +56,41 @@ static const char sccsid[] = "@(#)hypertorus.c  1.2 05/09/28 xlockmore";
 #endif
 
 #define DISP_WIREFRAME             0
-#define DISP_WIREFRAME_STR        "0"
 #define DISP_SURFACE               1
-#define DISP_SURFACE_STR          "1"
 #define DISP_TRANSPARENT           2
-#define DISP_TRANSPARENT_STR      "2"
 
 #define APPEARANCE_SOLID           0
-#define APPEARANCE_SOLID_STR      "0"
 #define APPEARANCE_BANDS           1
-#define APPEARANCE_BANDS_STR      "1"
 #define APPEARANCE_SPIRALS         2
-#define APPEARANCE_SPIRALS_STR    "2"
-#define APPEARANCE_SPIRALS_1       3
-#define APPEARANCE_SPIRALS_1_STR  "3"
-#define APPEARANCE_SPIRALS_2       4
-#define APPEARANCE_SPIRALS_2_STR  "4"
-#define APPEARANCE_SPIRALS_4       5
-#define APPEARANCE_SPIRALS_4_STR  "5"
-#define APPEARANCE_SPIRALS_8       6
-#define APPEARANCE_SPIRALS_8_STR  "6"
-#define APPEARANCE_SPIRALS_16      7
-#define APPEARANCE_SPIRALS_16_STR "7"
 
 #define COLORS_TWOSIDED            0
-#define COLORS_TWOSIDED_STR       "0"
 #define COLORS_COLORWHEEL          1
-#define COLORS_COLORWHEEL_STR     "1"
 
 #define DISP_3D_PERSPECTIVE        0
-#define DISP_3D_PERSPECTIVE_STR   "0"
 #define DISP_3D_ORTHOGRAPHIC       1
-#define DISP_3D_ORTHOGRAPHIC_STR  "1"
 
 #define DISP_4D_PERSPECTIVE        0
-#define DISP_4D_PERSPECTIVE_STR   "0"
 #define DISP_4D_ORTHOGRAPHIC       1
-#define DISP_4D_ORTHOGRAPHIC_STR  "1"
-
-#define DALPHA                     1.1
-#define DALPHA_STR                "1.1"
-#define DBETA                      1.3
-#define DBETA_STR                 "1.3"
-#define DDELTA                     1.5
-#define DDELTA_STR                "1.5"
-#define DZETA                      1.7
-#define DZETA_STR                 "1.7"
-#define DETA                       1.9
-#define DETA_STR                  "1.9"
-#define DTHETA                     2.1
-#define DTHETA_STR                "2.1"
-
-#define DEF_DISPLAY_MODE           DISP_TRANSPARENT_STR
-#define DEF_APPEARANCE             APPEARANCE_BANDS_STR
-#define DEF_COLORS                 COLORS_COLORWHEEL_STR
-#define DEF_3D_PROJECTION          DISP_3D_PERSPECTIVE_STR
-#define DEF_4D_PROJECTION          DISP_4D_PERSPECTIVE_STR
-#define DEF_DALPHA                 DALPHA_STR
-#define DEF_DBETA                  DBETA_STR
-#define DEF_DDELTA                 DDELTA_STR
-#define DEF_DZETA                  DZETA_STR
-#define DEF_DETA                   DETA_STR
-#define DEF_DTHETA                 DTHETA_STR
+
+#define DEF_DISPLAY_MODE           "surface"
+#define DEF_APPEARANCE             "bands"
+#define DEF_COLORS                 "colorwheel"
+#define DEF_PROJECTION_3D          "perspective"
+#define DEF_PROJECTION_4D          "perspective"
+#define DEF_SPEEDWX                "1.1"
+#define DEF_SPEEDWY                "1.3"
+#define DEF_SPEEDWZ                "1.5"
+#define DEF_SPEEDXY                "1.7"
+#define DEF_SPEEDXZ                "1.9"
+#define DEF_SPEEDYZ                "2.1"
 
 #ifdef STANDALONE
 # define DEFAULTS           "*delay:      25000 \n" \
                             "*showFPS:    False \n" \
+                           "*suppressRotationAnimation: True\n" \
 
 # define refresh_hypertorus 0
+# define release_hypertorus 0
 # include "xlockmore.h"         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 # include "xlock.h"             /* from the xlockmore distribution */
@@ -130,14 +98,12 @@ static const char sccsid[] = "@(#)hypertorus.c  1.2 05/09/28 xlockmore";
 
 #ifdef USE_GL
 
-#include <X11/keysym.h>
-
 #include "gltrackball.h"
 
 
 #ifdef USE_MODULES
 ModStruct   hypertorus_description =
-{"hypertorus", "init_hypertorus", "draw_hypertorus", "release_hypertorus",
+{"hypertorus", "init_hypertorus", "draw_hypertorus", NULL,
  "draw_hypertorus", "change_hypertorus", NULL, &hypertorus_opts,
  25000, 1, 1, 1, 1.0, 4, "",
  "Shows a hypertorus rotating in 4d", 0, NULL};
@@ -145,11 +111,16 @@ ModStruct   hypertorus_description =
 #endif
 
 
+static char *mode;
 static int display_mode;
+static char *appear;
 static int appearance;
 static int num_spirals;
+static char *color_mode;
 static int colors;
+static char *proj_3d;
 static int projection_3d;
+static char *proj_4d;
 static int projection_4d;
 static float speed_wx;
 static float speed_wy;
@@ -164,73 +135,45 @@ static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
 
 static XrmOptionDescRec opts[] =
 {
-  {"-mode",            ".hypertorus.displayMode",  XrmoptionSepArg, 0 },
-  {"-wireframe",       ".hypertorus.displayMode",  XrmoptionNoArg,
-                       DISP_WIREFRAME_STR },
-  {"-surface",         ".hypertorus.displayMode",  XrmoptionNoArg,
-                       DISP_SURFACE_STR },
-  {"-transparent",     ".hypertorus.displayMode",  XrmoptionNoArg,
-                       DISP_TRANSPARENT_STR },
-
-  {"-appearance",      ".hypertorus.appearance",   XrmoptionSepArg, 0 },
-  {"-solid",           ".hypertorus.appearance",   XrmoptionNoArg,
-                       APPEARANCE_SOLID_STR },
-  {"-bands",           ".hypertorus.appearance",   XrmoptionNoArg,
-                       APPEARANCE_BANDS_STR },
-  {"-spirals-1",       ".hypertorus.appearance",   XrmoptionNoArg,
-                       APPEARANCE_SPIRALS_1_STR },
-  {"-spirals-2",       ".hypertorus.appearance",   XrmoptionNoArg,
-                       APPEARANCE_SPIRALS_2_STR },
-  {"-spirals-4",       ".hypertorus.appearance",   XrmoptionNoArg,
-                       APPEARANCE_SPIRALS_4_STR },
-  {"-spirals-8",       ".hypertorus.appearance",   XrmoptionNoArg,
-                       APPEARANCE_SPIRALS_8_STR },
-  {"-spirals-16",      ".hypertorus.appearance",   XrmoptionNoArg,
-                       APPEARANCE_SPIRALS_16_STR },
-  {"-twosided",        ".hypertorus.colors",       XrmoptionNoArg,
-                       COLORS_TWOSIDED_STR },
-  {"-colorwheel",      ".hypertorus.colors",       XrmoptionNoArg,
-                       COLORS_COLORWHEEL_STR },
-  {"-perspective-3d",  ".hypertorus.projection3d", XrmoptionNoArg,
-                       DISP_3D_PERSPECTIVE_STR },
-  {"-orthographic-3d", ".hypertorus.projection3d", XrmoptionNoArg,
-                       DISP_3D_ORTHOGRAPHIC_STR },
-  {"-perspective-4d",  ".hypertorus.projection4d", XrmoptionNoArg,
-                       DISP_4D_PERSPECTIVE_STR },
-  {"-orthographic-4d", ".hypertorus.projection4d", XrmoptionNoArg,
-                       DISP_4D_ORTHOGRAPHIC_STR },
-  {"-speed-wx",        ".hypertorus.speedwx",      XrmoptionSepArg, 0 },
-  {"-speed-wy",        ".hypertorus.speedwy",      XrmoptionSepArg, 0 },
-  {"-speed-wz",        ".hypertorus.speedwz",      XrmoptionSepArg, 0 },
-  {"-speed-xy",        ".hypertorus.speedxy",      XrmoptionSepArg, 0 },
-  {"-speed-xz",        ".hypertorus.speedxz",      XrmoptionSepArg, 0 },
-  {"-speed-yz",        ".hypertorus.speedyz",      XrmoptionSepArg, 0 }
+  {"-mode",            ".displayMode",  XrmoptionSepArg, 0 },
+  {"-wireframe",       ".displayMode",  XrmoptionNoArg,  "wireframe" },
+  {"-surface",         ".displayMode",  XrmoptionNoArg,  "surface" },
+  {"-transparent",     ".displayMode",  XrmoptionNoArg,  "transparent" },
+  {"-appearance",      ".appearance",   XrmoptionSepArg, 0 },
+  {"-solid",           ".appearance",   XrmoptionNoArg,  "solid" },
+  {"-bands",           ".appearance",   XrmoptionNoArg,  "bands" },
+  {"-spirals-1",       ".appearance",   XrmoptionNoArg,  "spirals-1" },
+  {"-spirals-2",       ".appearance",   XrmoptionNoArg,  "spirals-2" },
+  {"-spirals-4",       ".appearance",   XrmoptionNoArg,  "spirals-4" },
+  {"-spirals-8",       ".appearance",   XrmoptionNoArg,  "spirals-8" },
+  {"-spirals-16",      ".appearance",   XrmoptionNoArg,  "spirals-16" },
+  {"-twosided",        ".colors",       XrmoptionNoArg,  "twosided" },
+  {"-colorwheel",      ".colors",       XrmoptionNoArg,  "colorwheel" },
+  {"-perspective-3d",  ".projection3d", XrmoptionNoArg,  "perspective" },
+  {"-orthographic-3d", ".projection3d", XrmoptionNoArg,  "orthographic" },
+  {"-perspective-4d",  ".projection4d", XrmoptionNoArg,  "perspective" },
+  {"-orthographic-4d", ".projection4d", XrmoptionNoArg,  "orthographic" },
+  {"-speed-wx",        ".speedwx",      XrmoptionSepArg, 0 },
+  {"-speed-wy",        ".speedwy",      XrmoptionSepArg, 0 },
+  {"-speed-wz",        ".speedwz",      XrmoptionSepArg, 0 },
+  {"-speed-xy",        ".speedxy",      XrmoptionSepArg, 0 },
+  {"-speed-xz",        ".speedxz",      XrmoptionSepArg, 0 },
+  {"-speed-yz",        ".speedyz",      XrmoptionSepArg, 0 }
 };
 
 static argtype vars[] =
 {
-  { &display_mode,  "displayMode",  "DisplayMode",
-    DEF_DISPLAY_MODE,  t_Int },
-  { &appearance,    "appearance",   "Appearance",
-    DEF_APPEARANCE,    t_Int },
-  { &colors,        "colors",       "Colors",
-    DEF_COLORS,        t_Int },
-  { &projection_3d, "projection3d", "Projection3d",
-    DEF_3D_PROJECTION, t_Int },
-  { &projection_4d, "projection4d", "Projection4d",
-    DEF_4D_PROJECTION, t_Int },
-  { &speed_wx,      "speedwx",      "Speedwx",
-    DEF_DALPHA,        t_Float},
-  { &speed_wy,      "speedwy",      "Speedwy",
-    DEF_DBETA,         t_Float},
-  { &speed_wz,      "speedwz",      "Speedwz",
-    DEF_DDELTA,        t_Float},
-  { &speed_xy,      "speedxy",      "Speedxy",
-    DEF_DZETA,         t_Float},
-  { &speed_xz,      "speedxz",      "Speedxz",
-    DEF_DETA,          t_Float},
-  { &speed_yz,      "speedyz",      "Speedyz",
-    DEF_DTHETA,        t_Float}
+  { &mode,       "displayMode",  "DisplayMode",  DEF_DISPLAY_MODE,  t_String },
+  { &appear,     "appearance",   "Appearance",   DEF_APPEARANCE,    t_String },
+  { &color_mode, "colors",       "Colors",       DEF_COLORS,        t_String },
+  { &proj_3d,    "projection3d", "Projection3d", DEF_PROJECTION_3D, t_String },
+  { &proj_4d,    "projection4d", "Projection4d", DEF_PROJECTION_4D, t_String },
+  { &speed_wx,   "speedwx",      "Speedwx",      DEF_SPEEDWX,       t_Float},
+  { &speed_wy,   "speedwy",      "Speedwy",      DEF_SPEEDWY,       t_Float},
+  { &speed_wz,   "speedwz",      "Speedwz",      DEF_SPEEDWZ,       t_Float},
+  { &speed_xy,   "speedxy",      "Speedxy",      DEF_SPEEDXY,       t_Float},
+  { &speed_xz,   "speedxz",      "Speedxz",      DEF_SPEEDXZ,       t_Float},
+  { &speed_yz,   "speedyz",      "Speedyz",      DEF_SPEEDYZ,       t_Float}
 };
 
 static OptionStruct desc[] =
@@ -561,6 +504,17 @@ static int hypertorus(ModeInfo *mi, double umin, double umax, double vmin,
     }
   }
 
+#if 0 /* #### not working */
+# ifdef HAVE_MOBILE    /* Keep it the same relative size when rotated. */
+  {
+    GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+    int o = (int) current_device_rotation();
+    if (o != 0 && o != 180 && o != -180)
+      glScalef (1/h, 1/h, 1/h);
+  }
+# endif
+#endif
+
   skew = num_spirals;
   ur = umax-umin;
   vr = vmax-vmin;
@@ -671,16 +625,6 @@ static void init(ModeInfo *mi)
   static const GLfloat mat_specular[]   = { 1.0, 1.0, 1.0, 1.0 };
   hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
 
-  if (appearance >= APPEARANCE_SPIRALS_1)
-  {
-    num_spirals = 1<<(appearance-APPEARANCE_SPIRALS_1);
-    appearance = APPEARANCE_SPIRALS;
-  }
-  else
-  {
-    num_spirals = 0;
-  }
-
   hp->alpha = 0.0;
   hp->beta = 0.0;
   hp->delta = 0.0;
@@ -697,16 +641,12 @@ static void init(ModeInfo *mi)
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
   if (display_mode == DISP_WIREFRAME)
-  {
-    glDisable(GL_DEPTH_TEST);
-    glShadeModel(GL_FLAT);
-    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
-    glDisable(GL_LIGHTING);
-    glDisable(GL_LIGHT0);
-    glDisable(GL_BLEND);
-  }
-  else if (display_mode == DISP_SURFACE)
+    display_mode = DISP_SURFACE;
+# endif
+
+  if (display_mode == DISP_SURFACE)
   {
     glEnable(GL_DEPTH_TEST);
     glDepthFunc(GL_LESS);
@@ -742,7 +682,7 @@ static void init(ModeInfo *mi)
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA,GL_ONE);
   }
-  else
+  else  /* display_mode == DISP_WIREFRAME */
   {
     glDisable(GL_DEPTH_TEST);
     glShadeModel(GL_FLAT);
@@ -814,9 +754,12 @@ ENTRYPOINT void reshape_hypertorus(ModeInfo *mi, int width, int height)
 
 ENTRYPOINT Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event)
 {
-  Display *display = MI_DISPLAY(mi);
   hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
-  KeySym  sym;
+  KeySym  sym = 0;
+  char c = 0;
+
+  if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
+    XLookupString (&event->xkey, &c, 1, &sym, 0);
 
   if (event->xany.type == ButtonPress &&
       event->xbutton.button == Button1)
@@ -835,7 +778,6 @@ ENTRYPOINT Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event)
   }
   else if (event->xany.type == KeyPress)
   {
-    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
     if (sym == XK_Shift_L || sym == XK_Shift_R)
     {
       hp->current_trackball = 1;
@@ -848,7 +790,6 @@ ENTRYPOINT Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event)
   }
   else if (event->xany.type == KeyRelease)
   {
-    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
     if (sym == XK_Shift_L || sym == XK_Shift_R)
     {
       hp->current_trackball = 0;
@@ -889,21 +830,116 @@ ENTRYPOINT void init_hypertorus(ModeInfo *mi)
 {
   hypertorusstruct *hp;
 
-  if (hyper == NULL)
-  {
-    hyper = (hypertorusstruct *)calloc(MI_NUM_SCREENS(mi),
-                                       sizeof(hypertorusstruct));
-    if (hyper == NULL)
-      return;
-  }
+  MI_INIT(mi, hyper, NULL);
   hp = &hyper[MI_SCREEN(mi)];
 
   
-  hp->trackballs[0] = gltrackball_init();
-  hp->trackballs[1] = gltrackball_init();
+  hp->trackballs[0] = gltrackball_init(True);
+  hp->trackballs[1] = gltrackball_init(True);
   hp->current_trackball = 0;
   hp->button_pressed = False;
 
+  /* Set the display mode. */
+  if (!strcasecmp(mode,"wireframe") || !strcasecmp(mode,"0"))
+  {
+    display_mode = DISP_WIREFRAME;
+  }
+  else if (!strcasecmp(mode,"surface") || !strcasecmp(mode,"1"))
+  {
+    display_mode = DISP_SURFACE;
+  }
+  else if (!strcasecmp(mode,"transparent") || !strcasecmp(mode,"2"))
+  {
+    display_mode = DISP_TRANSPARENT;
+  }
+  else
+  {
+    display_mode = DISP_SURFACE;
+  }
+
+  /* Set the appearance. */
+  if (!strcasecmp(appear,"solid") || !strcasecmp(appear,"0"))
+  {
+    appearance = APPEARANCE_SOLID;
+  }
+  else if (!strcasecmp(appear,"bands") || !strcasecmp(appear,"1"))
+  {
+    appearance = APPEARANCE_BANDS;
+    num_spirals = 0;
+  }
+  else if (!strcasecmp(appear,"spirals-1") || !strcasecmp(appear,"3"))
+  {
+    appearance = APPEARANCE_SPIRALS;
+    num_spirals = 1;
+  }
+  else if (!strcasecmp(appear,"spirals-2") || !strcasecmp(appear,"4"))
+  {
+    appearance = APPEARANCE_SPIRALS;
+    num_spirals = 2;
+  }
+  else if (!strcasecmp(appear,"spirals-4") || !strcasecmp(appear,"5"))
+  {
+    appearance = APPEARANCE_SPIRALS;
+    num_spirals = 4;
+  }
+  else if (!strcasecmp(appear,"spirals-8") || !strcasecmp(appear,"6"))
+  {
+    appearance = APPEARANCE_SPIRALS;
+    num_spirals = 8;
+  }
+  else if (!strcasecmp(appear,"spirals-16") || !strcasecmp(appear,"7"))
+  {
+    appearance = APPEARANCE_SPIRALS;
+    num_spirals = 16;
+  }
+  else
+  {
+    appearance = APPEARANCE_BANDS;
+    num_spirals = 0;
+  }
+
+  /* Set the color mode. */
+  if (!strcasecmp(color_mode,"twosided"))
+  {
+    colors = COLORS_TWOSIDED;
+  }
+  else if (!strcasecmp(color_mode,"colorwheel"))
+  {
+    colors = COLORS_COLORWHEEL;
+  }
+  else
+  {
+    colors = COLORS_COLORWHEEL;
+  }
+
+  /* Set the 3d projection mode. */
+  if (!strcasecmp(proj_3d,"perspective") || !strcasecmp(proj_3d,"0"))
+  {
+    projection_3d = DISP_3D_PERSPECTIVE;
+  }
+  else if (!strcasecmp(proj_3d,"orthographic") || !strcasecmp(proj_3d,"1"))
+  {
+    projection_3d = DISP_3D_ORTHOGRAPHIC;
+  }
+  else
+  {
+    projection_3d = DISP_3D_PERSPECTIVE;
+  }
+
+  /* Set the 4d projection mode. */
+  if (!strcasecmp(proj_4d,"perspective") || !strcasecmp(proj_4d,"0"))
+  {
+    projection_4d = DISP_4D_PERSPECTIVE;
+  }
+  else if (!strcasecmp(proj_4d,"orthographic") || !strcasecmp(proj_4d,"1"))
+  {
+    projection_4d = DISP_4D_ORTHOGRAPHIC;
+  }
+  else
+  {
+    projection_4d = DISP_4D_PERSPECTIVE;
+  }
+
   /* make multiple screens rotate at slightly different rates. */
   hp->speed_scale = 0.9 + frand(0.3);
 
@@ -954,33 +990,6 @@ ENTRYPOINT void draw_hypertorus(ModeInfo *mi)
 }
 
 
-/*
- *-----------------------------------------------------------------------------
- *    The display is being taken away from us.  Free up malloc'ed 
- *      memory and X resources that we've alloc'ed.  Only called
- *      once, we must zap everything for every screen.
- *-----------------------------------------------------------------------------
- */
-
-ENTRYPOINT void release_hypertorus(ModeInfo *mi)
-{
-  if (hyper != NULL)
-  {
-    int screen;
-
-    for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
-    {
-      hypertorusstruct *hp = &hyper[screen];
-
-      if (hp->glx_context)
-        hp->glx_context = (GLXContext *)NULL;
-    }
-    (void) free((void *)hyper);
-    hyper = (hypertorusstruct *)NULL;
-  }
-  FreeAllGL(mi);
-}
-
 #ifndef STANDALONE
 ENTRYPOINT void change_hypertorus(ModeInfo *mi)
 {