From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / flurry.c
index 63b89f666a83b42b49d62fa14a66e14e4a44325d..e6d1b22699b2eaf28ac3efbf18565c9fadf84007 100644 (file)
@@ -37,29 +37,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 /* flurry */
 
-#if !defined( lint ) && !defined( SABER )
+#if 0
 static const char sccsid[] = "@(#)flurry.c     4.07 97/11/24 xlockmore";
-
 #endif
 
-/*-
- * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
- * otherwise caddr_t is not defined correctly
- */
-
-#define DEF_PRESET     "classic"
+#define DEF_PRESET     "random"
 #define DEF_BRIGHTNESS "8"
 
-#include <X11/Intrinsic.h>
-
-# define PROGCLASS             "Flurry"
-# define HACK_INIT             init_flurry
-# define HACK_DRAW             draw_flurry
-# define HACK_RESHAPE          reshape_flurry
-# define flurry_opts           xlockmore_opts
-# define DEFAULTS              "*showFPS:      False   \n" \
-                               "*preset:       " DEF_PRESET "   \n"
+# define DEFAULTS              "*delay:      10000 \n" \
+                                               "*showFPS:    False \n"
 
+# define refresh_flurry 0
+# define release_flurry 0
+# define flurry_handle_event 0
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 
 #ifdef USE_GL
