X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fgflux.c;h=f2e682addcbbb6020a33468cf6b916064fc919e3;hb=e4fa2ac140f7bc56571373a7b7eb585fa4500e38;hp=56b7a02624f64c41cd5880020ac04dff6b650654;hpb=13dbc569cdc6e29019722c0ef9b932a925efbcad;p=xscreensaver diff --git a/hacks/glx/gflux.c b/hacks/glx/gflux.c index 56b7a026..f2e682ad 100644 --- a/hacks/glx/gflux.c +++ b/hacks/glx/gflux.c @@ -2,7 +2,7 @@ /* gflux - creates a fluctuating 3D grid * requires OpenGL or MesaGL * - * Copyright (c) Josiah Pease, 2000 + * Copyright (c) Josiah Pease, 2000, 2003 * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that @@ -52,6 +52,8 @@ # define HACK_INIT init_gflux # define HACK_DRAW draw_gflux # define HACK_RESHAPE reshape_gflux +# define HACK_HANDLE_EVENT gflux_handle_event +# define EVENT_MASK PointerMotionMask # define gflux_opts xlockmore_opts #define DEFAULTS "*delay: 20000 \n" \ "*showFPS: False \n" \ @@ -102,6 +104,7 @@ #include #include "grab-ximage.h" +#include "gltrackball.h" static enum {wire=0,solid,light,checker,textured,grab} _draw; /* draw style */ @@ -120,6 +123,9 @@ static int _waveChange = 50; static float _waveHeight = 1.0; static float _waveFreq = 3.0; +static trackball_state *trackball; +static Bool button_down_p = False; + #define WIDTH 320 #define HEIGHT 240 @@ -142,19 +148,19 @@ static XrmOptionDescRec opts[] = { static argtype vars[] = { - {(caddr_t *) & _squares, "squares", "Squares", "19", t_Int}, - {(caddr_t *) & _resolution, "resolution", "Resolution", "4", t_Int}, -/* {(caddr_t *) & _draw, "draw", "Draw", "2", t_Int},*/ - {(caddr_t *) & _flat, "flat", "Flat", "0", t_Int}, - {(caddr_t *) & _speed, "speed", "Speed", "0.05", t_Float}, - {(caddr_t *) & _rotationx, "rotationx", "Rotationx", "0.01", t_Float}, - {(caddr_t *) & _rotationy, "rotationy", "Rotationy", "0.0", t_Float}, - {(caddr_t *) & _rotationz, "rotationz", "Rotationz", "0.1", t_Float}, - {(caddr_t *) & _waves, "waves", "Waves", "3", t_Int}, - {(caddr_t *) & _waveChange, "waveChange", "WaveChange", "50", t_Int}, - {(caddr_t *) & _waveHeight, "waveHeight", "WaveHeight", "1.0", t_Float}, - {(caddr_t *) & _waveFreq, "waveFreq", "WaveFreq", "3.0", t_Float}, - {(caddr_t *) & _zoom, "zoom", "Zoom", "1.0", t_Float}, + {&_squares, "squares", "Squares", "19", t_Int}, + {&_resolution, "resolution", "Resolution", "4", t_Int}, +/* {&_draw, "draw", "Draw", "2", t_Int},*/ + {&_flat, "flat", "Flat", "0", t_Int}, + {&_speed, "speed", "Speed", "0.05", t_Float}, + {&_rotationx, "rotationx", "Rotationx", "0.01", t_Float}, + {&_rotationy, "rotationy", "Rotationy", "0.0", t_Float}, + {&_rotationz, "rotationz", "Rotationz", "0.1", t_Float}, + {&_waves, "waves", "Waves", "3", t_Int}, + {&_waveChange, "waveChange", "WaveChange", "50", t_Int}, + {&_waveHeight, "waveHeight", "WaveHeight", "1.0", t_Float}, + {&_waveFreq, "waveFreq", "WaveFreq", "3.0", t_Float}, + {&_zoom, "zoom", "Zoom", "1.0", t_Float}, }; @@ -207,7 +213,7 @@ typedef struct { int imageMax; GLubyte *image; #endif - GLint texName; + GLuint texName; GLfloat tex_xscale; GLfloat tex_yscale; void (*drawFunc)(void); @@ -240,6 +246,43 @@ double getGrid(double,double,double); /* BEGINNING OF FUNCTIONS */ +Bool +gflux_handle_event (ModeInfo *mi, XEvent *event) +{ + if (event->xany.type == ButtonPress && + event->xbutton.button & Button1) + { + button_down_p = True; + gltrackball_start (trackball, + event->xbutton.x, event->xbutton.y, + MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + else if (event->xany.type == ButtonRelease && + event->xbutton.button & Button1) + { + button_down_p = False; + return True; + } + else if (event->xany.type == MotionNotify && + button_down_p) + { + gltrackball_track (trackball, + event->xmotion.x, event->xmotion.y, + MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + + return False; +} + + +static void +userRot(void) +{ + gltrackball_rotate (trackball); +} + /* draw the gflux once */ void draw_gflux(ModeInfo * mi) { @@ -343,6 +386,8 @@ void init_gflux(ModeInfo * mi) } gp = &gflux[screen]; + trackball = gltrackball_init (); + { char *s = get_string_resource ("mode", "Mode"); if (!s || !*s) _draw = wire; @@ -576,7 +621,8 @@ grabTexture(void) int real_width = gflux->modeinfo->xgwa.width; int real_height = gflux->modeinfo->xgwa.height; XImage *ximage = screen_to_ximage (gflux->modeinfo->xgwa.screen, - gflux->window); + gflux->window, + NULL); Bool bigimage = False; int size = 0; @@ -635,7 +681,7 @@ grabTexture(void) gflux->imageWidth = ximage->width; gflux->imageHeight = ximage->height; - gflux->image = ximage->data; + gflux->image = (GLubyte *) ximage->data; if (bigimage) /* don't scale really large images */ { @@ -717,6 +763,7 @@ void displayTexture(void) glRotatef(anglex,1,0,0); glRotatef(angley,0,1,0); glRotatef(anglez,0,0,1); + userRot(); glScalef(1,1,(GLfloat)_waveHeight); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); @@ -756,10 +803,12 @@ void displayTexture(void) glEnd(); } - time -= _speed; - anglex -= _rotationx; - angley -= _rotationy; - anglez -= _rotationz; + if (! button_down_p) { + time -= _speed; + anglex -= _rotationx; + angley -= _rotationy; + anglez -= _rotationz; + } } void displaySolid(void) { @@ -777,6 +826,7 @@ void displaySolid(void) glRotatef(anglex,1,0,0); glRotatef(angley,0,1,0); glRotatef(anglez,0,0,1); + userRot(); glScalef(1,1,(GLfloat)_waveHeight); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); @@ -796,10 +846,12 @@ void displaySolid(void) glEnd(); } - time -= _speed; - anglex -= _rotationx; - angley -= _rotationy; - anglez -= _rotationz; + if (! button_down_p) { + time -= _speed; + anglex -= _rotationx; + angley -= _rotationy; + anglez -= _rotationz; + } } @@ -819,6 +871,7 @@ void displayLight(void) glRotatef(anglex,1,0,0); glRotatef(angley,0,1,0); glRotatef(anglez,0,0,1); + userRot(); glScalef(1,1,(GLfloat)_waveHeight); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); @@ -848,10 +901,12 @@ void displayLight(void) glEnd(); } - time -= _speed; - anglex -= _rotationx; - angley -= _rotationy; - anglez -= _rotationz; + if (! button_down_p) { + time -= _speed; + anglex -= _rotationx; + angley -= _rotationy; + anglez -= _rotationz; + } } void displayWire(void) @@ -872,6 +927,7 @@ void displayWire(void) glRotatef(anglex,1,0,0); glRotatef(angley,0,1,0); glRotatef(anglez,0,0,1); + userRot(); glScalef(1,1,(GLfloat)_waveHeight); glClear(GL_COLOR_BUFFER_BIT); @@ -896,10 +952,12 @@ void displayWire(void) glEnd(); } - time -= _speed; - anglex -= _rotationx; - angley -= _rotationy; - anglez -= _rotationz; + if (! button_down_p) { + time -= _speed; + anglex -= _rotationx; + angley -= _rotationy; + anglez -= _rotationz; + } } /* generates new ripples */ @@ -909,12 +967,14 @@ void calcGrid(void) double tmp; static int newWave; + if (button_down_p) return; + tmp = 1.0/((double)_waveChange); if(!(counter%_waveChange)) { newWave = ((int)(counter*tmp))%_waves; - gflux->dispx[newWave] = 1.0 - ((double)random())/RAND_MAX; - gflux->dispy[newWave] = 1.0 - ((double)random())/RAND_MAX; - gflux->freq[newWave] = _waveFreq * ((float)random())/RAND_MAX; + gflux->dispx[newWave] = -frand(1.0); + gflux->dispy[newWave] = -frand(1.0); + gflux->freq[newWave] = _waveFreq * frand(1.0); gflux->wa[newWave] = 0.0; } counter++;