X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fblocktube.c;h=3ff5cdb3d37139269178c4bde0c3f2aa1a124dbe;hb=39809ded547bdbb08207d3e514950425215b4410;hp=f3e71c81b7b2dc952aeeaf93c5750f640727b90d;hpb=50be9bb40dc60130c99ffa568e6677779904ff70;p=xscreensaver diff --git a/hacks/glx/blocktube.c b/hacks/glx/blocktube.c index f3e71c81..3ff5cdb3 100644 --- a/hacks/glx/blocktube.c +++ b/hacks/glx/blocktube.c @@ -16,9 +16,10 @@ #define DEFAULTS "*delay: 40000 \n" \ "*wireframe: False \n" \ "*showFPS: False \n" \ + "*suppressRotationAnimation: True\n" \ -# define refresh_blocktube 0 -# define blocktube_handle_event 0 +# define release_blocktube 0 +# define blocktube_handle_event xlockmore_no_events #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -108,8 +109,8 @@ ENTRYPOINT ModeSpecOpt blocktube_opts = {countof(opts), opts, countof(vars), var #ifdef USE_MODULES ModStruct blocktube_description = - {"blocktube", "init_blocktube", "draw_blocktube", "release_blocktube", - "draw_blocktube", "init_blocktube", (char *)NULL, &blocktube_opts, + {"blocktube", "init_blocktube", "draw_blocktube", (char *)NULL, + "draw_blocktube", "init_blocktube", "free_blocktube", &blocktube_opts, 40000, 30, 1, 1, 64, 1.0, "", "A shifting tunnel of reflective blocks", 0, NULL}; #endif /* USE_MODULES */ @@ -133,8 +134,10 @@ static Bool LoadGLTextures(ModeInfo *mi) GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, lp->texti->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +# ifndef HAVE_JWZGLES /* #### Sphere maps unimplemented */ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); +# endif } return status; } @@ -209,14 +212,7 @@ ENTRYPOINT void init_blocktube (ModeInfo *mi) blocktube_configuration *lp; int wire = MI_IS_WIREFRAME(mi); - if (!lps) { - lps = (blocktube_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (blocktube_configuration)); - if (!lps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - } + MI_INIT(mi, lps); lp = &lps[MI_SCREEN(mi)]; lp->glx_context = init_GL(mi); @@ -260,7 +256,6 @@ ENTRYPOINT void init_blocktube (ModeInfo *mi) glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); if (!do_texture && !wire) { @@ -292,34 +287,48 @@ ENTRYPOINT void init_blocktube (ModeInfo *mi) glFlush(); } -ENTRYPOINT void release_blocktube (ModeInfo *mi) +ENTRYPOINT void free_blocktube (ModeInfo *mi) { - if (lps) { - int screen; - for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { - blocktube_configuration *lp = &lps[screen]; + blocktube_configuration *lp = &lps[MI_SCREEN(mi)]; # if defined ( I_HAVE_XPM ) - if (lp->envTexture) - glDeleteTextures(1, &lp->envTexture); - if (lp->texti) - XDestroyImage(lp->texti); -# endif - } - free (lps); - lps = 0; + if (lp->glx_context) { + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context)); + + if (lp->envTexture) + glDeleteTextures(1, &lp->envTexture); + if (lp->texti) + XDestroyImage(lp->texti); } - FreeAllGL(mi); +# endif } ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height) { + blocktube_configuration *lp = &lps[MI_SCREEN(mi)]; GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; + + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context)); + + if (width > height * 5) { /* tiny window: show middle */ + height = width; + y = -height/2; + h = height / (GLfloat) width; + } - glViewport(0, 0, (GLint) width, (GLint) height); + glViewport(0, y, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, 1/h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); + +# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */ + { + int o = (int) current_device_rotation(); + if (o != 0 && o != 180 && o != -180) + glScalef (1/h, 1/h, 1/h); + } +# endif } static int cube_vertices(float x, float y, float z, int wire)