X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fglx%2Fflurry.c;h=e6d1b22699b2eaf28ac3efbf18565c9fadf84007;hp=346c1151d0064969b827d7512ff76cd5b1d1347a;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hpb=d6b0217f2417bd19187f0ebc389d6c5c2233b11c diff --git a/hacks/glx/flurry.c b/hacks/glx/flurry.c index 346c1151..e6d1b226 100644 --- a/hacks/glx/flurry.c +++ b/hacks/glx/flurry.c @@ -48,6 +48,7 @@ static const char sccsid[] = "@(#)flurry.c 4.07 97/11/24 xlockmore"; "*showFPS: False \n" # define refresh_flurry 0 +# define release_flurry 0 # define flurry_handle_event 0 # include "xlockmore.h" /* from the xscreensaver distribution */ @@ -72,7 +73,7 @@ ModStruct flurry_description = { "flurry", "init_flurry", "draw_flurry", - "release_flurry", + NULL, "draw_flurry", "init_flurry", NULL, @@ -90,8 +91,6 @@ ModStruct flurry_description = { global_info_t *flurry_info = NULL; -static double gTimeCounter = 0.0; - static double currentTime(void) { struct timeval tv; @@ -105,14 +104,8 @@ double currentTime(void) { 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 @@ -150,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; @@ -231,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); @@ -332,6 +326,8 @@ ENTRYPOINT void reshape_flurry(ModeInfo *mi, int width, int height) GLResize(global, (float)width, (float)height); } +static void free_flurry(ModeInfo * mi); + ENTRYPOINT void init_flurry(ModeInfo * mi) { @@ -349,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; @@ -468,13 +461,14 @@ init_flurry(ModeInfo * mi) } else { MI_CLEARWINDOW(mi); } + + global->first = 1; + global->oldFrameTime = -1; } ENTRYPOINT void draw_flurry(ModeInfo * mi) { - static int first = 1; - static double oldFrameTime = -1; double newFrameTime; double deltaFrameTime = 0; double brite; @@ -486,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 { @@ -499,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)); @@ -538,28 +532,19 @@ draw_flurry(ModeInfo * mi) glXSwapBuffers(display, window); } -ENTRYPOINT 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)