Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. /*
  2. * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3. *
  4. * Permission to use, copy, modify, distribute, and sell this software and
  5. * its documentation for any purpose is hereby granted without fee, provided
  6. * that (i) the above copyright notices and this permission notice appear in
  7. * all copies of the software and related documentation, and (ii) the name of
  8. * Silicon Graphics may not be used in any advertising or
  9. * publicity relating to the software without the specific, prior written
  10. * permission of Silicon Graphics.
  11. *
  12. * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13. * ANY KIND,
  14. * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15. * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16. *
  17. * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18. * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19. * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20. * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21. * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22. * OF THIS SOFTWARE.
  23. */
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <stdlib.h>
  27. #include <GL/glut.h>
  28. #ifndef CALLBACK
  29. #define CALLBACK
  30. #endif
  31. #define PI 3.141592654
  32. #define BLACK 0
  33. #define GRAY 128
  34. #define WHITE 255
  35. #define RD 0xA4,0x00,0x00,0xFF
  36. #define WT 0xFF,0xFF,0xFF,0xFF
  37. #define brickImageWidth 16
  38. #define brickImageHeight 16
  39. #include "loadppm.c"
  40. GLenum rgb, doubleBuffer;
  41. #include "tkmap.c"
  42. float black[3] = {
  43. 0.0, 0.0, 0.0
  44. };
  45. float blue[3] = {
  46. 0.0, 0.0, 1.0
  47. };
  48. float gray[3] = {
  49. 0.5, 0.5, 0.5
  50. };
  51. float white[3] = {
  52. 1.0, 1.0, 1.0
  53. };
  54. GLenum doDither = GL_TRUE;
  55. GLenum shade = GL_TRUE;
  56. GLenum texture = GL_TRUE;
  57. float xRotation = 30.0, yRotation = 30.0, zRotation = 0.0;
  58. GLint radius1, radius2;
  59. GLdouble angle1, angle2;
  60. GLint slices, stacks;
  61. GLint height;
  62. GLint orientation = GLU_OUTSIDE;
  63. GLint whichQuadric=0;
  64. GLUquadricObj *quadObj;
  65. GLubyte brickImage[4*brickImageWidth*brickImageHeight] = {
  66. RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  67. RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  68. RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  69. RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  70. WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  71. RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  72. RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  73. RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  74. RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  75. WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  76. RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  77. RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  78. RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  79. RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  80. WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  81. RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
  82. };
  83. char *texFileName = 0;
  84. static void CALLBACK ErrorHandler(GLenum which)
  85. {
  86. fprintf(stderr, "Quad Error: %s\n", (char *) gluErrorString(which));
  87. }
  88. typedef void (GLAPIENTRY *callback_t)();
  89. static void Init(void)
  90. {
  91. static GLint colorIndexes[3] = {0, 200, 255};
  92. static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  93. static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  94. static float position[] = {90.0, 90.0, 150.0, 0.0};
  95. static float front_mat_shininess[] = {30.0};
  96. static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  97. static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  98. static float back_mat_shininess[] = {50.0};
  99. static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  100. static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  101. static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  102. static float lmodel_twoside[] = {GL_TRUE};
  103. static float decal[] = {GL_DECAL};
  104. static float repeat[] = {GL_REPEAT};
  105. static float nearest[] = {GL_NEAREST};
  106. static PPMImage *image;
  107. if (!rgb) {
  108. SetGreyRamp();
  109. }
  110. glClearColor(0.0, 0.0, 0.0, 0.0);
  111. glEnable(GL_DEPTH_TEST);
  112. glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  113. glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  114. glLightfv(GL_LIGHT0, GL_POSITION, position);
  115. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  116. glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  117. glEnable(GL_LIGHTING);
  118. glEnable(GL_LIGHT0);
  119. glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  120. glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  121. glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  122. glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  123. glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  124. glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  125. if (!rgb) {
  126. glMaterialiv( GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
  127. }
  128. glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  129. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  130. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  131. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  132. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  133. if (texFileName) {
  134. image = LoadPPM(texFileName);
  135. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  136. gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY,
  137. GL_RGB, GL_UNSIGNED_BYTE, image->data);
  138. } else {
  139. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  140. glTexImage2D(GL_TEXTURE_2D, 0, 4, brickImageWidth, brickImageHeight,
  141. 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)brickImage);
  142. }
  143. quadObj = gluNewQuadric();
  144. gluQuadricCallback(quadObj, GLU_ERROR, (callback_t) ErrorHandler);
  145. radius1 = 10;
  146. radius2 = 5;
  147. angle1 = 90;
  148. angle2 = 180;
  149. slices = 16;
  150. stacks = 10;
  151. height = 20;
  152. }
  153. static void Reshape(int width, int height)
  154. {
  155. glViewport(0, 0, (GLint)width, (GLint)height);
  156. glMatrixMode(GL_PROJECTION);
  157. glLoadIdentity();
  158. glFrustum(-1, 1, -1, 1, 1, 10);
  159. gluLookAt(2, 2, 2, 0, 0, 0, 0, 0, 1);
  160. glMatrixMode(GL_MODELVIEW);
  161. }
  162. static void Key2(int key, int x, int y)
  163. {
  164. switch (key) {
  165. case GLUT_KEY_LEFT:
  166. yRotation += 5;
  167. break;
  168. case GLUT_KEY_RIGHT:
  169. yRotation -= 5;
  170. break;
  171. case GLUT_KEY_UP:
  172. xRotation += 5;
  173. break;
  174. case GLUT_KEY_DOWN:
  175. xRotation -= 5;
  176. break;
  177. default:
  178. return;
  179. }
  180. glutPostRedisplay();
  181. }
  182. static void Key(unsigned char key, int x, int y)
  183. {
  184. switch (key) {
  185. case 27:
  186. exit(1);
  187. case 'X':
  188. zRotation += 5;
  189. break;
  190. case 'x':
  191. zRotation -= 5;
  192. break;
  193. case '1':
  194. gluQuadricDrawStyle(quadObj, GLU_FILL);
  195. break;
  196. case '2':
  197. gluQuadricDrawStyle(quadObj, GLU_POINT);
  198. break;
  199. case '3':
  200. gluQuadricDrawStyle(quadObj, GLU_LINE);
  201. break;
  202. case '4':
  203. gluQuadricDrawStyle(quadObj, GLU_SILHOUETTE);
  204. break;
  205. case '0':
  206. shade = !shade;
  207. if (shade) {
  208. glShadeModel(GL_SMOOTH);
  209. gluQuadricNormals(quadObj, GLU_SMOOTH);
  210. } else {
  211. glShadeModel(GL_FLAT);
  212. gluQuadricNormals(quadObj, GLU_FLAT);
  213. }
  214. break;
  215. case 'A':
  216. stacks++;
  217. break;
  218. case 'a':
  219. stacks--;
  220. break;
  221. case 'S':
  222. slices++;
  223. break;
  224. case 's':
  225. slices--;
  226. break;
  227. case 'd':
  228. switch(orientation) {
  229. case GLU_OUTSIDE:
  230. orientation = GLU_INSIDE;
  231. break;
  232. case GLU_INSIDE:
  233. default:
  234. orientation = GLU_OUTSIDE;
  235. break;
  236. }
  237. gluQuadricOrientation(quadObj, orientation);
  238. break;
  239. case 'f':
  240. whichQuadric = (whichQuadric + 1) % 4;
  241. break;
  242. case 'G':
  243. radius1 += 1;
  244. break;
  245. case 'g':
  246. radius1 -= 1;
  247. break;
  248. case 'J':
  249. radius2 += 1;
  250. break;
  251. case 'j':
  252. radius2 -= 1;
  253. break;
  254. case 'H':
  255. height += 2;
  256. break;
  257. case 'h':
  258. height -= 2;
  259. break;
  260. case 'K':
  261. angle1 += 5;
  262. break;
  263. case 'k':
  264. angle1 -= 5;
  265. break;
  266. case 'L':
  267. angle2 += 5;
  268. break;
  269. case 'l':
  270. angle2 -= 5;
  271. break;
  272. case 'z':
  273. texture = !texture;
  274. if (texture) {
  275. gluQuadricTexture(quadObj, GL_TRUE);
  276. glEnable(GL_TEXTURE_2D);
  277. } else {
  278. gluQuadricTexture(quadObj, GL_FALSE);
  279. glDisable(GL_TEXTURE_2D);
  280. }
  281. break;
  282. case 'q':
  283. glDisable(GL_CULL_FACE);
  284. break;
  285. case 'w':
  286. glEnable(GL_CULL_FACE);
  287. glCullFace(GL_FRONT);
  288. break;
  289. case 'e':
  290. glEnable(GL_CULL_FACE);
  291. glCullFace(GL_BACK);
  292. break;
  293. case 'r':
  294. glFrontFace(GL_CW);
  295. break;
  296. case 't':
  297. glFrontFace(GL_CCW);
  298. break;
  299. case 'y':
  300. doDither = !doDither;
  301. (doDither) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  302. break;
  303. default:
  304. return;
  305. }
  306. glutPostRedisplay();
  307. }
  308. static void Draw(void)
  309. {
  310. glLoadIdentity();
  311. glRotatef(xRotation, 1, 0, 0);
  312. glRotatef(yRotation, 0, 1, 0);
  313. glRotatef(zRotation, 0, 0, 1);
  314. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  315. glColor3f(1.0, 1.0, 1.0);
  316. switch (whichQuadric) {
  317. case 0:
  318. glTranslatef(0, 0, -height/20.0);
  319. gluCylinder(quadObj, radius1/10.0, radius2/10.0, height/10.0,
  320. slices, stacks);
  321. break;
  322. case 1:
  323. gluSphere(quadObj, radius1/10.0, slices, stacks);
  324. break;
  325. case 2:
  326. gluPartialDisk(quadObj, radius2/10.0, radius1/10.0, slices,
  327. stacks, angle1, angle2);
  328. break;
  329. case 3:
  330. gluDisk(quadObj, radius2/10.0, radius1/10.0, slices, stacks);
  331. break;
  332. }
  333. glFlush();
  334. if (doubleBuffer) {
  335. glutSwapBuffers();
  336. }
  337. }
  338. static GLenum Args(int argc, char **argv)
  339. {
  340. GLint i;
  341. rgb = GL_TRUE;
  342. doubleBuffer = GL_FALSE;
  343. for (i = 1; i < argc; i++) {
  344. if (strcmp(argv[i], "-ci") == 0) {
  345. rgb = GL_FALSE;
  346. } else if (strcmp(argv[i], "-rgb") == 0) {
  347. rgb = GL_TRUE;
  348. } else if (strcmp(argv[i], "-sb") == 0) {
  349. doubleBuffer = GL_FALSE;
  350. } else if (strcmp(argv[i], "-db") == 0) {
  351. doubleBuffer = GL_TRUE;
  352. } else if (strcmp(argv[i], "-f") == 0) {
  353. if (i+1 >= argc || argv[i+1][0] == '-') {
  354. printf("-f (No file name).\n");
  355. return GL_FALSE;
  356. } else {
  357. texFileName = argv[++i];
  358. }
  359. } else {
  360. printf("%s (Bad option).\n", argv[i]);
  361. return GL_FALSE;
  362. }
  363. }
  364. return GL_TRUE;
  365. }
  366. int main(int argc, char **argv)
  367. {
  368. GLenum type;
  369. glutInit(&argc, argv);
  370. if (Args(argc, argv) == GL_FALSE) {
  371. exit(1);
  372. }
  373. glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
  374. type = GLUT_DEPTH;
  375. type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
  376. type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  377. glutInitDisplayMode(type);
  378. if (glutCreateWindow("Quad Test") == GL_FALSE) {
  379. exit(1);
  380. }
  381. InitMap();
  382. Init();
  383. glutReshapeFunc(Reshape);
  384. glutKeyboardFunc(Key);
  385. glutSpecialFunc(Key2);
  386. glutDisplayFunc(Draw);
  387. glutMainLoop();
  388. return 0;
  389. }