X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fjigglypuff.c;h=63b832947e63328a2143ff1ddf4857de0f2602f7;hb=6f5482d73adb0165c0130bb47d852644ab0c4869;hp=8191342d70922ce6e0ea0caa002088a88c482270;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/glx/jigglypuff.c b/hacks/glx/jigglypuff.c index 8191342d..63b83294 100644 --- a/hacks/glx/jigglypuff.c +++ b/hacks/glx/jigglypuff.c @@ -66,6 +66,9 @@ #define DEF_HOLD "800" #define DEF_SPHERISM "75" #define DEF_DAMPING "500" +#define DEF_RANDOM "True" +#define DEF_TETRA "False" +#define DEF_SPOOKY "0" #ifndef max #define max(a,b) (((a)>(b))?(a):(b)) @@ -137,9 +140,9 @@ static XrmOptionDescRec opts[] = { }; static argtype vars[] = { - {&random_parms, "random", "Random", "True", t_Bool}, - {&do_tetrahedron, "tetra", "Tetra", "False", t_Bool}, - {&spooky, "spooky", "Spooky", "0", t_Int}, + {&random_parms, "random", "Random", DEF_RANDOM, t_Bool}, + {&do_tetrahedron, "tetra", "Tetra", DEF_TETRA, t_Bool}, + {&spooky, "spooky", "Spooky", DEF_SPOOKY, t_Int}, {&color, "color", "Color", DEF_COLOR, t_String}, {&shininess, "shininess", "Shininess", DEF_SHININESS, t_Int}, {&complexity, "complexity", "Complexity", DEF_COMPLEXITY, t_Int}, @@ -431,11 +434,10 @@ static vertex *vertex_split(hedge *h, vector v) hedge *h2, *hn1, *hn2; vertex *vtxn; edge *en; - face *f1, *f2; + face *f1; f1 = h->f; h2 = partner(h); - f2 = h2->f; vtxn = vertex_new(f1->s, v); hn1 = hedge_new(h, vtxn); @@ -670,9 +672,10 @@ static inline void vertex_render(vertex *vtx, jigglystruct *js) * see what the cost is of calling glBegin/glEnd for each * triangle. */ -static inline void face_render(face *f, jigglystruct *js) +static inline int face_render(face *f, jigglystruct *js) { hedge *h1, *h2, *hend; + int polys = 0; h1 = f->start; hend = h1->prev; @@ -688,12 +691,15 @@ static inline void face_render(face *f, jigglystruct *js) vertex_render(hend->vtx, js); h1 = h2; h2 = h1->next; + polys++; } glEnd(); + return polys; } -static void jigglypuff_render(jigglystruct *js) +static int jigglypuff_render(jigglystruct *js) { + int polys = 0; face *f = js->shape->faces; vertex *vtx = js->shape->vertices; @@ -702,9 +708,10 @@ static void jigglypuff_render(jigglystruct *js) vtx = vtx->next; } while(f) { - face_render(f, js); + polys += face_render(f, js); f=f->next; } + return polys; } /* This is the jiggling code */ @@ -777,7 +784,6 @@ static void setup_opengl(ModeInfo *mi, jigglystruct *js) const GLfloat scolor[4]= {0.9f, 0.9f, 0.9f, 0.5f}; glDrawBuffer(GL_BACK); - glClearColor(0, 0, 0, 0); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); @@ -832,10 +838,12 @@ static int parse_color(jigglystruct *js) js->color_style = COLOR_STYLE_FLOWERBOX; return 1; } +# ifndef HAVE_JWZGLES /* SPHERE_MAP unimplemented */ else if(!strcmp(color, "chrome")) { js->color_style = COLOR_STYLE_CHROME; return 1; } +# endif else if(!strcmp(color, "cycle")) { js->color_style = COLOR_STYLE_CYCLE; js->jiggly_color[0] = ((float)random()) / REAL_RAND_MAX * 0.7 + 0.3; @@ -864,8 +872,14 @@ static int parse_color(jigglystruct *js) static void randomize_parameters(jigglystruct *js) { do_tetrahedron = random() & 1; +# ifndef HAVE_JWZGLES js->do_wireframe = !(random() & 3); +# endif js->color_style = random() % 5; +# ifdef HAVE_JWZGLES /* SPHERE_MAP unimplemented */ + while (js->color_style == COLOR_STYLE_CHROME) + js->color_style = random() % 5;; +# endif if(js->color_style == COLOR_STYLE_NORMAL || js->color_style == COLOR_STYLE_CYCLE) { js->jiggly_color[0] = ((float)random()) / REAL_RAND_MAX * 0.5 + 0.5; @@ -927,7 +941,9 @@ ENTRYPOINT Bool jigglypuff_handle_event(ModeInfo *mi, XEvent *event) } else if (event->xany.type == ButtonPress && (event->xbutton.button == Button4 || - event->xbutton.button == Button5)) + event->xbutton.button == Button5 || + event->xbutton.button == Button6 || + event->xbutton.button == Button7)) { gltrackball_mousewheel (js->trackball, event->xbutton.button, 10, !!event->xbutton.state); @@ -974,7 +990,11 @@ ENTRYPOINT void draw_jigglypuff(ModeInfo *mi) js->axis -= 2*M_PI; } } + + /* Do it twice because we don't track the device's orientation. */ + glRotatef( current_device_rotation(), 0, 0, 1); gltrackball_rotate(js->trackball); + glRotatef(-current_device_rotation(), 0, 0, 1); if(js->color_style == COLOR_STYLE_CYCLE) { int i; @@ -989,7 +1009,7 @@ ENTRYPOINT void draw_jigglypuff(ModeInfo *mi) glColor4fv(js->jiggly_color); } - jigglypuff_render(js); + mi->polygon_count = jigglypuff_render(js); if(MI_IS_FPS(mi)) do_fps(mi); glFinish(); @@ -1014,6 +1034,9 @@ ENTRYPOINT void init_jigglypuff(ModeInfo *mi) js = &jss[MI_SCREEN(mi)]; js->do_wireframe = MI_IS_WIREFRAME(mi); +# ifdef HAVE_JWZGLES + js->do_wireframe = 0; /* GL_LINE unimplemented */ +# endif js->shininess = shininess; @@ -1059,7 +1082,7 @@ ENTRYPOINT void init_jigglypuff(ModeInfo *mi) js->do_wireframe, js->spooky, js->color_style, js->shininess);*/ } -XSCREENSAVER_MODULE ("Jigglypuff", jigglypuff) +XSCREENSAVER_MODULE ("JigglyPuff", jigglypuff) #endif /* USE_GL */