X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fqueens.c;h=b0df56686e401e34f816f0d09e77511b27152c81;hb=f8cf5ac7b2f53510f80a0eaf286a25298be17bfe;hp=7b55ac273a17a70e1c0eab4e06e04fcf7859df25;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/glx/queens.c b/hacks/glx/queens.c index 7b55ac27..b0df5668 100644 --- a/hacks/glx/queens.c +++ b/hacks/glx/queens.c @@ -29,9 +29,22 @@ # include "xlock.h" #endif +#ifdef HAVE_COCOA +# include "jwxyz.h" +#else +# include +# include +# include +#endif + +#ifdef HAVE_JWZGLES +# include "jwzgles.h" +#endif /* HAVE_JWZGLES */ + #ifdef USE_GL #include "gltrackball.h" +#include "chessmodels.h" #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -62,7 +75,6 @@ ModStruct queens_description = #endif #define NONE 0 -#define QUEEN 1 #define MINBOARD 5 #define MAXBOARD 10 #define COLORSETS 5 @@ -73,10 +85,12 @@ typedef struct { trackball_state *trackball; Bool button_down_p; GLfloat position[4]; + int queen_list; int board[MAXBOARD][MAXBOARD]; int steps, colorset, BOARDSIZE; double theta; + int queen_polys; } Queenscreen; @@ -114,7 +128,9 @@ queens_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 (qs->trackball, event->xbutton.button, 5, !event->xbutton.state); @@ -242,15 +258,17 @@ static GLfloat findAlpha(Queenscreen *qs) } /* draw pieces */ -static void drawPieces(Queenscreen *qs) +static int drawPieces(Queenscreen *qs) { int i, j; + int polys = 0; for(i = 0; i < qs->BOARDSIZE; ++i) { for(j = 0; j < qs->BOARDSIZE; ++j) { if(qs->board[i][j]) { glColor3fv(colors[qs->colorset][i%2]); - glCallList(QUEEN); + glCallList(qs->queen_list); + polys += qs->queen_polys; } glTranslatef(1.0, 0.0, 0.0); @@ -258,12 +276,14 @@ static void drawPieces(Queenscreen *qs) glTranslatef(-1.0*qs->BOARDSIZE, 0.0, 1.0); } + return polys; } /** reflectionboard */ -static void draw_reflections(Queenscreen *qs) +static int draw_reflections(Queenscreen *qs) { int i, j; + int polys = 0; glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 1); @@ -281,6 +301,7 @@ static void draw_reflections(Queenscreen *qs) glVertex3f(i + 1.0, 0.0, j + 1.0); glVertex3f(i + 1.0, 0.0, j); glVertex3f(i, 0.0, j); + polys++; } } glEnd(); @@ -294,7 +315,7 @@ static void draw_reflections(Queenscreen *qs) glScalef(1.0, -1.0, 1.0); glTranslatef(0.5, 0.001, 0.5); glLightfv(GL_LIGHT0, GL_POSITION, qs->position); - drawPieces(qs); + polys += drawPieces(qs); glPopMatrix(); glDisable(GL_STENCIL_TEST); @@ -304,12 +325,14 @@ static void draw_reflections(Queenscreen *qs) glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glColorMask(1,1,1,1); + return polys; } /* draw board */ -static void drawBoard(Queenscreen *qs) +static int drawBoard(Queenscreen *qs) { int i, j; + int polys = 0; glBegin(GL_QUADS); @@ -325,18 +348,23 @@ static void drawBoard(Queenscreen *qs) glVertex3f(i + 1.0, 0.0, j + 1.0); glVertex3f(i + 1.0, 0.0, j); glVertex3f(i, 0.0, j); + polys++; } glEnd(); + return polys; } -static void display(Queenscreen *qs) +static int display(Queenscreen *qs) { + int polys = 0; glClear(clearbits); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + glRotatef(current_device_rotation(), 0, 0, 1); + /* setup light attenuation */ glEnable(GL_COLOR_MATERIAL); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.8/(0.01+findAlpha(qs))); @@ -345,7 +373,9 @@ static void display(Queenscreen *qs) /** setup perspective */ glTranslatef(0.0, 0.0, -1.5*qs->BOARDSIZE); glRotatef(30.0, 1.0, 0.0, 0.0); + glRotatef(-current_device_rotation(), 0, 0, 1); gltrackball_rotate (qs->trackball); + glRotatef(current_device_rotation(), 0, 0, 1); glRotatef(qs->theta*100, 0.0, 1.0, 0.0); glTranslatef(-0.5*qs->BOARDSIZE, 0.0, -0.5*qs->BOARDSIZE); @@ -362,17 +392,17 @@ static void display(Queenscreen *qs) /* draw reflections */ if(!wire) { - draw_reflections(qs); + polys += draw_reflections(qs); glEnable(GL_BLEND); } - drawBoard(qs); + polys += drawBoard(qs); if(!wire) glDisable(GL_BLEND); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1); glTranslatef(0.5, 0.0, 0.5); - drawPieces(qs); + polys += drawPieces(qs); /* rotate camera */ if(!qs->button_down_p) @@ -386,6 +416,7 @@ static void display(Queenscreen *qs) qs->colorset = (qs->colorset+1)%COLORSETS; go(qs); } + return polys; } static const GLfloat spidermodel[][3] = @@ -410,22 +441,31 @@ static const GLfloat spidermodel[][3] = #define EPSILON 0.001 +#if 0 /** draws cylindermodel */ -static void draw_model(int chunks, const GLfloat model[][3], int r) +static int draw_model(int chunks, const GLfloat model[][3], int r) { int i = 0; - GLUquadricObj *quadric = gluNewQuadric(); + int polys = 0; glPushMatrix(); glRotatef(-90.0, 1.0, 0.0, 0.0); for(i = 0; i < chunks; ++i) { - if(model[i][0] > EPSILON || model[i][1] > EPSILON) - gluCylinder(quadric, model[i][0], model[i][1], model[i][2], r, 1); + if(model[i][0] > EPSILON || model[i][1] > EPSILON) { + polys += tube (0, 0, 0, + 0, 0, model[i][1], + model[i][0], 0, + r, False, False, False); +/* gluCylinder(quadric, model[i][0], model[i][1], model[i][2], r, 1); + polys += r;*/ + } glTranslatef(0.0, 0.0, model[i][2]); } glPopMatrix(); + return polys; } +#endif ENTRYPOINT void reshape_queens(ModeInfo *mi, int width, int height) { @@ -441,6 +481,7 @@ ENTRYPOINT void init_queens(ModeInfo *mi) { int screen = MI_SCREEN(mi); Queenscreen *qs; + int poly_counts[PIECES]; wire = MI_IS_WIREFRAME(mi); if(!qss && @@ -449,19 +490,34 @@ ENTRYPOINT void init_queens(ModeInfo *mi) qs = &qss[screen]; qs->window = MI_WINDOW(mi); - qs->trackball = gltrackball_init (); - - qs->BOARDSIZE = 8; /* 8 cuz its classic */ if((qs->glx_context = init_GL(mi))) reshape_queens(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); else MI_CLEARWINDOW(mi); - glClearColor(0.0, 0.0, 0.0, 0.0); - glNewList(QUEEN, GL_COMPILE); - draw_model(countof(spidermodel), spidermodel, 24); - glEndList(); + qs->trackball = gltrackball_init (); + + qs->BOARDSIZE = 8; /* 8 cuz its classic */ + + gen_model_lists(-1, poly_counts); + qs->queen_list = QUEEN; + qs->queen_polys = poly_counts[QUEEN]; + + /* find a solution */ + go(qs); +} + +ENTRYPOINT void draw_queens(ModeInfo *mi) +{ + Queenscreen *qs = &qss[MI_SCREEN(mi)]; + Window w = MI_WINDOW(mi); + Display *disp = MI_DISPLAY(mi); + + if(!qs->glx_context) + return; + + glXMakeCurrent(disp, w, *(qs->glx_context)); if(flat) glShadeModel(GL_FLAT); @@ -482,22 +538,8 @@ ENTRYPOINT void init_queens(ModeInfo *mi) else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - /* find a solution */ - go(qs); -} - -ENTRYPOINT void draw_queens(ModeInfo *mi) -{ - Queenscreen *qs = &qss[MI_SCREEN(mi)]; - Window w = MI_WINDOW(mi); - Display *disp = MI_DISPLAY(mi); - - if(!qs->glx_context) - return; - - glXMakeCurrent(disp, w, *(qs->glx_context)); - - display(qs); + mi->polygon_count = display(qs); + mi->recursion_depth = qs->BOARDSIZE; if(mi->fps_p) do_fps(mi); glFinish();