chess.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:27k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * chess.c - part of the chess demo in the glut distribution.
  3.  *
  4.  * (C) Henk Kok (kok@wins.uva.nl)
  5.  *
  6.  * This file can be freely copied, changed, redistributed, etc. as long as
  7.  * this copyright notice stays intact.
  8.  */
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <GL/glut.h>
  12. #include <math.h>
  13. #include "chess.h"
  14. #if 0
  15. /* Uncomment to debug various scenarios. */
  16. #undef GL_VERSION_1_1
  17. #undef GL_EXT_texture_object
  18. #undef GL_EXT_texture
  19. #endif
  20. #ifndef GL_VERSION_1_1
  21. #if defined(GL_EXT_texture_object) && defined(GL_EXT_texture)
  22. #define glGenTextures glGenTexturesEXT
  23. #define glBindTexture glBindTextureEXT
  24. #else
  25. #define USE_DISPLAY_LISTS
  26. #endif
  27. #endif
  28. /* Some <math.h> files do not define M_PI... */
  29. #ifndef M_PI
  30. #define M_PI 3.14159265358979323846
  31. #endif
  32. int texturing = 0;
  33. int reflection = 0;
  34. int chaos = 0;
  35. int chaosPieces = 0;
  36. int animating = 1;
  37. static GLuint texName[3];
  38. extern int path[10][10], piece, piece2;
  39. extern GLfloat CX1, CY1, CX2, CY2, CZ2;
  40. #define WIT 0
  41. #define ZWART 16
  42. int board[10][10];
  43. GLubyte white_square[TXSX][TXSY][3];
  44. GLubyte black_square[TXSX][TXSY][3];
  45. GLubyte wood[TXSX][TXSY][3];
  46. extern GLfloat lightpos[];
  47. GLfloat buf[256], phase;
  48. GLfloat transl[48];
  49. int list[48];
  50. GLfloat width[144], height[144];
  51. GLfloat bwidth, bheight;
  52. int cycle[10][10], cyclem, cycle2;
  53. int stunt[10][10], stuntm, stunt2;
  54. GLfloat blackamb[4] = { 0.2, 0.1, 0.1, 0.5 };
  55. GLfloat blackdif[4] = { 0.2, 0.1, 0.0, 0.5 };
  56. GLfloat blackspec[4] = { 0.5, 0.5, 0.5, 0.5 };
  57. GLfloat whiteamb[4] = { 0.7, 0.7, 0.4, 0.5 };
  58. GLfloat whitedif[4] = { 0.8, 0.7, 0.4, 0.5 };
  59. GLfloat whitespec[4] = { 0.8, 0.7, 0.4, 0.5 };
  60. GLfloat copperamb[4] = { 0.24, 0.2, 0.07, 1.0 };
  61. GLfloat copperdif[4] = { 0.75, 0.61, 0.22, 1.0 };
  62. GLfloat copperspec[4] = { 0.32, 0.25, 0.17, 1.0 };
  63. GLfloat darkamb[4] = { 0.10, 0.10, 0.10, 1.0 };
  64. GLfloat darkdif[4] = { 0.6, 0.6, 0.6, 1.0 };
  65. GLfloat darkspec[4] = { 0.25, 0.25, 0.25, 1.0 };
  66. GLdouble ClipPlane[4] = { 0.0, 1.0, 0.0, 0.0 };
  67. void white_texture(void)
  68. {
  69.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, whitedif);
  70.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, whiteamb);
  71.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whitespec);
  72.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  73. }
  74. void black_texture(void)
  75. {
  76.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blackdif);
  77.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, blackamb);
  78.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blackspec);
  79.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  80. }
  81. void copper_texture(void)
  82. {
  83.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, copperdif);
  84.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, copperamb);
  85.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, copperspec);
  86.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  87. }
  88. void dark_texture(void)
  89. {
  90.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, darkdif);
  91.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, darkamb);
  92.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, darkspec);
  93.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  94. }
  95. void border_texture(void)
  96. {
  97.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, copperdif);
  98.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, copperamb);
  99.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, copperspec);
  100.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 90.0);
  101. }
  102. void init_textures(void)
  103. {
  104. #if !defined(USE_DISPLAY_LISTS)
  105.     glGenTextures(3, texName);
  106. #else
  107.     texName[0] = 1000;
  108.     texName[1] = 1001;
  109.     texName[2] = 1002;
  110. #endif
  111.     GenerateTextures();
  112.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  113. #if !defined(USE_DISPLAY_LISTS)
  114.     glBindTexture(GL_TEXTURE_2D, texName[0]);
  115. #else
  116.     glNewList(texName[0], GL_COMPILE);
  117. #endif
  118.     glTexImage2D(GL_TEXTURE_2D, 0, 3, TXSX, TXSY, 0, GL_RGB,
  119. GL_UNSIGNED_BYTE, &wood[0][0][0]);
  120.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  121.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  122.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  123.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  124.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  125. #if defined(USE_DISPLAY_LISTS)
  126.     glEndList();
  127. #endif
  128. #if !defined(USE_DISPLAY_LISTS)
  129.     glBindTexture(GL_TEXTURE_2D, texName[1]);
  130. #else
  131.     glNewList(texName[1], GL_COMPILE);
  132. #endif
  133.     glTexImage2D(GL_TEXTURE_2D, 0, 3, TXSX, TXSY, 0, GL_RGB,
  134. GL_UNSIGNED_BYTE, &white_square[0][0][0]);
  135.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  136.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  137.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  138.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  139.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  140. #if defined(USE_DISPLAY_LISTS)
  141.     glEndList();
  142. #endif
  143. #if !defined(USE_DISPLAY_LISTS)
  144.     glBindTexture(GL_TEXTURE_2D, texName[2]);
  145. #else
  146.     glNewList(texName[2], GL_COMPILE);
  147. #endif
  148.     glTexImage2D(GL_TEXTURE_2D, 0, 3, TXSX, TXSY, 0, GL_RGB,
  149. GL_UNSIGNED_BYTE, &black_square[0][0][0]);
  150.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  151.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  152.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  153.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  154.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  155. #if defined(USE_DISPLAY_LISTS)
  156.     glEndList();
  157. #endif
  158. }
  159. void do_border(void)
  160. {
  161.     glPushMatrix();
  162.     glTranslatef(-0.5, 0.0, -0.5);
  163.     if (texturing)
  164.     {
  165. #if !defined(USE_DISPLAY_LISTS)
  166. glBindTexture(GL_TEXTURE_2D, texName[0]);
  167. #else
  168.         glCallList(texName[0]);
  169. #endif
  170. glEnable(GL_TEXTURE_2D);
  171.     } else
  172. border_texture();
  173.     glBegin(GL_QUADS);
  174.     glNormal3f(0.0, 1.0, 0.0);
  175.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 0.0);
  176.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 0.0);
  177.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, 0.08, -0.5);
  178.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, 0.08, -0.5);
  179.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 0.0);
  180.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 8.0);
  181.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, 0.08, 8.5);
  182.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, 0.08, -0.5);
  183.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 8.0);
  184.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 8.0);
  185.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, 0.08, 8.5);
  186.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, 0.08, 8.5);
  187.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 8.0);
  188.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 0.0);
  189.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, 0.08, -0.5);
  190.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, 0.08, 8.5);
  191.     glEnd();
  192.     glBegin(GL_QUADS);
  193.     glNormal3f(0.0, 0.0, 1.0);
  194.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 0.0);
  195.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 0.0);
  196.     glTexCoord2f(0.6, 0.6); glVertex3f(8.0, -0.08, 0.0);
  197.     glTexCoord2f(0.0, 0.6); glVertex3f(0.0, -0.08, 0.0);
  198.     glNormal3f(0.0, 1.0, 0.0);
  199.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 0.0);
  200.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 8.0);
  201.     glTexCoord2f(0.6, 0.6); glVertex3f(8.0, -0.08, 8.0);
  202.     glTexCoord2f(0.0, 0.6); glVertex3f(8.0, -0.08, 0.0);
  203.     glNormal3f(0.0, 0.0, 1.0);
  204.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 8.0);
  205.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 8.0);
  206.     glTexCoord2f(0.6, 0.6); glVertex3f(0.0, -0.08, 8.0);
  207.     glTexCoord2f(0.0, 0.6); glVertex3f(8.0, -0.08, 8.0);
  208.     glNormal3f(0.0, 1.0, 0.0);
  209.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 8.0);
  210.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 0.0);
  211.     glTexCoord2f(0.6, 0.6); glVertex3f(0.0, -0.08, 0.0);
  212.     glTexCoord2f(0.0, 0.6); glVertex3f(0.0, -0.08, 8.0);
  213.     glEnd();
  214.     glBegin(GL_QUADS);
  215.     glNormal3f(0.0, 0.0, 1.0);
  216.     glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, 0.08, -0.5);
  217.     glTexCoord2f(0.6, 0.0); glVertex3f(8.5, 0.08, -0.5);
  218.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, -0.08, -0.5);
  219.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, -0.08, -0.5);
  220.     glNormal3f(0.0, 1.0, 0.0);
  221.     glTexCoord2f(0.0, 0.0); glVertex3f(8.5, 0.08, -0.5);
  222.     glTexCoord2f(0.6, 0.0); glVertex3f(8.5, 0.08, 8.5);
  223.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, -0.08, 8.5);
  224.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, -0.08, -0.5);
  225.     glNormal3f(0.0, 0.0, 1.0);
  226.     glTexCoord2f(0.0, 0.0); glVertex3f(8.5, 0.08, 8.5);
  227.     glTexCoord2f(0.6, 0.0); glVertex3f(-0.5, 0.08, 8.5);
  228.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, -0.08, 8.5);
  229.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, -0.08, 8.5);
  230.     glNormal3f(0.0, 1.0, 0.0);
  231.     glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, 0.08, 8.5);
  232.     glTexCoord2f(0.6, 0.0); glVertex3f(-0.5, 0.08, -0.5);
  233.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, -0.08, -0.5);
  234.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, -0.08, 8.5);
  235.     glEnd();
  236.     if (texturing)
  237. glDisable(GL_TEXTURE_2D);
  238.     glPopMatrix();
  239. }
  240. void do_vlakje(void)
  241. {
  242.     glColor4f(1.0, 1.0, 1.0, 1.0);
  243.     glDisable(GL_LIGHTING);
  244.     glPushMatrix();
  245.     glTranslatef(-0.5, 0.0, -0.5);
  246.     glBegin(GL_QUADS);
  247.     glVertex3f(0.0, 0.0, 0.0);
  248.     glVertex3f(8.0, 0.0, 0.0);
  249.     glVertex3f(8.0, 0.0, 8.0);
  250.     glVertex3f(0.0, 0.0, 8.0);
  251.     glEnd();
  252.     glPopMatrix();
  253.     glEnable(GL_LIGHTING);
  254. }
  255. void do_board(void)
  256. {
  257.     int x,y;
  258.     glPushMatrix();
  259.     glTranslatef(-0.5, 0.0, -0.5);
  260.     white_texture();
  261.     if (texturing)
  262.     {
  263. #if !defined(USE_DISPLAY_LISTS)
  264. glBindTexture(GL_TEXTURE_2D, texName[1]);
  265. #else
  266.         glCallList(texName[1]);
  267. #endif
  268. glEnable(GL_TEXTURE_2D);
  269.     }
  270.     glBegin(GL_QUADS);
  271.     glNormal3f(0.0, 1.0, 0.0);
  272.     for (x=0;x<8;x++)
  273.     {
  274. for (y=x%2;y<8;y+=2)
  275. {
  276.     glTexCoord2f(0.2*x, 0.2*y); glVertex3f(x, 0, y);
  277.     glTexCoord2f(0.17+0.2*x, 0.2*y); glVertex3f(x+1, 0, y);
  278.     glTexCoord2f(0.17+0.2*x, 0.17+0.2*y); glVertex3f(x+1, 0, y+1);
  279.     glTexCoord2f(0.2*x, 0.17+0.2*y); glVertex3f(x, 0, y+1);
  280. }
  281.     }
  282.     glEnd();
  283.     if (texturing)
  284.     {
  285. glDisable(GL_TEXTURE_2D);
  286. #if !defined(USE_DISPLAY_LISTS)
  287. glBindTexture(GL_TEXTURE_2D, texName[2]);
  288. #else
  289.         glCallList(texName[2]);
  290. #endif
  291. glEnable(GL_TEXTURE_2D);
  292.     } else
  293. black_texture();
  294.     glBegin(GL_QUADS);
  295.     glNormal3f(0.0, 1.0, 0.0);
  296.     for (x=0;x<8;x++)
  297.     {
  298. for (y=1-(x%2);y<8;y+=2)
  299. {
  300.     glTexCoord2f(0.2*x, 0.2*y); glVertex3f(x, 0, y);
  301.     glTexCoord2f(0.17+0.2*x, 0.2*y); glVertex3f(x+1, 0, y);
  302.     glTexCoord2f(0.17+0.2*x, 0.17+0.2*y); glVertex3f(x+1, 0, y+1);
  303.     glTexCoord2f(0.2*x, 0.17+0.2*y); glVertex3f(x, 0, y+1);
  304. }
  305.     }
  306.     glEnd();
  307.     if (texturing)
  308. glDisable(GL_TEXTURE_2D);
  309.     glPopMatrix();
  310. }
  311. void do_solid(GLfloat *f, int sz, GLfloat width)
  312. {
  313.     GLfloat nx, ny, s;
  314.     GLfloat length;
  315.     int i,j;
  316.     for (i=0;i<sz;i++)
  317. buf[i] = f[i]/4.2;
  318.     for (i=0;i<sz;i+=2)
  319.     {
  320. buf[i+1] = buf[i+1] * (1 - cos(phase)/3);
  321. buf[i] = buf[i] * (1+sin(M_PI*buf[i+1]/buf[1])*cos(phase)*0.7);
  322. /*
  323. if (buf[i] > bwidth)
  324.     bwidth = buf[i];
  325. */
  326. if (buf[i+1] > bheight)
  327.     bheight = buf[i+1];
  328.     }
  329.     glBegin(GL_QUAD_STRIP);
  330.     for (i=2;i<sz;i+=2)
  331.     {
  332. if (buf[i+3] == buf[i+1] && buf[i+2] == buf[i])
  333.     continue;
  334. nx = buf[i-1] + buf[i+3];
  335. ny = buf[i+2] - buf[i];
  336. length = sqrt(nx*nx+ny*ny);
  337. nx = nx/length;
  338. ny = ny/length;
  339. s = (1+cos(phase)*0.7);
  340. glNormal3f(0.0, ny, nx);
  341. glVertex3f(width*s, buf[i+1], buf[i]);
  342. glVertex3f(-width*s, buf[i+1], buf[i]);
  343.     }
  344.     glEnd();
  345.     glNormal3f(-1.0, 0.0, 0.0);
  346.     i = 2; j = sz-4;
  347.     glBegin(GL_TRIANGLE_STRIP);
  348.     while (i < j)
  349.     {
  350. while (buf[i-1] == buf[i+1] && buf[i-2] == buf[i] && i < j)
  351.     i += 2;
  352. if (i < j)
  353. {
  354.     s = (1+cos(phase)*0.7);
  355.     glVertex3f(-width*s, buf[i+1], buf[i]);
  356. }
  357. i += 2;
  358. while (buf[j-1] == buf[j+1] && buf[j-2] == buf[j] && i < j)
  359.     j -= 2;
  360. if (i < j)
  361. {
  362.     s = (1+cos(phase)*0.7);
  363.     glVertex3f(-width*s, buf[j+1], buf[j]);
  364. }
  365. j -= 2;
  366.     }
  367.     glEnd();
  368.     i = 2; j = sz-4;
  369.     glBegin(GL_TRIANGLE_STRIP);
  370.     glNormal3f(1.0, 0.0, 0.0);
  371.     while (i < j)
  372.     {
  373. while (buf[i-1] == buf[i+1] && buf[i-2] == buf[i] && i < j)
  374.     i += 2;
  375. if (i < j)
  376. {
  377.     s = (1+cos(phase)*0.7);
  378.     glVertex3f(width*s, buf[i+1], buf[i]);
  379. }
  380. i += 2;
  381. while (buf[j-1] == buf[j+1] && buf[j-2] == buf[j] && i < j)
  382.     j -= 2;
  383. if (i < j)
  384. {
  385.     s = (1+cos(phase)*0.7);
  386.     glVertex3f(width*s, buf[j+1], buf[j]);
  387. }
  388. j -= 2;
  389.     }
  390.     glEnd();
  391. }
  392. void do_rotate(GLfloat *f, int sz)
  393. {
  394.     GLfloat nx, ny;
  395.     GLfloat length;
  396.     GLfloat a, c, s;
  397.     int i,j;
  398.     bheight = 0;
  399.     bwidth = 0;
  400.     for (i=0;i<sz;i++)
  401. buf[i] = f[i] / 4.2;
  402.     for (i=0;i<sz;i+=2)
  403.     {
  404. buf[i+1] = buf[i+1] * (1 - cos(phase)/3);
  405. buf[i] = buf[i] * (1+sin(M_PI*buf[i+1]/buf[1])*cos(phase)*0.7);
  406. if (buf[i] > bwidth)
  407.     bwidth = buf[i];
  408. if (buf[i+1] > bheight)
  409.     bheight = buf[i+1];
  410.     }
  411.     for (i=2;i<sz-4;i+=2)
  412.     {
  413. if (fabs(buf[i+3]+buf[i+1]) +fabs(buf[i+2]+buf[i]) < 0.0001)
  414.     continue;
  415. glBegin(GL_QUAD_STRIP);
  416. for (j=0;j<=ACC;j++)
  417. {
  418.     a = ((float) j)*M_PI*2/ACC;
  419.     c = cos(a);
  420.     s = sin(a);
  421.     nx = buf[i-1] + buf[i+3];
  422.     ny = buf[i+2] - buf[i];
  423.     length = sqrt(nx*nx+ny*ny);
  424.     nx = nx/length;
  425.     ny = ny/length;
  426.     glNormal3f(c*nx, ny, s*nx);
  427.     glVertex3f(c*buf[i], buf[i+1], s*buf[i]);
  428.     nx = buf[i-1] + buf[i+3];
  429.     ny = buf[i+2] - buf[i];
  430.     length = sqrt(nx*nx+ny*ny);
  431.     nx = nx/length;
  432.     ny = ny/length;
  433.     glNormal3f(c*nx, ny, s*nx);
  434.     glVertex3f(c*buf[i+2], buf[i+3], s*buf[i+2]);
  435. }
  436. glEnd();
  437.     }
  438. }
  439. GLfloat pion_data[] = {
  440. -0.04, 3.000,   0.000, 0.000,   0.000, 0.000,   0.000, 0.000,
  441. 0.000, 0.000,   0.000, 0.000,   0.000, 0.000,   0.000, 0.000,
  442. 0.200, 2.000,   0.560, 1.900,   0.560, 1.800,   0.300, 1.800,
  443. 0.300, 1.800,   0.520, 1.030,   0.520, 1.030,   0.550, 1.030,
  444. 0.550, 1.030,   0.670, 0.670,   0.940, 0.450,   0.940, 0.300,
  445. 0.840, 0.300,   0.840, 0.150,   0.940, 0.150,   0.940, 0.000,
  446. 0.940, 0.000, 0.000, 0.000, 0.000, 0.000
  447. };
  448. void prepare_pion(void)
  449. {
  450.     int i;
  451.     GLfloat a, c, s;
  452.     for (i=0;i<7;i++)
  453.     {
  454. a = ((GLfloat) i)*M_PI/8;
  455. s = sin(a);
  456. c = cos(a);
  457. pion_data[2+i*2] = s*0.56;
  458. pion_data[3+i*2] = c*0.56+2.44;
  459.     }
  460.     pion_data[2+i*2] = pion_data[i*2];
  461.     pion_data[3+i*2] = pion_data[i*2+1];
  462. }
  463. void do_pion(void)
  464. {
  465.     do_rotate(pion_data, sizeof(pion_data)/sizeof(GLfloat));
  466. }
  467. GLfloat toren_data[] = {
  468. -0.04, 3.000, 0.000, 3.000, 0.600, 3.000, 0.600, 3.000,
  469. 0.600, 3.200, 0.600, 3.200, 0.800, 3.200, 0.800, 3.200,
  470. 0.800, 3.200, 0.600, 2.700, 0.600, 2.700, 0.550, 2.700,
  471. 0.550, 2.700, 0.700, 1.200, 0.700, 1.200, 0.730, 1.200,
  472. 0.730, 1.200,   0.850, 0.850, 1.050, 0.500, 1.050, 0.500,
  473. 1.050, 0.300, 0.950, 0.350, 0.950, 0.150, 1.050, 0.150,
  474. 1.050, 0.000, 1.050, 0.000, 0.000, 0.000, 0.000, 0.000
  475. };
  476. void do_toren(void)
  477. {
  478.     int i;
  479.     GLfloat a1, a2, c1, s1, c2, s2, h1, h2;
  480.     do_rotate(toren_data, sizeof(toren_data)/sizeof(GLfloat));
  481.     h1 = buf[9];
  482.     h2 = buf[9] + buf[9] - buf[3];
  483.     for (i=0;i<ACC;i++)
  484.     {
  485. if ((i*8/ACC)%2)
  486. {
  487.     a1 = ((GLfloat) i)*M_PI*2/ACC;
  488.     s1 = cos(a1);
  489.     c1 = sin(a1);
  490.     a2 = ((GLfloat) i+1)*M_PI*2/ACC;
  491.     s2 = cos(a2);
  492.     c2 = sin(a2);
  493.     glBegin(GL_QUADS);
  494.     glNormal3f(c1, 0.0, s1);
  495.     glVertex3f(0.143*c1, h1, 0.143*s1);
  496.     glVertex3f(0.143*c1, h2, 0.143*s1);
  497.     glNormal3f(c2, 0.0, s2);
  498.     glVertex3f(0.143*c2, h2, 0.143*s2);
  499.     glVertex3f(0.143*c2, h1, 0.143*s2);
  500.     glEnd();
  501.     glBegin(GL_QUADS);
  502.     glNormal3f(0.0, 1.0, 0.0);
  503.     glVertex3f(0.143*c1, h2, 0.143*s1);
  504.     glVertex3f(0.190*c1, h2, 0.190*s1);
  505.     glVertex3f(0.190*c2, h2, 0.190*s2);
  506.     glVertex3f(0.143*c2, h2, 0.143*s2);
  507.     glEnd();
  508.     glBegin(GL_QUADS);
  509.     glNormal3f(c1, 0.0, s1);
  510.     glVertex3f(0.190*c1, h1, 0.190*s1);
  511.     glVertex3f(0.190*c1, h2, 0.190*s1);
  512.     glNormal3f(c2, 0.0, s2);
  513.     glVertex3f(0.190*c2, h2, 0.190*s2);
  514.     glVertex3f(0.190*c2, h1, 0.190*s2);
  515.     glEnd();
  516. }
  517.     }
  518.     for (i=0;i<ACC;i++)
  519.     {
  520. if (!((i*8) % ACC))
  521. {
  522.     a1 = ((GLfloat) i)*M_PI*2/ACC;
  523.     s1 = cos(a1);
  524.     c1 = sin(a1);
  525.     glBegin(GL_QUADS);
  526.     glNormal3f(s1, 0.0, -c1);
  527.     glVertex3f(c1*0.143, h1, s1*0.143);
  528.     glVertex3f(c1*0.190, h1, s1*0.190);
  529.     glVertex3f(c1*0.190, h2, s1*0.190);
  530.     glVertex3f(c1*0.143, h2, s1*0.143);
  531.     glEnd();
  532. }
  533.     }
  534. }
  535. GLfloat paard_data[] = {
  536. -0.04, 1.950, 0.200, 1.950, 0.200, 1.950, 0.200, 1.550,
  537. 0.200, 1.550, 0.650, 1.550, 0.650, 1.550, 0.700, 1.400,
  538. 0.700, 1.100,
  539. 0.850, 0.850, 1.050, 0.500, 1.050, 0.500, 1.050, 0.300,
  540. 0.950, 0.350, 0.950, 0.150, 1.050, 0.150, 1.050, 0.000,
  541. 1.050, 0.000, 0.000, 0.000, 0.000, 0.000
  542. };
  543. GLfloat paard_data2[] = {
  544. 0.000, 1.600, 0.500, 1.600, 0.500, 1.600, 0.800, 2.800,
  545. 0.870, 3.000, 0.550, 3.500, 0.000, 4.000, -0.30, 4.300,
  546. -0.30, 4.300, -0.50, 3.850, -0.50, 3.850, -0.85, 3.500,
  547. -0.85, 3.500, -0.85, 3.200, -0.85, 3.200, -0.20, 3.000,
  548. -0.20, 3.000, -0.45, 2.500, -0.80, 2.350, -0.80, 2.350,
  549. -0.65, 1.600, 0.000, 1.600
  550. };
  551. void do_paard(void)
  552. {
  553.     do_rotate(paard_data, sizeof(paard_data)/sizeof(GLfloat));
  554.     do_solid(paard_data2, sizeof(paard_data2)/sizeof(GLfloat), 0.08);
  555. }
  556.     
  557. GLfloat loper_data[] = {
  558. -0.20, 4.700, 0.000, 4.600, 0.250, 4.450, 0.150, 4.350,
  559. 0.150, 4.350, 0.500, 3.900, 0.640, 3.500, 0.450, 3.100,
  560. 0.450, 3.100, 0.580, 3.050, 0.450, 3.000, 0.450, 3.000,
  561. 0.450, 2.700, 0.450, 2.700, 0.560, 2.650, 0.520, 2.600,
  562. 0.520, 2.600, 0.700, 2.500,   0.740, 2.450, 0.700, 2.400,
  563. 0.300, 2.300, 0.300, 2.300, 0.500, 1.150, 0.500, 1.150,
  564. 0.550, 1.150, 0.550, 1.150,
  565. 0.850, 0.850, 1.050, 0.500, 1.050, 0.500, 1.050, 0.300,
  566. 0.950, 0.350, 0.950, 0.150, 1.050, 0.150, 1.050, 0.000,
  567. 1.050, 0.000, 0.000, 0.000, 0.000, 0.000
  568. };
  569. void do_loper(void)
  570. {
  571.     do_rotate(loper_data, sizeof(loper_data)/sizeof(GLfloat));
  572. }
  573. GLfloat koning_data[] = {
  574. -0.20, 5.600,
  575. 0.000, 5.600, 0.300, 5.600, 0.550, 5.400, 0.850, 5.400,
  576. 0.554, 4.350, 0.554, 4.350, 0.650, 4.250, 0.550, 4.150,
  577. 0.550, 4.150, 0.550, 3.900, 0.551, 3.900, 0.750, 3.650,
  578. 0.750, 3.651, 0.751, 3.651, 0.920, 3.550, 0.500, 3.450,
  579. 0.500, 3.450,
  580. 0.500, 3.400, 0.650, 1.600, 0.700, 1.600, 0.750, 1.600,
  581. 1.150, 0.850, 1.200, 0.800, 1.200, 0.500, 1.200, 0.500,
  582. 1.100, 0.400, 1.200, 0.300, 1.200, 0.300, 1.200, 0.000,
  583. 1.200, 0.000, 0.000, 0.000, 0.000, 0.000
  584. };
  585. GLfloat koning_data2[] = {
  586. 0.000, 5.400, 0.200, 5.400,
  587. 0.200, 5.400, 0.200, 7.000, 0.200, 7.000, -0.20, 7.000,
  588. -0.20, 7.000, -0.20, 5.400, -0.20, 5.400, 0.000, 5.400,
  589. };
  590. GLfloat koning_data3[] = {
  591. 0.000, 6.100, 0.700, 6.100, 0.700, 6.100, 0.700, 6.500,
  592. 0.700, 6.500, -0.70, 6.500, -0.70, 6.500, -0.70, 6.100,
  593. -0.70, 6.100, 0.000, 6.100
  594. };
  595. void prepare_koning(void)
  596. {
  597. /*
  598.  * I used much data from the dame for the koning, but the koning it a little
  599.  * bit bigger, so....
  600.  */
  601.     int i;
  602.     for (i=0;i<sizeof(koning_data)/sizeof(GLfloat);i+=2)
  603.     {
  604. koning_data[i] = koning_data[i] * 0.95;
  605. koning_data[i+1] = koning_data[i+1] * 1.05;
  606.     }
  607.     for (i=0;i<sizeof(koning_data2)/sizeof(GLfloat);i++)
  608. koning_data2[i] = koning_data2[i] * 1.05;
  609.     for (i=0;i<sizeof(koning_data3)/sizeof(GLfloat);i++)
  610. koning_data3[i] = koning_data3[i] * 1.05;
  611. }
  612. void do_koning(void)
  613. {
  614.     do_rotate(koning_data, sizeof(koning_data)/sizeof(GLfloat));
  615.     glRotatef(90.0, 0.0, 1.0, 0.0);
  616.     do_solid(koning_data2, sizeof(koning_data2)/sizeof(GLfloat), 0.05);
  617.     do_solid(koning_data3, sizeof(koning_data3)/sizeof(GLfloat), 0.05);
  618. }
  619. GLfloat dame_data[] = {
  620. -0.20, 6.000, 0.000, 6.000, 0.300, 5.850, 0.200, 5.700,
  621. 0.300, 5.600,
  622. 0.301, 5.600, 0.550, 5.400, 0.550, 5.400, 0.850, 5.400,
  623. 0.800, 5.400, 0.800, 5.000, 0.800, 5.000, 0.650, 4.750,
  624. 0.554, 4.350, 0.554, 4.350, 0.650, 4.250, 0.550, 4.150,
  625. 0.550, 4.150, 0.550, 3.900, 0.551, 3.900, 0.750, 3.650,
  626. 0.750, 3.651, 0.751, 3.651, 0.920, 3.550, 0.500, 3.450,
  627. 0.500, 3.400, 0.650, 1.600, 0.700, 1.600, 0.750, 1.600,
  628. 1.150, 0.850, 1.200, 0.800, 1.200, 0.500, 1.200, 0.500,
  629. 1.100, 0.400, 1.200, 0.300, 1.200, 0.300, 1.200, 0.000,
  630. 1.200, 0.000, 0.000, 0.000, 0.000, 0.000
  631. };
  632. void do_dame(void)
  633. {
  634.     do_rotate(dame_data, sizeof(dame_data)/sizeof(GLfloat));
  635. }
  636. void init_lists(void)
  637. {
  638.     int i,j;
  639.     printf("Generating textures.n");
  640.     init_textures();
  641.     for (i=0;i<17;i++)
  642. transl[i+12] = transl[44-i] = sin(((GLfloat) i)*M_PI/32)/1.5;
  643.     for (i=0;i<17;i++)
  644. list[i+8] = list[40-i] = i*8;
  645.     for (i=0;i<8;i++)
  646. list[40+i] = list[7-i] = i*8;
  647.     printf("Generating display lists.n");
  648.     prepare_pion();
  649.     prepare_koning();
  650.     for (i=0;i<=16;i++)
  651.     {
  652. phase = ((GLfloat) i) * M_PI/16.0;
  653. glNewList(PION + 8*i, GL_COMPILE);
  654. width[PION+8*i] = bwidth;
  655. height[PION+8*i] = bheight;
  656. do_pion();
  657. glEndList();
  658. glNewList(TOREN + 8*i, GL_COMPILE);
  659. do_toren();
  660. width[TOREN+8*i] = bwidth;
  661. height[TOREN+8*i] = bheight;
  662. glEndList();
  663. glNewList(PAARD + 8*i, GL_COMPILE);
  664. do_paard();
  665. width[PAARD+8*i] = bwidth;
  666. height[PAARD+8*i] = bheight;
  667. glEndList();
  668. glNewList(LOPER + 8*i, GL_COMPILE);
  669. do_loper();
  670. width[LOPER+8*i] = bwidth;
  671. height[LOPER+8*i] = bheight;
  672. glEndList();
  673. glNewList(KONING + 8*i, GL_COMPILE);
  674. do_koning();
  675. width[KONING+8*i] = bwidth;
  676. height[KONING+8*i] = bheight;
  677. glEndList();
  678. glNewList(DAME + 8*i, GL_COMPILE);
  679. do_dame();
  680. width[DAME+8*i] = bwidth;
  681. height[DAME+8*i] = bheight;
  682. glEndList();
  683.     }
  684.     for (i=0;i<10;i++)
  685. for (j=0;j<10;j++)
  686. {
  687.     board[i][j] = 0;
  688.     cycle[i][j] = -1;
  689. }
  690.     for (i=1;i<9;i++)
  691.     {
  692. board[i][2] = PION + WIT;
  693. board[i][7] = PION + ZWART;
  694.     }
  695.     board[1][1] = board[8][1] = TOREN + WIT;
  696.     board[2][1] = board[7][1] = PAARD + WIT;
  697.     board[3][1] = board[6][1] = LOPER + WIT;
  698.     board[4][1] = DAME + WIT;
  699.     board[5][1] = KONING + WIT;
  700.     board[1][8] = board[8][8] = TOREN + ZWART;
  701.     board[2][8] = board[7][8] = PAARD + ZWART;
  702.     board[3][8] = board[6][8] = LOPER + ZWART;
  703.     board[4][8] = DAME + ZWART;
  704.     board[5][8] = KONING + ZWART;
  705.     read_move();
  706. }
  707. extern int speed;
  708. void do_piece(int pc, GLfloat x, GLfloat y, int *st, int *cl, int color)
  709. {
  710.     GLfloat a, s;
  711.     if (*cl >= 0)
  712. (*cl)++;
  713.     if (*cl < 0 && ((rand()%300) < 4) && chaos)
  714.     {
  715. chaosPieces++;
  716. *cl = 0;
  717. *st = rand() % 6;
  718.     }
  719.     if (*cl >= 48) {
  720. chaosPieces--;
  721. if (chaosPieces == 0 && !chaos) {
  722.     if (!animating && (speed == 0))
  723. glutIdleFunc(NULL);
  724. }
  725. *cl = -1;
  726.     }
  727.     if (*cl < 0)
  728.     {
  729. glPushMatrix();
  730. glTranslatef(x - 1.0, ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  731. if (color == ZWART && pc == PAARD)
  732.     glRotatef(180.0, 0.0, 1.0, 0.0);
  733. glScalef(1.2, 1.2, 1.2);
  734. glCallList(pc+list[0]);
  735. glPopMatrix();
  736. return;
  737.     }
  738.     glPushMatrix();
  739.     switch (*st)
  740.     {
  741. case 0:
  742.     glTranslatef(x - 1.0, transl[(*cl)>=0?*cl:0] +
  743. ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  744.     if (color == ZWART && pc == PAARD)
  745. glRotatef(180.0, 0.0, 1.0, 0.0);
  746.     glScalef(1.2, 1.2, 1.2);
  747.     glCallList(list[(*cl)>=0?*cl:0]+pc);
  748.     break;
  749. case 1:
  750. case 2:
  751.     glTranslatef(x - 1.0, transl[(*cl)>=0?*cl:0] +
  752. ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  753.     if (color == ZWART && pc == PAARD)
  754. glRotatef(180.0, 0.0, 1.0, 0.0);
  755.     if ((*cl > 16) && (*cl < 32))
  756.     {
  757. glTranslatef(0.0, height[list[*cl]+pc]/2, 0.0);
  758. if (*st == 1)
  759.     glRotatef(((*cl)-16) * 22.5, 1.0, 0.0, 0.0);
  760. else
  761.     glRotatef(-((*cl)-16) * 22.5, 1.0, 0.0, 0.0);
  762. glTranslatef(0.0, -height[list[*cl]+pc]/2, 0.0);
  763.     }
  764.     glScalef(1.2, 1.2, 1.2);
  765.     glCallList(list[*cl]+pc);
  766.     break;
  767. case 3:
  768.     glTranslatef(x - 1.0, ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  769.     if (color == ZWART && pc == PAARD)
  770. glRotatef(180.0, 0.0, 1.0, 0.0);
  771.     a = ((GLfloat) (*cl)) * M_PI / 12;
  772.     s = sin(a);
  773.     glRotatef(15*s, 0.0, 0.0, 1.0);
  774.     glTranslatef(0.0, width[list[0]+pc]*s*s, 0.0);
  775.     glScalef(1.2, 1.2, 1.2);
  776.     glCallList(list[0] + pc);
  777.     break;
  778. default:
  779.     glTranslatef(x - 1.0, ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  780.     if (color == ZWART && pc == PAARD)
  781. glRotatef(180.0, 0.0, 1.0, 0.0);
  782.     a = ((GLfloat) (*cl)) * M_PI / 12;
  783.     s = sin(a);
  784.     glRotatef(15*s, 0.0, 0.0, 1.0);
  785.     glRotatef((*cl) * 30, 0.0, 1.0, 0.0);
  786.     glTranslatef(0.0, width[list[0]+pc]*s*s, 0.0);
  787.     glScalef(1.2, 1.2, 1.2);
  788.     glCallList(list[0]+pc);
  789.     break;
  790.     }
  791.     glPopMatrix();
  792. }
  793. void do_pieces(void)
  794. {
  795.     int i,j;
  796.     copper_texture();
  797.     for (i=0;i<10;i++)
  798.     {
  799. for (j=0;j<10;j++)
  800. {
  801.     if (board[i][j]&16 || !(board[i][j]&15))
  802. continue;
  803.     do_piece(board[i][j]&15, i, j, &stunt[i][j], &cycle[i][j], WIT);
  804. }
  805.     }
  806.     if ((piece&16) == WIT && piece > 0)
  807.     {
  808. glPushMatrix();
  809. glTranslatef(0.0, 0.2, 0.0);
  810. do_piece(piece&15, CX1, CY1, &stuntm, &cyclem, WIT);
  811. glPopMatrix();
  812.     }
  813.     if ((piece2&16) == WIT && piece2 > 0)
  814. do_piece(piece2&15, CX2, CY1, &stunt2, &cycle2, WIT);
  815.     dark_texture();
  816.     for (i=0;i<10;i++)
  817.     {
  818. for (j=0;j<10;j++)
  819. {
  820.     if (!(board[i][j]&16) || !board[i][j])
  821. continue;
  822.     do_piece(board[i][j]&15, i, j, &stunt[i][j], &cycle[i][j], ZWART);
  823. }
  824.     }
  825.     if ((piece&16) == ZWART && piece > 0)
  826.     {
  827. glPushMatrix();
  828. glTranslatef(0.0, 0.2, 0.0);
  829. do_piece(piece&15, CX1, CY1, &stuntm, &cyclem, ZWART);
  830. glPopMatrix();
  831.     }
  832.     if ((piece2&16) == ZWART && piece2 > 0)
  833. do_piece(piece2&15, CX2, CY2, &stunt2, &cycle2, ZWART);
  834. }
  835. void do_display(void)
  836. {
  837.     glDisable(GL_DEPTH_TEST);
  838.     /* glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); */
  839.     if (reflection) {
  840.       glEnable(GL_STENCIL_TEST);
  841.       glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  842.       glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
  843.     }
  844.     do_vlakje();
  845.     glEnable(GL_DEPTH_TEST);
  846.     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  847.     if (reflection)
  848.     {
  849. glStencilFunc(GL_EQUAL, 1, 0xffffffff);
  850. glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  851. glPushMatrix();
  852. glScalef(1.0, -1.0, 1.0);
  853. glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  854. glClipPlane(GL_CLIP_PLANE1, ClipPlane);
  855. glEnable(GL_CLIP_PLANE1);
  856. do_pieces();
  857. glPopMatrix();
  858. glDisable(GL_CLIP_PLANE1);
  859.         glDisable(GL_STENCIL_TEST);
  860. glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  861.     }
  862. /*
  863.  * Also without texturing I want to blend, to keep the contrast of the board
  864.  * consistent.
  865.  */
  866.     glEnable(GL_BLEND);
  867.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  868.     do_board();
  869.     glDisable(GL_BLEND);
  870.     do_border();
  871.     glClipPlane(GL_CLIP_PLANE1, ClipPlane);
  872.     glEnable(GL_CLIP_PLANE1);
  873.     do_pieces();
  874.     glDisable(GL_CLIP_PLANE1);
  875. }