X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fglx%2Fqueens.c;h=3c671aff04b5edf087d523e97e8a471aba9082df;hp=42ac6e2c66eb44faf96558a4e4027265ebc37542;hb=6b1c86cf395f59389e4ece4ea8f4bea2c332745b;hpb=13dbc569cdc6e29019722c0ef9b932a925efbcad diff --git a/hacks/glx/queens.c b/hacks/glx/queens.c index 42ac6e2c..3c671aff 100644 --- a/hacks/glx/queens.c +++ b/hacks/glx/queens.c @@ -6,7 +6,7 @@ * * version 1.0 - May 10, 2002 * - * Copyright (C) 2002 Blair Tennessy (tennessb@unbc.ca) + * Copyright (C) 2002 Blair Tennessy (tennessy@cs.ubc.ca) * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -17,21 +17,12 @@ * implied warranty. */ -#include - #ifdef STANDALONE -# define PROGCLASS "Queens" -# define HACK_INIT init_queens -# define HACK_DRAW draw_queens -# define HACK_RESHAPE reshape_queens -# define HACK_HANDLE_EVENT queens_handle_event -# define EVENT_MASK PointerMotionMask -# define queens_opts xlockmore_opts - -#define DEFAULTS "*delay: 20000 \n" \ - "*showFPS: False \n" \ - "*wireframe: False \n" \ +#define DEFAULTS "*delay: 20000 \n" \ + "*showFPS: False \n" \ + "*wireframe: False \n" \ +# define refresh_queens 0 # include "xlockmore.h" #else @@ -40,24 +31,26 @@ #ifdef USE_GL -#include #include "gltrackball.h" #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) static XrmOptionDescRec opts[] = { - {"+rotate", ".queens.rotate", XrmoptionNoArg, (caddr_t) "false" }, - {"-rotate", ".queens.rotate", XrmoptionNoArg, (caddr_t) "true" }, + {"+rotate", ".queens.rotate", XrmoptionNoArg, "false" }, + {"-rotate", ".queens.rotate", XrmoptionNoArg, "true" }, + {"+flat", ".queens.flat", XrmoptionNoArg, "false" }, + {"-flat", ".queens.flat", XrmoptionNoArg, "true" }, }; -int rotate; +static int rotate, wire, clearbits, flat; static argtype vars[] = { - {(caddr_t *) &rotate, "rotate", "Rotate", "True", t_Bool}, + {&rotate, "rotate", "Rotate", "True", t_Bool}, + {&flat, "flat", "Flat", "False", t_Bool}, }; -ModeSpecOpt queens_opts = {countof(opts), opts, countof(vars), vars, NULL}; +ENTRYPOINT ModeSpecOpt queens_opts = {countof(opts), opts, countof(vars), vars, NULL}; #ifdef USE_MODULES ModStruct queens_description = @@ -68,60 +61,71 @@ ModStruct queens_description = #endif +#define NONE 0 +#define QUEEN 1 +#define MINBOARD 5 +#define MAXBOARD 10 +#define COLORSETS 5 + typedef struct { GLXContext *glx_context; Window window; trackball_state *trackball; Bool button_down_p; -} Queenscreen; + GLfloat position[4]; -static Queenscreen *qs = NULL; + int board[MAXBOARD][MAXBOARD]; + int steps, colorset, BOARDSIZE; + double theta; -#include -#include -#include -#include +} Queenscreen; -#ifndef M_PI -#define M_PI 3.14159265 -#endif - -#define NONE 0 -#define QUEEN 1 -#define MINBOARD 5 -#define MAXBOARD 10 +static Queenscreen *qss = NULL; /* definition of white/black colors */ -GLfloat colors[2][3] = { {0.5, 0.7, 0.9}, - {0.2, 0.3, 0.6} }; - -int board[MAXBOARD][MAXBOARD]; -int work = 0, vb = 0, steps = 0, BOARDSIZE = 8; /* 8 cuz its classic */ - -Bool +static const GLfloat colors[COLORSETS][2][3] = + { + {{0.43, 0.54, 0.76}, {0.8, 0.8, 0.8}}, + {{0.5, 0.7, 0.9}, {0.2, 0.3, 0.6}}, + {{0.53725490196, 0.360784313725, 0.521568627451}, {0.6, 0.6, 0.6}}, + {{0.15, 0.77, 0.54}, {0.5, 0.5, 0.5}}, + {{0.9, 0.45, 0.0}, {0.5, 0.5, 0.5}}, + }; + +ENTRYPOINT Bool queens_handle_event (ModeInfo *mi, XEvent *event) { - Queenscreen *c = &qs[MI_SCREEN(mi)]; + Queenscreen *qs = &qss[MI_SCREEN(mi)]; if (event->xany.type == ButtonPress && - event->xbutton.button & Button1) + event->xbutton.button == Button1) { - c->button_down_p = True; - gltrackball_start (c->trackball, + qs->button_down_p = True; + gltrackball_start (qs->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) + event->xbutton.button == Button1) + { + qs->button_down_p = False; + return True; + } + else if (event->xany.type == ButtonPress && + (event->xbutton.button == Button4 || + event->xbutton.button == Button5 || + event->xbutton.button == Button6 || + event->xbutton.button == Button7)) { - c->button_down_p = False; + gltrackball_mousewheel (qs->trackball, event->xbutton.button, 5, + !event->xbutton.state); return True; } else if (event->xany.type == MotionNotify && - c->button_down_p) + qs->button_down_p) { - gltrackball_track (c->trackball, + gltrackball_track (qs->trackball, event->xmotion.x, event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi)); return True; @@ -133,64 +137,67 @@ queens_handle_event (ModeInfo *mi, XEvent *event) /* returns true if placing a queen on column c causes a conflict */ -int conflictsCols(int c) { +static int conflictsCols(Queenscreen *qs, int c) +{ int i; - for(i = 0; i < BOARDSIZE; ++i) - if(board[i][c]) + for(i = 0; i < qs->BOARDSIZE; ++i) + if(qs->board[i][c]) return 1; return 0; } /* returns true if placing a queen on (r,c) causes a diagonal conflict */ -int conflictsDiag(int r, int c) { +static int conflictsDiag(Queenscreen *qs, int r, int c) +{ int i; /* positive slope */ int n = r < c ? r : c; - for(i = 0; i < BOARDSIZE-abs(r-c); ++i) - if(board[r-n+i][c-n+i]) + for(i = 0; i < qs->BOARDSIZE-abs(r-c); ++i) + if(qs->board[r-n+i][c-n+i]) return 1; /* negative slope */ - n = r < BOARDSIZE - (c+1) ? r : BOARDSIZE - (c+1); - for(i = 0; i < BOARDSIZE-abs(BOARDSIZE - (1+r+c)); ++i) - if(board[r-n+i][c+n-i]) + n = r < qs->BOARDSIZE - (c+1) ? r : qs->BOARDSIZE - (c+1); + for(i = 0; i < qs->BOARDSIZE-abs(qs->BOARDSIZE - (1+r+c)); ++i) + if(qs->board[r-n+i][c+n-i]) return 1; return 0; } /* returns true if placing a queen at (r,c) causes a conflict */ -int conflicts(int r, int c) { - return !conflictsCols(c) ? conflictsDiag(r, c) : 1; +static int conflicts(Queenscreen *qs, int r, int c) +{ + return !conflictsCols(qs, c) ? conflictsDiag(qs, r, c) : 1; } /* clear board */ -void blank(void) { +static void blank(Queenscreen *qs) +{ int i, j; for(i = 0; i < MAXBOARD; ++i) for(j = 0; j < MAXBOARD; ++j) - board[i][j] = NONE; + qs->board[i][j] = NONE; } /* recursively determine solution */ -int findSolution(int row) { - int col = 0; - - if(row == BOARDSIZE) +static int findSolution(Queenscreen *qs, int row, int col) +{ + if(row == qs->BOARDSIZE) return 1; - while(col < BOARDSIZE) { - if(!conflicts(row, col)) { - board[row][col] = QUEEN; + while(col < qs->BOARDSIZE) { + if(!conflicts(qs, row, col)) { + qs->board[row][col] = 1; - if(findSolution(row+1)) - return 1; + if(findSolution(qs, row+1, 0)) + return 1; - board[row][col] = NONE; + qs->board[row][col] = 0; } ++col; @@ -199,217 +206,231 @@ int findSolution(int row) { return 0; } -/* driver for finding solution */ -void go(void) { findSolution(0); } +/** driver for finding solution */ +static void go(Queenscreen *qs) { while(!findSolution(qs, 0, random()%qs->BOARDSIZE)); } + +/* lighting variables */ +static const GLfloat front_shininess[] = {60.0}; +static const GLfloat front_specular[] = {0.4, 0.4, 0.4, 1.0}; +static const GLfloat ambient[] = {0.3, 0.3, 0.3, 1.0}; +static const GLfloat diffuse[] = {0.8, 0.8, 0.8, 1.0}; /* configure lighting */ -void setup_lights(void) { - GLfloat position[] = { 4.0, 8.0, 4.0, 1.0 }; +static void setup_lights(Queenscreen *qs) +{ + /* setup twoside lighting */ + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, qs->position); glEnable(GL_LIGHTING); - glLightfv(GL_LIGHT0, GL_POSITION, position); glEnable(GL_LIGHT0); + + /* setup material properties */ + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } +#define checkImageWidth 8 +#define checkImageHeight 8 +/*static GLubyte checkImage[checkImageWidth][checkImageHeight][3];*/ + /* return alpha value for fading */ -GLfloat findAlpha(void) { - return steps < 128 ? steps/128.0 : steps < 512-128 ? 1.0 : (512-steps)/128.0; +static GLfloat findAlpha(Queenscreen *qs) +{ + return qs->steps < 128 ? qs->steps/128.0 : qs->steps < 1024-128 ?1.0:(1024-qs->steps)/128.0; } /* draw pieces */ -void drawPieces(void) { +static void drawPieces(Queenscreen *qs) +{ int i, j; - for(i = 0; i < BOARDSIZE; ++i) { - for(j = 0; j < BOARDSIZE; ++j) { - if(board[i][j]) { - glColor4f(colors[i%2][0], colors[i%2][1], colors[i%2][2], findAlpha()); + 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); } glTranslatef(1.0, 0.0, 0.0); } - glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0); + glTranslatef(-1.0*qs->BOARDSIZE, 0.0, 1.0); + } +} + +/** reflectionboard */ +static void draw_reflections(Queenscreen *qs) +{ + int i, j; + + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 1, 1); + glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); + glColorMask(0,0,0,0); + glDisable(GL_CULL_FACE); + + glDisable(GL_DEPTH_TEST); + glBegin(GL_QUADS); + + /* only draw white squares */ + for(i = 0; i < qs->BOARDSIZE; ++i) { + for(j = (qs->BOARDSIZE+i) % 2; j < qs->BOARDSIZE; j += 2) { + glVertex3f(i, 0.0, j + 1.0); + glVertex3f(i + 1.0, 0.0, j + 1.0); + glVertex3f(i + 1.0, 0.0, j); + glVertex3f(i, 0.0, j); + } } + glEnd(); + glEnable(GL_DEPTH_TEST); + + glColorMask(1, 1, 1, 1); + glStencilFunc(GL_EQUAL, 1, 1); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + + glPushMatrix(); + glScalef(1.0, -1.0, 1.0); + glTranslatef(0.5, 0.001, 0.5); + glLightfv(GL_LIGHT0, GL_POSITION, qs->position); + drawPieces(qs); + glPopMatrix(); + glDisable(GL_STENCIL_TEST); + + /* replace lights */ + glLightfv(GL_LIGHT0, GL_POSITION, qs->position); + + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glColorMask(1,1,1,1); } /* draw board */ -void drawBoard(int wire) { +static void drawBoard(Queenscreen *qs) +{ int i, j; - if (!wire) glBegin(GL_QUADS); + glBegin(GL_QUADS); - for(i = 0; i < BOARDSIZE; ++i) - for(j = 0; j < BOARDSIZE; ++j) { - int par = (i-j+BOARDSIZE)%2; - glColor4f(colors[par][0], colors[par][1], colors[par][2], findAlpha()); + for(i = 0; i < qs->BOARDSIZE; ++i) + for(j = 0; j < qs->BOARDSIZE; ++j) { + int par = (i-j+qs->BOARDSIZE)%2; + glColor4f(colors[qs->colorset][par][0], + colors[qs->colorset][par][1], + colors[qs->colorset][par][2], + 0.70); glNormal3f(0.0, 1.0, 0.0); - if (wire) glBegin(GL_LINE_LOOP); - glVertex3f(j - 0.5, -0.01, i - 0.5); - glVertex3f(j + 0.5, -0.01, i - 0.5); - glVertex3f(j + 0.5, -0.01, i + 0.5); - glVertex3f(j - 0.5, -0.01, i + 0.5); - if (wire) glEnd(); + glVertex3f(i, 0.0, j + 1.0); + glVertex3f(i + 1.0, 0.0, j + 1.0); + glVertex3f(i + 1.0, 0.0, j); + glVertex3f(i, 0.0, j); } - if (!wire) glEnd(); + glEnd(); } -double theta = 0.0; - -void display(Queenscreen *c, int wire) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +static void display(Queenscreen *qs) +{ + glClear(clearbits); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt(0.0, 1.0+(0.8*fabs(sin(theta)))*10.0, -1.2*BOARDSIZE, - 0.0, 1.0, 0.0, - 0.0, 0.0, 1.0); - glScalef(1, -1, 1); - gltrackball_rotate (c->trackball); /* Apply mouse-based camera position */ - glScalef(1, -1, 1); + /* setup light attenuation */ + glEnable(GL_COLOR_MATERIAL); + glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.8/(0.01+findAlpha(qs))); + glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.06); + + /** setup perspective */ + glTranslatef(0.0, 0.0, -1.5*qs->BOARDSIZE); + glRotatef(30.0, 1.0, 0.0, 0.0); + gltrackball_rotate (qs->trackball); + glRotatef(qs->theta*100, 0.0, 1.0, 0.0); + glTranslatef(-0.5*qs->BOARDSIZE, 0.0, -0.5*qs->BOARDSIZE); - glRotatef(theta*100, 0.0, 1.0, 0.0); - glTranslatef(-0.5 * (BOARDSIZE-1), 0.0, -0.5 * (BOARDSIZE-1)); + /* find light positions */ + qs->position[0] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*-sin(qs->theta*100*M_PI/180.0); + qs->position[2] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*cos(qs->theta*100*M_PI/180.0); + qs->position[1] = 6.0; - if (!wire) { + if(!wire) { glEnable(GL_LIGHTING); - glEnable(GL_COLOR_MATERIAL); + glLightfv(GL_LIGHT0, GL_POSITION, qs->position); + glEnable(GL_LIGHT0); + } + + /* draw reflections */ + if(!wire) { + draw_reflections(qs); glEnable(GL_BLEND); } + drawBoard(qs); + if(!wire) + glDisable(GL_BLEND); - drawBoard(wire); - glTranslatef(0.0, 0.01, 0.0); - drawPieces(); + glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1); - glDisable(GL_COLOR_MATERIAL); - glDisable(GL_BLEND); - glDisable(GL_LIGHTING); + glTranslatef(0.5, 0.0, 0.5); + drawPieces(qs); - theta += .002; + /* rotate camera */ + if(!qs->button_down_p) + qs->theta += .002; /* zero out board, find new solution of size MINBOARD <= i <= MAXBOARD */ - if(++steps == 512) { - steps = 0; - blank(); - BOARDSIZE = MINBOARD + (random() % (MAXBOARD - MINBOARD + 1)); - go(); + if(++qs->steps == 1024) { + qs->steps = 0; + blank(qs); + qs->BOARDSIZE = MINBOARD + (random() % (MAXBOARD - MINBOARD + 1)); + qs->colorset = (qs->colorset+1)%COLORSETS; + go(qs); } } -#define piece_size 0.1 -#define EPSILON 0.001 - -/* Make a revolved piece */ -void revolve_line(double *trace_r, double *trace_h, double max_iheight, - int rot, int wire) { - double theta, norm_theta, sin_theta, cos_theta; - double norm_ptheta = 0.0, sin_ptheta = 0.0, cos_ptheta = 1.0; - double radius, pradius; - double max_height = max_iheight, height, pheight; - double dx, dy, len; - int npoints, p; - double dtheta = (2.0*M_PI) / rot; - - /* Get the number of points */ - for(npoints = 0; - fabs(trace_r[npoints]) > EPSILON || fabs(trace_h[npoints]) > EPSILON; - ++npoints); - - /* If less than two points, can not revolve */ - if(npoints < 2) - return; - - /* If the max_height hasn't been defined, find it */ - if(max_height < EPSILON) - for(p = 0; p < npoints; ++p) - if(max_height < trace_h[p]) - max_height = trace_h[p]; - - /* Draw the revolution */ - for(theta = dtheta; rot > 0; --rot) { - sin_theta = sin(theta); - cos_theta = cos(theta); - norm_theta = theta / (2.0 * M_PI); - pradius = trace_r[0] * piece_size; - pheight = trace_h[0] * piece_size; - - for(p = 0; p < npoints; ++p) { - radius = trace_r[p] * piece_size; - height = trace_h[p] * piece_size; - - /* Get the normalized lengths of the normal vector */ - dx = radius - pradius; - dy = height - pheight; - len = sqrt(dx*dx + dy*dy); - dx /= len; - dy /= len; - - /* If only triangles required */ - if (fabs(radius) < EPSILON) { - glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLES); - - glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta); - glTexCoord2f(norm_ptheta, pheight / max_height); - glVertex3f(pradius * sin_ptheta, pheight, pradius * cos_ptheta); - - glNormal3f(dy * sin_theta, -dx, dy * cos_theta); - glTexCoord2f(norm_theta, pheight / max_height); - glVertex3f(pradius * sin_theta, pheight, pradius * cos_theta); - - glTexCoord2f(0.5 * (norm_theta + norm_ptheta), - height / max_height); - glVertex3f(0.0, height, 0.0); - - glEnd(); - } - - else { - glBegin(wire ? GL_LINE_LOOP : GL_QUADS); - - glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta); - glTexCoord2f(norm_ptheta, pheight / max_height); - glVertex3f(pradius * sin_ptheta, pheight, pradius * cos_ptheta); - - glNormal3f(dy * sin_theta, -dx, dy * cos_theta); - glTexCoord2f(norm_theta, pheight / max_height); - glVertex3f(pradius * sin_theta, pheight, pradius * cos_theta); - - glTexCoord2f(norm_theta, height / max_height); - glVertex3f(radius * sin_theta, height, radius * cos_theta); - - glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta); - glTexCoord2f(norm_ptheta, height / max_height); - glVertex3f(radius * sin_ptheta, height, radius * cos_ptheta); +static const GLfloat spidermodel[][3] = + { + {0.48, 0.48, 0.22}, + {0.48, 0.34, 0.18}, + {0.34, 0.34, 0.10}, + {0.34, 0.18, 0.30}, + {0.18, 0.14, 0.38}, + {0.14, 0.29, 0.01}, + {0.29, 0.18, 0.18}, + {0.18, 0.18, 0.16}, + {0.18, 0.20, 0.26}, + {0.20, 0.27, 0.14}, + {0.27, 0.24, 0.08}, + {0.24, 0.17, 0.00}, + {0.17, 0.095, 0.08}, + {0.095, 0.07, 0.00}, + {0.07, 0.00, 0.12}, + }; - glEnd(); - } - pradius = radius; - pheight = height; - } +#define EPSILON 0.001 - sin_ptheta = sin_theta; - cos_ptheta = cos_theta; - norm_ptheta = norm_theta; - theta += dtheta; +/** draws cylindermodel */ +static void draw_model(int chunks, const GLfloat model[][3], int r) +{ + int i = 0; + GLUquadricObj *quadric = gluNewQuadric(); + 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); + glTranslatef(0.0, 0.0, model[i][2]); } + + glPopMatrix(); } -void draw_queen(int wire) { - double trace_r[] = - { 4.8, 4.8, 3.4, 3.4, 1.8, 1.4, 2.9, 1.8, 1.8, 2.0, - 2.7, 2.4, 1.7, 0.95, 0.7, 0.0, 0.0 }; /*, 0.9, 0.7, 0.0, 0.0};*/ - double trace_h[] = - { 0.0, 2.2, 4.0, 5.0, 8.0, 11.8, 11.8, 13.6, 15.2, 17.8, - 19.2, 20.0, 20.0, 20.8, 20.8, 22.0, 0.0 };/*,21.4, 22.0, 22.0, 0.0 };*/ - - revolve_line(trace_r, trace_h, 0.0, 8, wire); -} - -void reshape_queens(ModeInfo *mi, int width, int height) { +ENTRYPOINT void reshape_queens(ModeInfo *mi, int width, int height) +{ GLfloat h = (GLfloat) height / (GLfloat) width; glViewport(0,0, width, height); glMatrixMode(GL_PROJECTION); @@ -418,71 +439,82 @@ void reshape_queens(ModeInfo *mi, int width, int height) { glMatrixMode(GL_MODELVIEW); } -void init_queens(ModeInfo *mi) { - GLfloat mat_shininess[] = { 90.0 }; - GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; - +ENTRYPOINT void init_queens(ModeInfo *mi) +{ int screen = MI_SCREEN(mi); - int wire = MI_IS_WIREFRAME(mi); - Queenscreen *c; + Queenscreen *qs; + wire = MI_IS_WIREFRAME(mi); - if(!qs && - !(qs = (Queenscreen *) calloc(MI_NUM_SCREENS(mi), sizeof(Queenscreen)))) + if(!qss && + !(qss = (Queenscreen *) calloc(MI_NUM_SCREENS(mi), sizeof(Queenscreen)))) return; - c = &qs[screen]; - c->window = MI_WINDOW(mi); - c->trackball = gltrackball_init (); + qs = &qss[screen]; + qs->window = MI_WINDOW(mi); + qs->trackball = gltrackball_init (); + + qs->BOARDSIZE = 8; /* 8 cuz its classic */ - if((c->glx_context = init_GL(mi))) + 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); - - setup_lights(); - glNewList(1, GL_COMPILE); - draw_queen(wire); + glNewList(QUEEN, GL_COMPILE); + draw_model(countof(spidermodel), spidermodel, 24); glEndList(); - if (!wire) { - glColorMaterial(GL_FRONT, GL_DIFFUSE); + if(flat) + glShadeModel(GL_FLAT); + + clearbits = GL_COLOR_BUFFER_BIT; - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); - glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); + glColorMaterial(GL_FRONT, GL_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glShadeModel(GL_SMOOTH); + if(!wire) { + setup_lights(qs); glEnable(GL_DEPTH_TEST); + clearbits |= GL_DEPTH_BUFFER_BIT; + clearbits |= GL_STENCIL_BUFFER_BIT; + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); } + else + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); /* find a solution */ - go(); + go(qs); } -void draw_queens(ModeInfo *mi) { - Queenscreen *c = &qs[MI_SCREEN(mi)]; +ENTRYPOINT void draw_queens(ModeInfo *mi) +{ + Queenscreen *qs = &qss[MI_SCREEN(mi)]; Window w = MI_WINDOW(mi); Display *disp = MI_DISPLAY(mi); - if(!c->glx_context) + if(!qs->glx_context) return; - glXMakeCurrent(disp, w, *(c->glx_context)); + glXMakeCurrent(disp, w, *(qs->glx_context)); - display(c, MI_IS_WIREFRAME(mi)); + display(qs); if(mi->fps_p) do_fps(mi); glFinish(); glXSwapBuffers(disp, w); } -void release_queens(ModeInfo *mi) { - if(qs) - free((void *) qs); +ENTRYPOINT void release_queens(ModeInfo *mi) +{ + if(qss) + free((void *) qss); + qss = 0; - FreeAllGL(MI); + FreeAllGL(mi); } +XSCREENSAVER_MODULE ("Queens", queens) + #endif