@@ -71,19 +61,19 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-    {(caddr_t *) &preset_str, "preset",     "Preset",     DEF_PRESET,     t_String},
+    {&preset_str, "preset",     "Preset",     DEF_PRESET,     t_String},
 };
 
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
-ModeSpecOpt flurry_opts = {countof(opts), opts, countof(vars), vars, NULL};
+ENTRYPOINT ModeSpecOpt flurry_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
 #ifdef USE_MODULES
 ModStruct   flurry_description = {
     "flurry",
     "init_flurry",
     "draw_flurry",
-    "release_flurry",
+    NULL,
     "draw_flurry",
     "init_flurry",
     NULL,
@@ -97,30 +87,25 @@ ModStruct   flurry_description = {
 
 #endif
 
-#include <sys/time.h>
-
 #include "flurry.h"
 
 global_info_t *flurry_info = NULL;
 
-static double gTimeCounter = 0.0;
-
+static
 double currentTime(void) {
   struct timeval tv;
-
-  gettimeofday(&tv, NULL);
+# ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tzp;
+  gettimeofday(&tv, &tzp);
+# else
+  gettimeofday(&tv);
+# endif
 
   return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0;
 }
 
-void OTSetup (void) {
-    if (gTimeCounter == 0.0) {
-        gTimeCounter = currentTime();
-    }
-}
-
-double TimeInSecondsSinceStart (void) {
-    return currentTime() - gTimeCounter;
+double TimeInSecondsSinceStart (const global_info_t *global) {
+    return currentTime() - global->gTimeCounter;
 }
 
 #if 0
@@ -132,6 +117,8 @@ static int IsAltiVecAvailable(void)
 #endif
 #endif
 
+
+static
 void delete_flurry_info(flurry_info_t *flurry)
 {
     int i;
@@ -142,9 +129,10 @@ void delete_flurry_info(flurry_info_t *flurry)
     {
        free(flurry->spark[i]);
     }
-    free(flurry);
+    /* free(flurry); */
 }
 
+static
 flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes colour, float thickness, float speed, double bf)
 {
     int i,k;
@@ -155,7 +143,8 @@ flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes co
     flurry->flurryRandomSeed = RandFlt(0.0, 300.0);
 
        flurry->fOldTime = 0;
-       flurry->fTime = TimeInSecondsSinceStart() + flurry->flurryRandomSeed;
+       flurry->dframe = 0;
+       flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
        flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
 
     flurry->numStreams = streams;
@@ -189,6 +178,7 @@ flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes co
     return flurry;
 }
 
+static
 void GLSetupRC(global_info_t *global)
 {
     /* setup the defaults for OpenGL */
@@ -203,11 +193,10 @@ void GLSetupRC(global_info_t *global)
     glViewport(0,0,(int) global->sys_glWidth,(int) global->sys_glHeight);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
-    gluOrtho2D(0,global->sys_glWidth,0,global->sys_glHeight);
+    glOrtho(0,global->sys_glWidth,0,global->sys_glHeight,-1,1);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
 
-    glClearColor(0.0,0.0,0.0,1.0);
     glClear(GL_COLOR_BUFFER_BIT);
 
     glEnableClientState(GL_COLOR_ARRAY);       
@@ -228,6 +217,7 @@ void GLSetupRC(global_info_t *global)
 #endif /* 0 */
 }
 
+static
 void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
 {
     int i;
@@ -235,7 +225,7 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
     flurry->dframe++;
 
     flurry->fOldTime = flurry->fTime;
-    flurry->fTime = TimeInSecondsSinceStart() + flurry->flurryRandomSeed;
+    flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
     flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
 
     flurry->drag = (float) pow(0.9965,flurry->fDeltaTime*85.0);
@@ -312,6 +302,7 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
     glDisable(GL_TEXTURE_2D);
 }
 
+static
 void GLResize(global_info_t *global, float w, float h)
 {
     global->sys_glWidth = w;
@@ -319,7 +310,7 @@ void GLResize(global_info_t *global, float w, float h)
 }
 
 /* new window size or exposure */
-void reshape_flurry(ModeInfo *mi, int width, int height)
+ENTRYPOINT void reshape_flurry(ModeInfo *mi, int width, int height)
 {
     global_info_t *global = flurry_info + MI_SCREEN(mi);
 
@@ -328,18 +319,16 @@ void reshape_flurry(ModeInfo *mi, int width, int height)
     glViewport(0.0, 0.0, width, height);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
-    gluOrtho2D(0, width, 0, height);
+    glOrtho(0, width, 0, height,-1,1);
     glMatrixMode(GL_MODELVIEW);
-
-    glClearColor(0.0, 0.0, 0.0, 1.0);
     glClear(GL_COLOR_BUFFER_BIT);
-
     glFlush();
-
     GLResize(global, (float)width, (float)height);
 }
 
-void
+static void free_flurry(ModeInfo * mi);
+
+ENTRYPOINT void
 init_flurry(ModeInfo * mi)
 {
     int screen = MI_SCREEN(mi);
@@ -356,15 +345,12 @@ init_flurry(ModeInfo * mi)
         PRESET_MAX
     } preset_num;
 
-    if (flurry_info == NULL) {
-       OTSetup();
-       if ((flurry_info = (global_info_t *) calloc(MI_NUM_SCREENS(mi),
-                       sizeof (global_info_t))) == NULL)
-           return;
-    }
+    MI_INIT (mi, flurry_info, free_flurry);
 
     global = &flurry_info[screen];
 
+    global->gTimeCounter = currentTime();
+
     global->window = MI_WINDOW(mi);
 
     global->flurry = NULL;
@@ -405,7 +391,7 @@ init_flurry(ModeInfo * mi)
     case PRESET_FIRE: {
        flurry_info_t *flurry;
 
-       flurry = new_flurry_info(global, 12, slowCyclicColorMode, 10000.0, 0.0, 1.0);
+       flurry = new_flurry_info(global, 12, slowCyclicColorMode, 10000.0, 0.2, 1.0);
        flurry->next = global->flurry;
        global->flurry = flurry;        
         break;
@@ -475,13 +461,14 @@ init_flurry(ModeInfo * mi)
     } else {
        MI_CLEARWINDOW(mi);
     }
+
+    global->first = 1;
+    global->oldFrameTime = -1;
 }
 
-void
+ENTRYPOINT void
 draw_flurry(ModeInfo * mi)
 {
-    static int first = 1;
-    static double oldFrameTime = -1;
     double newFrameTime;
     double deltaFrameTime = 0;
     double brite;
@@ -493,7 +480,7 @@ draw_flurry(ModeInfo * mi)
     Window      window = MI_WINDOW(mi);
 
     newFrameTime = currentTime();
-    if (oldFrameTime == -1) {
+    if (global->oldFrameTime == -1) {
        /* special case the first frame -- clear to black */
        alpha = 1.0;
     } else {
@@ -506,24 +493,24 @@ draw_flurry(ModeInfo * mi)
         * than that and the blending causes the display to
         * saturate, which looks really ugly.
         */
-       if (newFrameTime - oldFrameTime < 1/60.0) {
-           usleep(MAX_(1,(int)(20000 * (newFrameTime - oldFrameTime))));
+       if (newFrameTime - global->oldFrameTime < 1/60.0) {
+           usleep(MAX_(1,(int)(20000 * (newFrameTime - global->oldFrameTime))));
            return;
 
        }
-       deltaFrameTime = newFrameTime - oldFrameTime;
+       deltaFrameTime = newFrameTime - global->oldFrameTime;
        alpha = 5.0 * deltaFrameTime;
     }
-    oldFrameTime = newFrameTime;
+    global->oldFrameTime = newFrameTime;
 
     if (alpha > 0.2) alpha = 0.2;
 
     if (!global->glx_context)
        return;
 
-    if (first) {
+    if (global->first) {
        MakeTexture();
-       first = 0;
+       global->first = 0;
     }
     glDrawBuffer(GL_BACK);
     glXMakeCurrent(display, window, *(global->glx_context));
@@ -545,28 +532,21 @@ draw_flurry(ModeInfo * mi)
     glXSwapBuffers(display, window);
 }
 
-void
-release_flurry(ModeInfo * mi)
+static void
+free_flurry(ModeInfo * mi)
 {
-    if (flurry_info != NULL) {
-       int screen;
-
-       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-           global_info_t *global = &flurry_info[screen];
-           flurry_info_t *flurry;
+    global_info_t *global = &flurry_info[MI_SCREEN(mi)];
+    flurry_info_t *flurry;
 
-           if (global->glx_context) {
-               glXMakeCurrent(MI_DISPLAY(mi), global->window, *(global->glx_context));
-           }
+    if (global->glx_context) {
+       glXMakeCurrent(MI_DISPLAY(mi), global->window, *(global->glx_context));
+    }
 
-           for (flurry = global->flurry; flurry; flurry=flurry->next) {
-               delete_flurry_info(flurry);
-           }
-       }
-       (void) free((void *) flurry_info);
-       flurry_info = NULL;
+    for (flurry = global->flurry; flurry; flurry=flurry->next) {
+       delete_flurry_info(flurry);
     }
-    FreeAllGL(mi);
 }
 
+XSCREENSAVER_MODULE ("Flurry", flurry)
+
 #endif