X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fsierpinski3d.c;h=3b80fc2b498d499a453498d55928832d19933584;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hp=d3df8cdf1bf583b077072cbc05ecfc1564a76b68;hpb=96a411663168b0ba5432b407a83be55f3df0c802;p=xscreensaver diff --git a/hacks/glx/sierpinski3d.c b/hacks/glx/sierpinski3d.c index d3df8cdf..3b80fc2b 100644 --- a/hacks/glx/sierpinski3d.c +++ b/hacks/glx/sierpinski3d.c @@ -26,36 +26,14 @@ static const char sccsid[] = "@(#)sierpinski3D.c 00.01 99/11/04 xlockmore"; * random scattering of points. */ -/*- - * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock. - * otherwise caddr_t is not defined correctly - */ - -#include - #ifdef STANDALONE -# define PROGCLASS "Sierpinski3D" -# define HACK_INIT init_gasket -# define HACK_DRAW draw_gasket -# define HACK_RESHAPE reshape_gasket -# define HACK_HANDLE_EVENT gasket_handle_event -# define EVENT_MASK PointerMotionMask -# define gasket_opts xlockmore_opts - - -#define DEF_SPIN "True" -#define DEF_WANDER "True" -#define DEF_SPEED "150" -#define DEF_MAXDEPTH "5" - # define DEFAULTS "*delay: 20000 \n" \ "*showFPS: False \n" \ "*wireframe: False \n" \ - "*maxDepth: " DEF_MAXDEPTH "\n" \ - "*speed: " DEF_SPEED "\n" \ - "*spin: " DEF_SPIN "\n" \ - "*wander: " DEF_WANDER "\n" \ + "*suppressRotationAnimation: True\n" \ +# define refresh_gasket 0 +# define release_gasket 0 # include "xlockmore.h" /* from the xscreensaver distribution */ #else /* !STANDALONE */ # include "xlock.h" /* from the xlockmore distribution */ @@ -63,7 +41,11 @@ static const char sccsid[] = "@(#)sierpinski3D.c 00.01 99/11/04 xlockmore"; #ifdef USE_GL -#include +#define DEF_SPIN "True" +#define DEF_WANDER "True" +#define DEF_SPEED "150" +#define DEF_MAX_DEPTH "5" + #include "rotator.h" #include "gltrackball.h" @@ -76,8 +58,8 @@ static Bool do_spin; static Bool do_wander; static XrmOptionDescRec opts[] = { - {"-depth", ".sierpinski3d.maxDepth", XrmoptionSepArg, (caddr_t) 0 }, - {"-speed", ".sierpinski3d.speed", XrmoptionSepArg, (caddr_t) 0 }, + {"-depth", ".sierpinski3d.maxDepth", XrmoptionSepArg, 0 }, + {"-speed", ".sierpinski3d.speed", XrmoptionSepArg, 0 }, { "-spin", ".spin", XrmoptionNoArg, "True" }, { "+spin", ".spin", XrmoptionNoArg, "False" }, { "-wander", ".wander", XrmoptionNoArg, "True" }, @@ -85,29 +67,27 @@ static XrmOptionDescRec opts[] = { }; static argtype vars[] = { - {(caddr_t *) &do_spin, "spin", "Spin", DEF_SPIN, t_Bool}, - {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool}, - {(caddr_t *) &speed, "speed", "Speed", DEF_SPEED, t_Int}, - {(caddr_t *) &max_depth, "maxDepth", "MaxDepth", DEF_MAXDEPTH, t_Int}, + {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool}, + {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool}, + {&speed, "speed", "Speed", DEF_SPEED, t_Int}, + {&max_depth, "maxDepth", "MaxDepth", DEF_MAX_DEPTH, t_Int}, }; -ModeSpecOpt gasket_opts = {countof(opts), opts, countof(vars), vars, NULL}; +ENTRYPOINT ModeSpecOpt gasket_opts = {countof(opts), opts, countof(vars), vars, NULL}; #ifdef USE_MODULES ModStruct gasket_description = -{"gasket", "init_gasket", "draw_gasket", "release_gasket", +{"gasket", "init_gasket", "draw_gasket", NULL, "draw_gasket", "init_gasket", NULL, &gasket_opts, 1000, 1, 2, 1, 4, 1.0, "", "Shows GL's Sierpinski gasket", 0, NULL}; #endif -typedef struct{ - GLfloat x; - GLfloat y; - GLfloat z; -} GL_VECTOR; +typedef struct { + double x,y,z; +} XYZ; typedef struct { GLuint gasket0, gasket1, gasket2, gasket3; @@ -126,13 +106,12 @@ typedef struct { int ccolor2; int ccolor3; + int tick; + } gasketstruct; static gasketstruct *gasket = NULL; -static GLfloat normals[4][3]; - - static void triangle (GLfloat x1, GLfloat y1, GLfloat z1, @@ -151,7 +130,9 @@ triangle (GLfloat x1, GLfloat y1, GLfloat z1, } static void -four_tetras (GL_VECTOR *outer, Bool wireframe_p, int countdown, int which, +four_tetras (gasketstruct *gp, + XYZ *outer, XYZ *normals, + Bool wireframe_p, int countdown, int which, int *countP) { if (countdown <= 0) @@ -159,7 +140,7 @@ four_tetras (GL_VECTOR *outer, Bool wireframe_p, int countdown, int which, (*countP)++; if (which == 0) { - glNormal3f (normals[0][0], normals[0][1], normals[0][2]); + glNormal3f (normals[0].x, normals[0].y, normals[0].z); triangle (outer[0].x, outer[0].y, outer[0].z, outer[1].x, outer[1].y, outer[1].z, outer[2].x, outer[2].y, outer[2].z, @@ -167,7 +148,7 @@ four_tetras (GL_VECTOR *outer, Bool wireframe_p, int countdown, int which, } else if (which == 1) { - glNormal3f (normals[1][0], normals[1][1], normals[1][2]); + glNormal3f (normals[1].x, normals[1].y, normals[1].z); triangle (outer[0].x, outer[0].y, outer[0].z, outer[3].x, outer[3].y, outer[3].z, outer[1].x, outer[1].y, outer[1].z, @@ -175,7 +156,7 @@ four_tetras (GL_VECTOR *outer, Bool wireframe_p, int countdown, int which, } else if (which == 2) { - glNormal3f (normals[2][0], normals[2][1], normals[2][2]); + glNormal3f (normals[2].x, normals[2].y, normals[2].z); triangle (outer[0].x, outer[0].y, outer[0].z, outer[2].x, outer[2].y, outer[2].z, outer[3].x, outer[3].y, outer[3].z, @@ -183,7 +164,7 @@ four_tetras (GL_VECTOR *outer, Bool wireframe_p, int countdown, int which, } else { - glNormal3f (normals[3][0], normals[3][1], normals[3][2]); + glNormal3f (normals[3].x, normals[3].y, normals[3].z); triangle (outer[1].x, outer[1].y, outer[1].z, outer[3].x, outer[3].y, outer[3].z, outer[2].x, outer[2].y, outer[2].z, @@ -198,8 +179,8 @@ four_tetras (GL_VECTOR *outer, Bool wireframe_p, int countdown, int which, # define M12 3 # define M13 4 # define M23 5 - GL_VECTOR inner[M23+1]; - GL_VECTOR corner[4]; + XYZ inner[M23+1]; + XYZ corner[4]; inner[M01].x = (outer[0].x + outer[1].x) / 2.0; inner[M01].y = (outer[0].y + outer[1].y) / 2.0; @@ -231,25 +212,25 @@ four_tetras (GL_VECTOR *outer, Bool wireframe_p, int countdown, int which, corner[1] = inner[M01]; corner[2] = inner[M02]; corner[3] = inner[M03]; - four_tetras (corner, wireframe_p, countdown, which, countP); + four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP); corner[0] = inner[M01]; corner[1] = outer[1]; corner[2] = inner[M12]; corner[3] = inner[M13]; - four_tetras (corner, wireframe_p, countdown, which, countP); + four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP); corner[0] = inner[M02]; corner[1] = inner[M12]; corner[2] = outer[2]; corner[3] = inner[M23]; - four_tetras (corner, wireframe_p, countdown, which, countP); + four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP); corner[0] = inner[M03]; corner[1] = inner[M13]; corner[2] = inner[M23]; corner[3] = outer[3]; - four_tetras (corner, wireframe_p, countdown, which, countP); + four_tetras (gp, corner, normals, wireframe_p, countdown, which, countP); } } @@ -259,55 +240,27 @@ compile_gasket(ModeInfo *mi, int which) { Bool wireframe_p = MI_IS_WIREFRAME(mi); gasketstruct *gp = &gasket[MI_SCREEN(mi)]; - int count; - - GL_VECTOR vertex[5]; - - normals[0][0] = 0; - normals[0][1] = 0; - normals[0][2] = -sqrt(2.0 / 3.0); - - normals[1][0] = 0; - normals[1][1] = -sqrt(0.75); - normals[1][2] = sqrt(2.0 / 3.0) / 3.0; - - normals[2][0] = sqrt (0.5); - normals[2][1] = sqrt(0.75) / 2.0; - normals[2][2] = normals[1][2]; - - normals[3][0] = -normals[2][0]; - normals[3][1] = normals[2][1]; - normals[3][2] = normals[1][2]; - - - /* define verticies */ - vertex[0].x = 0.5; - vertex[0].y = -(1.0/3.0)*sqrt((2.0/3.0)); - vertex[0].z = -sqrt(3.0)/6.0; - - vertex[1].x = -0.5; - vertex[1].y = -(1.0/3.0)*sqrt((2.0/3.0)); - vertex[1].z = -sqrt(3.0)/6.0; - - vertex[2].x = 0.0; - vertex[2].y = (2.0/3.0)*sqrt((2.0/3.0)); - vertex[2].z = -sqrt(3.0)/6.0; - - vertex[3].x = 0.0; - vertex[3].y = 0.0; - vertex[3].z = sqrt(3.0)/3.0; - - vertex[4].x = 0.0; - vertex[4].y = 0.0; - vertex[4].z = 0.0; - - count = 0; - four_tetras (vertex, wireframe_p, + int count = 0; + XYZ vertex[5]; + XYZ normal[4]; + + vertex[0].x = -1; vertex[0].y = -1; vertex[0].z = -1; + vertex[1].x = 1; vertex[1].y = 1; vertex[1].z = -1; + vertex[2].x = 1; vertex[2].y = -1; vertex[2].z = 1; + vertex[3].x = -1; vertex[3].y = 1; vertex[3].z = 1; + vertex[4].x = 0; vertex[4].y = 0; vertex[4].z = 0; /* center */ + + normal[0].x = 1; normal[0].y = -1; normal[0].z = -1; + normal[1].x = -1; normal[1].y = 1; normal[1].z = -1; + normal[2].x = -1; normal[2].y = -1; normal[2].z = 1; + normal[3].x = 1; normal[3].y = 1; normal[3].z = 1; + + four_tetras (gp, vertex, normal, wireframe_p, (gp->current_depth < 0 ? -gp->current_depth : gp->current_depth), which, &count); - mi->polygon_count = count; + mi->polygon_count += count; } static void @@ -315,14 +268,14 @@ draw(ModeInfo *mi) { Bool wireframe_p = MI_IS_WIREFRAME(mi); gasketstruct *gp = &gasket[MI_SCREEN(mi)]; - static int tick = 999999; - static GLfloat pos[4] = {-4.0, 3.0, 10.0, 1.0}; - static float white[] = {1.0, 1.0, 1.0, 1.0}; - static float color0[] = {0.0, 0.0, 0.0, 1.0}; - static float color1[] = {0.0, 0.0, 0.0, 1.0}; - static float color2[] = {0.0, 0.0, 0.0, 1.0}; - static float color3[] = {0.0, 0.0, 0.0, 1.0}; + static const GLfloat pos[] = {-4.0, 3.0, 10.0, 1.0}; + static const GLfloat white[] = {1.0, 1.0, 1.0, 1.0}; + + GLfloat color0[] = {0.0, 0.0, 0.0, 1.0}; + GLfloat color1[] = {0.0, 0.0, 0.0, 1.0}; + GLfloat color2[] = {0.0, 0.0, 0.0, 1.0}; + GLfloat color3[] = {0.0, 0.0, 0.0, 1.0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -384,7 +337,7 @@ draw(ModeInfo *mi) glRotatef (z * 360, 0.0, 0.0, 1.0); } - glScalef( 8.0, 8.0, 8.0 ); + glScalef (4, 4, 4); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color0); glCallList(gp->gasket0); @@ -398,9 +351,9 @@ draw(ModeInfo *mi) glPopMatrix(); - if (tick++ >= speed) + if (gp->tick++ >= speed) { - tick = 0; + gp->tick = 0; if (gp->current_depth >= max_depth) gp->current_depth = -max_depth; gp->current_depth++; @@ -421,12 +374,15 @@ draw(ModeInfo *mi) glNewList (gp->gasket2, GL_COMPILE); compile_gasket (mi, 2); glEndList(); glNewList (gp->gasket3, GL_COMPILE); compile_gasket (mi, 3); glEndList(); + mi->recursion_depth = (gp->current_depth > 0 + ? gp->current_depth + : -gp->current_depth); } } /* new window size or exposure */ -void +ENTRYPOINT void reshape_gasket(ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; @@ -442,6 +398,14 @@ reshape_gasket(ModeInfo *mi, int width, int height) 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); +# 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 + glClear(GL_COLOR_BUFFER_BIT); } @@ -459,32 +423,43 @@ pinit(ModeInfo *mi) } -Bool +ENTRYPOINT Bool gasket_handle_event (ModeInfo *mi, XEvent *event) { gasketstruct *gp = &gasket[MI_SCREEN(mi)]; - if (event->xany.type == ButtonPress && - event->xbutton.button & Button1) + if (gltrackball_event_handler (event, gp->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &gp->button_down_p)) + return True; + else if (event->xany.type == KeyPress) { - gp->button_down_p = True; - gltrackball_start (gp->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) - { - gp->button_down_p = False; - return True; + KeySym keysym; + char c = 0; + XLookupString (&event->xkey, &c, 1, &keysym, 0); + if (c == '+' || c == '=' || + keysym == XK_Up || keysym == XK_Right || keysym == XK_Next) + { + gp->tick = speed; + gp->current_depth += (gp->current_depth > 0 ? 1 : -1); + gp->current_depth--; + return True; + } + else if (c == '-' || c == '_' || + keysym == XK_Down || keysym == XK_Left || keysym == XK_Prior) + { + gp->tick = speed; + gp->current_depth -= (gp->current_depth > 0 ? 1 : -1); + gp->current_depth--; + return True; + } + else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event)) + goto DEF; } - else if (event->xany.type == MotionNotify && - gp->button_down_p) + else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event)) { - gltrackball_track (gp->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); + DEF: + gp->tick = speed; return True; } @@ -492,18 +467,16 @@ gasket_handle_event (ModeInfo *mi, XEvent *event) } -void +static void free_gasket(ModeInfo * mi); + + +ENTRYPOINT void init_gasket(ModeInfo *mi) { int screen = MI_SCREEN(mi); gasketstruct *gp; - if (gasket == NULL) - { - if ((gasket = (gasketstruct *) calloc(MI_NUM_SCREENS(mi), - sizeof (gasketstruct))) == NULL) - return; - } + MI_INIT (mi, gasket, free_gasket); gp = &gasket[screen]; gp->window = MI_WINDOW(mi); @@ -517,7 +490,7 @@ init_gasket(ModeInfo *mi) 1.0, do_wander ? wander_speed : 0, True); - gp->trackball = gltrackball_init (); + gp->trackball = gltrackball_init (True); } gp->ncolors = 255; @@ -529,6 +502,7 @@ init_gasket(ModeInfo *mi) gp->ccolor1 = gp->ncolors * 0.25; gp->ccolor2 = gp->ncolors * 0.5; gp->ccolor3 = gp->ncolors * 0.75; + gp->tick = 999999; if ((gp->glx_context = init_GL(mi)) != NULL) { @@ -541,7 +515,7 @@ init_gasket(ModeInfo *mi) } } -void +ENTRYPOINT void draw_gasket(ModeInfo * mi) { gasketstruct *gp = &gasket[MI_SCREEN(mi)]; @@ -552,6 +526,24 @@ draw_gasket(ModeInfo * mi) glDrawBuffer(GL_BACK); + /* 0 = 4 polygons + 1 = 16 polygons + 2 = 64 polygons + 3 = 256 polygons + 4 = 1,024 polygons + 5 = 4,096 polygons + 6 = 16,384 polygons + 7 = 65,536 polygons, 30 fps (3GHz Core 2 Duo, GeForce 8800 GS) + 8 = 262,144 polygons, 12 fps + 9 = 1,048,576 polygons, 4 fps + 10 = 4,194,304 polygons, 1 fps + 11 = 16,777,216 polygons, 0.3 fps + 12 = 67,108,864 polygons, OOM! + 13 = 268,435,456 polygons + 14 = 1,073,741,824 polygons, 31 bits + 15 = 4,294,967,296 polygons, 33 bits + 16 = 17,179,869,184 polygons, 35 bits + */ if (max_depth > 10) max_depth = 10; @@ -562,34 +554,24 @@ draw_gasket(ModeInfo * mi) glXSwapBuffers(display, window); } -void -release_gasket(ModeInfo * mi) +ENTRYPOINT void +free_gasket(ModeInfo * mi) { - if (gasket != NULL) - { - int screen; - - for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) - { - gasketstruct *gp = &gasket[screen]; + gasketstruct *gp = &gasket[MI_SCREEN(mi)]; - if (gp->glx_context) - { + if (gp->glx_context) + { /* Display lists MUST be freed while their glXContext is current. */ - glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context)); + glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context)); - if (glIsList(gp->gasket0)) glDeleteLists(gp->gasket0, 1); - if (glIsList(gp->gasket1)) glDeleteLists(gp->gasket1, 1); - if (glIsList(gp->gasket2)) glDeleteLists(gp->gasket2, 1); - if (glIsList(gp->gasket3)) glDeleteLists(gp->gasket3, 1); - } - } - (void) free((void *) gasket); - gasket = NULL; + if (glIsList(gp->gasket0)) glDeleteLists(gp->gasket0, 1); + if (glIsList(gp->gasket1)) glDeleteLists(gp->gasket1, 1); + if (glIsList(gp->gasket2)) glDeleteLists(gp->gasket2, 1); + if (glIsList(gp->gasket3)) glDeleteLists(gp->gasket3, 1); } - FreeAllGL(mi); } +XSCREENSAVER_MODULE_2 ("Sierpinski3D", sierpinski3d, gasket) /*********************************************************/