X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fprovidence.c;h=d628845e6d567f17f7fcb7ca1f8283a0758a6645;hb=39809ded547bdbb08207d3e514950425215b4410;hp=1f9e3bda979f3b1eeec919498dd8843ddd49856f;hpb=f8cf5ac7b2f53510f80a0eaf286a25298be17bfe;p=xscreensaver diff --git a/hacks/glx/providence.c b/hacks/glx/providence.c index 1f9e3bda..d628845e 100644 --- a/hacks/glx/providence.c +++ b/hacks/glx/providence.c @@ -19,7 +19,8 @@ "*showFPS: False \n" \ "*wireframe: False \n" -# define refresh_providence 0 +# define free_providence 0 +# define release_providence 0 #include "xlockmore.h" #else #include "xlock.h" @@ -53,7 +54,7 @@ ENTRYPOINT ModeSpecOpt providence_opts = { #ifdef USE_MODULES ModStruct providence_description = { "providence", "init_providence", "draw_providence", - "release_providence", "draw_providence", "change_providence", + (char *) NULL, "draw_providence", "change_providence", (char *) NULL, &providence_opts, 1000, 1, 1, 1, 4, 1.0, "", "draws pyramid with glory", 0, NULL }; @@ -74,7 +75,7 @@ ModStruct providence_description = { #define EYE_PARTICLE_COUNT 2000 -#define LOOKUPSIZE 3600 +#define LOOKUPSIZE (3600/5) /* 3600 was way too much RAM on iOS */ #define EYELENGTH 300 #define EPSILON 0.0001 @@ -274,7 +275,7 @@ static void update_particles(providencestruct *mp) int x = mp->eyeparticles[i][1] + random()%(cos(mp->theta) < 0.0 ? 8 : 16); /* reset if dead */ - if(x > EYELENGTH || random()%(cos(mp->theta) < 0.0 ? 40 : 10) == 0) { + if(x >= EYELENGTH || random()%(cos(mp->theta) < 0.0 ? 40 : 10) == 0) { /* if(x > EYELENGTH || (x > EYELENGTH/(2/3.0) && random()%7 == 0)) { */ mp->eyeparticles[i][0] = random()%LOOKUPSIZE; @@ -595,10 +596,17 @@ static void draw_providence_strip(ModeInfo *mi) ENTRYPOINT void reshape_providence(ModeInfo * mi, int width, int height) { - double h = (GLfloat) height / (GLfloat) width; providencestruct *mp = &providence[MI_SCREEN(mi)]; + double h = (GLfloat) height / (GLfloat) width; + int y = 0; - glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height); + if (width > height * 5) { /* tiny window: show middle */ + height = width * 3; + y = -height/2; + h = height / (GLfloat) width; + } + + glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -625,18 +633,6 @@ static void pinit(providencestruct *mp) glEndList(); } -/* cleanup routine */ -ENTRYPOINT void release_providence(ModeInfo * mi) -{ - - if(providence) { - free((void *) providence); - providence = (providencestruct *) NULL; - } - - FreeAllGL(mi); -} - /* event handling */ ENTRYPOINT Bool providence_handle_event(ModeInfo *mi, XEvent *event) { @@ -644,62 +640,36 @@ ENTRYPOINT Bool providence_handle_event(ModeInfo *mi, XEvent *event) switch(event->xany.type) { case ButtonPress: - switch(event->xbutton.button) { - - case Button1: - mp->button_down_p = True; - gltrackball_start(mp->trackball, - event->xbutton.x, event->xbutton.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - break; - case Button4: mp->camera_velocity += 1.0; - break; - + return True; case Button5: mp->camera_velocity -= 1.0; + return True; + default: break; } - break; - - case ButtonRelease: - - switch(event->xbutton.button) { - case Button1: - mp->button_down_p = False; - break; - } - - break; - - case MotionNotify: - if(mp->button_down_p) - gltrackball_track(mp->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - break; - default: - return False; + break; } - return True; + if (gltrackball_event_handler (event, mp->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &mp->button_down_p)) + return True; + + return False; } ENTRYPOINT void init_providence(ModeInfo *mi) { providencestruct *mp; - if(!providence) { - if((providence = (providencestruct *) - calloc(MI_NUM_SCREENS(mi), sizeof (providencestruct))) == NULL) - return; - } + MI_INIT(mi, providence); mp = &providence[MI_SCREEN(mi)]; - mp->trackball = gltrackball_init (); + mp->trackball = gltrackball_init (False); mp->position0[0] = 1; mp->position0[1] = 5; @@ -711,6 +681,10 @@ ENTRYPOINT void init_providence(ModeInfo *mi) mp->mono = MI_IS_MONO(mi); mp->wire = MI_IS_WIREFRAME(mi); +# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */ + mp->wire = 0; +# endif + /* make multiple screens rotate at slightly different rates. */ mp->theta_scale = 0.7 + frand(0.6); @@ -782,11 +756,18 @@ ENTRYPOINT void draw_providence(ModeInfo * mi) /* rotate providence */ glTranslatef(0.0, 0.0, mp->camera_z + sin(mp->theta/4.0)); glRotatef(10.0+20.0*sin(mp->theta/2.0), 1.0, 0.0, 0.0); - glRotatef(-current_device_rotation(), 0, 0, 1); gltrackball_rotate(mp->trackball); - glRotatef(current_device_rotation(), 0, 0, 1); glRotatef(mp->theta * 180.0 / Pi, 0.0, -1.0, 0.0); +# 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 + /* draw providence */ draw_providence_strip(mi); glPopMatrix();