X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fprovidence.c;h=695ef7571ab170c77fb0453809da78466beb62c9;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=3ecf88c4e3f0a7119e935d3389a173ff266ff89d;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/glx/providence.c b/hacks/glx/providence.c index 3ecf88c4..695ef757 100644 --- a/hacks/glx/providence.c +++ b/hacks/glx/providence.c @@ -74,7 +74,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 @@ -154,14 +154,9 @@ static void make_brick(providencestruct *mp) glGenTextures(1, &mp->bricktexture); glBindTexture(GL_TEXTURE_2D, mp->bricktexture); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, &mp->checkImage[0][0]); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } @@ -279,7 +274,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; @@ -617,34 +612,12 @@ ENTRYPOINT void reshape_providence(ModeInfo * mi, int width, int height) static void pinit(providencestruct *mp) { glClearDepth(1.0); - glClearColor(0.0, 0.0, 0.0, 1.0); - - /* setup twoside lighting */ - glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2); - glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); - glLightfv(GL_LIGHT0, GL_POSITION, mp->position0); - - glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); - glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); mp->currenttime = 0.0; init_particles(mp); make_brick(mp); build_eye(mp); - glEnable(GL_NORMALIZE); - glFrontFace(GL_CCW); -/* glDisable(GL_CULL_FACE); */ - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glShadeModel(GL_SMOOTH); - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - /* build pyramid list */ mp->pyramidlist = glGenLists(1); glNewList(mp->pyramidlist, GL_COMPILE); @@ -671,49 +644,27 @@ 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) @@ -726,7 +677,7 @@ ENTRYPOINT void init_providence(ModeInfo *mi) return; } mp = &providence[MI_SCREEN(mi)]; - mp->trackball = gltrackball_init (); + mp->trackball = gltrackball_init (False); mp->position0[0] = 1; mp->position0[1] = 5; @@ -738,12 +689,16 @@ 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); if((mp->glx_context = init_GL(mi)) != NULL) { reshape_providence(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); - glDrawBuffer(GL_BACK); + /* glDrawBuffer(GL_BACK); */ pinit(mp); } else @@ -768,9 +723,37 @@ ENTRYPOINT void draw_providence(ModeInfo * mi) glXMakeCurrent(display, window, *(mp->glx_context)); + /* setup twoside lighting */ + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, mp->position0); + + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + glEnable(GL_NORMALIZE); + glFrontFace(GL_CCW); +/* glDisable(GL_CULL_FACE); */ + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glShadeModel(GL_SMOOTH); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); + glRotatef(current_device_rotation(), 0, 0, 1); /* modify camera */ if(fabs(mp->camera_velocity) > EPSILON) { @@ -784,6 +767,15 @@ ENTRYPOINT void draw_providence(ModeInfo * mi) gltrackball_rotate(mp->trackball); 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();