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
* 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
*/
/*
#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 */
#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};
#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;
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[] =
}
}
+#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;
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;
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);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
}
- else
+ else /* display_mode == DISP_WIREFRAME */
{
glDisable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
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)
}
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;
}
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;
{
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);
}
-/*
- *-----------------------------------------------------------------------------
- * 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)
{