ftp://ftp.linux.ncsu.edu/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/4/en/os...
[xscreensaver] / hacks / glx / superquadrics.c
index 7e1d33e27d7d61d031f47e6be669384f24a4a329..a566589cd3a2fba8539b4208e70cc5117192b01f 100644 (file)
@@ -1,10 +1,12 @@
-/* -*- Mode: C; tab-width: 4 -*-
- * superquadrics.c --- 3D mathematical shapes
- */
-#if !defined( lint ) && !defined( SABER )
-static const char sccsid[] = "@(#)superquadrics.c      4.04 97/07/28 xlockmore";
+/* -*- Mode: C; tab-width: 4 -*- */
+/* superquadrics --- 3D mathematical shapes */
+
+#if 0
+static const char sccsid[] = "@(#)superquadrics.c      4.07 97/11/24 xlockmore";
 #endif
-/* Permission to use, copy, modify, and distribute this software and its
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
  * documentation for any purpose and without fee is hereby granted,
  * provided that the above copyright notice appear in all copies and that
  * both that copyright notice and this permission notice appear in
@@ -68,21 +70,15 @@ static const char sccsid[] = "@(#)superquadrics.c   4.04 97/07/28 xlockmore";
  * Ed Mackey
  */
 
-/*-
- * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
- * otherwise caddr_t is not defined correctly
- */
-
-#include <X11/Intrinsic.h>
-
 #ifdef STANDALONE
 # define PROGCLASS                                     "Superquadrics"
 # define HACK_INIT                                     init_superquadrics
 # define HACK_DRAW                                     draw_superquadrics
 # define superquadrics_opts                    xlockmore_opts
-# define DEFAULTS      "*count:                25      \n"                     \
+# define DEFAULTS      "*delay:                40000   \n"                     \
+                                       "*count:                25      \n"                     \
                                        "*cycles:               40      \n"                     \
-                                       "*delay:                100     \n"                     \
+                                       "*showFPS:      False   \n"                     \
                                        "*wireframe:    False   \n"
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -104,11 +100,11 @@ static float spinspeed;
 
 static XrmOptionDescRec opts[] =
 {
-  {"-spinspeed", ".superquadrics.spinspeed", XrmoptionSepArg, (caddr_t) NULL}
+  {"-spinspeed", ".superquadrics.spinspeed", XrmoptionSepArg, 0}
 };
 static argtype vars[] =
 {
-  {(caddr_t *) & spinspeed, "spinspeed", "Spinspeed", DEF_SPINSPEED, t_Float}
+  {&spinspeed, "spinspeed", "Spinspeed", DEF_SPINSPEED, t_Float}
 };
 static OptionStruct desc[] =
 {
@@ -116,7 +112,16 @@ static OptionStruct desc[] =
 };
 
 ModeSpecOpt superquadrics_opts =
-{1, opts, 1, vars, desc};
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   superquadrics_description =
+{"superquadrics", "init_superquadrics", "draw_superquadrics", "release_superquadrics",
+ "refresh_superquadrics", "init_superquadrics", NULL, &superquadrics_opts,
+ 1000, 25, 40, 1, 4, 1.0, "",
+ "Shows 3D mathematical shapes", 0, NULL};
+
+#endif
 
 #include <GL/glu.h>
 
@@ -133,7 +138,7 @@ typedef struct {
 } state;
 
 typedef struct {
-       GLXContext  glx_context;
+       GLXContext *glx_context;
        int         dist, wireframe, flatshade, shownorms, maxcount, maxwait;
        int         counter, viewcount, viewwait, mono;
        GLfloat     curmat[4][4], rotx, roty, rotz, spinspeed;
@@ -258,8 +263,13 @@ MakeUpStuff(int allstuff, superquadricsstruct * sp)
        }
        if (dostuff & 4) {
                if (sp->mono) {
-                       b = g = r = (GLfloat) (140 + myrand(100)) / 255.0;
-                       b2 = g2 = r2 = ((r > 0.69) ? (1.0 - r) : r);
+                       if (sp->wireframe) {
+                               b = g = r = 1.0;
+                               b2 = g2 = r2 = 1.0;
+                       } else {
+                               b = g = r = (GLfloat) (140 + myrand(100)) / 255.0;
+                               b2 = g2 = r2 = ((r > 0.69) ? (1.0 - r) : r);
+                       }
                } else {
                        r = (GLfloat) (40 + myrand(200)) / 255.0;
                        g = (GLfloat) (40 + myrand(200)) / 255.0;
@@ -705,23 +715,20 @@ init_superquadrics(ModeInfo * mi)
                        return;
        }
        sp = &superquadrics[screen];
-       sp->mono = (MI_WIN_IS_MONO(mi) ? 1 : 0);
+       sp->mono = (MI_IS_MONO(mi) ? 1 : 0);
 
-       sp->glx_context = init_GL(mi);
+       if ((sp->glx_context = init_GL(mi)) != NULL) {
 
-       InitSuperquadrics(MI_WIN_IS_WIREFRAME(mi) || sp->mono, 0,
-                         MI_BATCHCOUNT(mi), MI_CYCLES(mi), spinspeed, sp);
-       ReshapeSuperquadrics(MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi));
+               InitSuperquadrics(MI_IS_WIREFRAME(mi), 0,
+                                 MI_COUNT(mi), MI_CYCLES(mi), spinspeed, sp);
+               ReshapeSuperquadrics(MI_WIDTH(mi), MI_HEIGHT(mi));
 
-       DisplaySuperquadrics(sp);
-       glFinish();
-       glXSwapBuffers(display, window);
-}
-
-void
-refresh_superquadrics(ModeInfo * mi)
-{
-       /* Nothing happens here */
+               DisplaySuperquadrics(sp);
+               glFinish();
+               glXSwapBuffers(display, window);
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
 }
 
 void
@@ -731,24 +738,32 @@ draw_superquadrics(ModeInfo * mi)
        Display    *display = MI_DISPLAY(mi);
        Window      window = MI_WINDOW(mi);
 
-       glXMakeCurrent(display, window, sp->glx_context);
+       if (!sp->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(sp->glx_context));
 
        NextSuperquadricDisplay(sp);
 
+    if (mi->fps_p) do_fps (mi);
        glFinish();
        glXSwapBuffers(display, window);
 }
 
+void
+refresh_superquadrics(ModeInfo * mi)
+{
+       /* Nothing happens here */
+}
+
 void
 release_superquadrics(ModeInfo * mi)
 {
        if (superquadrics != NULL) {
-
-               /* Don't destroy the glXContext.  init_GL does that. */
-
                (void) free((void *) superquadrics);
                superquadrics = NULL;
        }
+       FreeAllGL(mi);
 }