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.

quad.c 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  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", gluErrorString(which));
  87. }
  88. static void Init(void)
  89. {
  90. static GLint colorIndexes[3] = {0, 200, 255};
  91. static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  92. static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  93. static float position[] = {90.0, 90.0, 150.0, 0.0};
  94. static float front_mat_shininess[] = {30.0};
  95. static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  96. static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  97. static float back_mat_shininess[] = {50.0};
  98. static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  99. static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  100. static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  101. static float lmodel_twoside[] = {GL_TRUE};
  102. static float decal[] = {GL_DECAL};
  103. static float repeat[] = {GL_REPEAT};
  104. static float nearest[] = {GL_NEAREST};
  105. static PPMImage *image;
  106. if (!rgb) {
  107. SetGreyRamp();
  108. }
  109. glClearColor(0.0, 0.0, 0.0, 0.0);
  110. glEnable(GL_DEPTH_TEST);
  111. glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  112. glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  113. glLightfv(GL_LIGHT0, GL_POSITION, position);
  114. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  115. glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  116. glEnable(GL_LIGHTING);
  117. glEnable(GL_LIGHT0);
  118. glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  119. glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  120. glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  121. glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  122. glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  123. glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  124. if (!rgb) {
  125. glMaterialiv( GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
  126. }
  127. glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  128. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  129. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  130. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  131. glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  132. if (texFileName) {
  133. image = LoadPPM(texFileName);
  134. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  135. gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY,
  136. GL_RGB, GL_UNSIGNED_BYTE, image->data);
  137. } else {
  138. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  139. glTexImage2D(GL_TEXTURE_2D, 0, 4, brickImageWidth, brickImageHeight,
  140. 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)brickImage);
  141. }
  142. quadObj = gluNewQuadric();
  143. gluQuadricCallback(quadObj, GLU_ERROR, ErrorHandler);
  144. radius1 = 10;
  145. radius2 = 5;
  146. angle1 = 90;
  147. angle2 = 180;
  148. slices = 16;
  149. stacks = 10;
  150. height = 20;
  151. }
  152. static void Reshape(int width, int height)
  153. {
  154. glViewport(0, 0, (GLint)width, (GLint)height);
  155. glMatrixMode(GL_PROJECTION);
  156. glLoadIdentity();
  157. glFrustum(-1, 1, -1, 1, 1, 10);
  158. gluLookAt(2, 2, 2, 0, 0, 0, 0, 0, 1);
  159. glMatrixMode(GL_MODELVIEW);
  160. }
  161. static void Key2(int key, int x, int y)
  162. {
  163. switch (key) {
  164. case GLUT_KEY_LEFT:
  165. yRotation += 5;
  166. break;
  167. case GLUT_KEY_RIGHT:
  168. yRotation -= 5;
  169. break;
  170. case GLUT_KEY_UP:
  171. xRotation += 5;
  172. break;
  173. case GLUT_KEY_DOWN:
  174. xRotation -= 5;
  175. break;
  176. default:
  177. return;
  178. }
  179. glutPostRedisplay();
  180. }
  181. static void Key(unsigned char key, int x, int y)
  182. {
  183. switch (key) {
  184. case 27:
  185. exit(1);
  186. case 'X':
  187. zRotation += 5;
  188. break;
  189. case 'x':
  190. zRotation -= 5;
  191. break;
  192. case '1':
  193. gluQuadricDrawStyle(quadObj, GLU_FILL);
  194. break;
  195. case '2':
  196. gluQuadricDrawStyle(quadObj, GLU_POINT);
  197. break;
  198. case '3':
  199. gluQuadricDrawStyle(quadObj, GLU_LINE);
  200. break;
  201. case '4':
  202. gluQuadricDrawStyle(quadObj, GLU_SILHOUETTE);
  203. break;
  204. case '0':
  205. shade = !shade;
  206. if (shade) {
  207. glShadeModel(GL_SMOOTH);
  208. gluQuadricNormals(quadObj, GLU_SMOOTH);
  209. } else {
  210. glShadeModel(GL_FLAT);
  211. gluQuadricNormals(quadObj, GLU_FLAT);
  212. }
  213. break;
  214. case 'A':
  215. stacks++;
  216. break;
  217. case 'a':
  218. stacks--;
  219. break;
  220. case 'S':
  221. slices++;
  222. break;
  223. case 's':
  224. slices--;
  225. break;
  226. case 'd':
  227. switch(orientation) {
  228. case GLU_OUTSIDE:
  229. orientation = GLU_INSIDE;
  230. break;
  231. case GLU_INSIDE:
  232. default:
  233. orientation = GLU_OUTSIDE;
  234. break;
  235. }
  236. gluQuadricOrientation(quadObj, orientation);
  237. break;
  238. case 'f':
  239. whichQuadric = (whichQuadric + 1) % 4;
  240. break;
  241. case 'G':
  242. radius1 += 1;
  243. break;
  244. case 'g':
  245. radius1 -= 1;
  246. break;
  247. case 'J':
  248. radius2 += 1;
  249. break;
  250. case 'j':
  251. radius2 -= 1;
  252. break;
  253. case 'H':
  254. height += 2;
  255. break;
  256. case 'h':
  257. height -= 2;
  258. break;
  259. case 'K':
  260. angle1 += 5;
  261. break;
  262. case 'k':
  263. angle1 -= 5;
  264. break;
  265. case 'L':
  266. angle2 += 5;
  267. break;
  268. case 'l':
  269. angle2 -= 5;
  270. break;
  271. case 'z':
  272. texture = !texture;
  273. if (texture) {
  274. gluQuadricTexture(quadObj, GL_TRUE);
  275. glEnable(GL_TEXTURE_2D);
  276. } else {
  277. gluQuadricTexture(quadObj, GL_FALSE);
  278. glDisable(GL_TEXTURE_2D);
  279. }
  280. break;
  281. case 'q':
  282. glDisable(GL_CULL_FACE);
  283. break;
  284. case 'w':
  285. glEnable(GL_CULL_FACE);
  286. glCullFace(GL_FRONT);
  287. break;
  288. case 'e':
  289. glEnable(GL_CULL_FACE);
  290. glCullFace(GL_BACK);
  291. break;
  292. case 'r':
  293. glFrontFace(GL_CW);
  294. break;
  295. case 't':
  296. glFrontFace(GL_CCW);
  297. break;
  298. case 'y':
  299. doDither = !doDither;
  300. (doDither) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  301. break;
  302. default:
  303. return;
  304. }
  305. glutPostRedisplay();
  306. }
  307. static void Draw(void)
  308. {
  309. glLoadIdentity();
  310. glRotatef(xRotation, 1, 0, 0);
  311. glRotatef(yRotation, 0, 1, 0);
  312. glRotatef(zRotation, 0, 0, 1);
  313. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  314. glColor3f(1.0, 1.0, 1.0);
  315. switch (whichQuadric) {
  316. case 0:
  317. glTranslatef(0, 0, -height/20.0);
  318. gluCylinder(quadObj, radius1/10.0, radius2/10.0, height/10.0,
  319. slices, stacks);
  320. break;
  321. case 1:
  322. gluSphere(quadObj, radius1/10.0, slices, stacks);
  323. break;
  324. case 2:
  325. gluPartialDisk(quadObj, radius2/10.0, radius1/10.0, slices,
  326. stacks, angle1, angle2);
  327. break;
  328. case 3:
  329. gluDisk(quadObj, radius2/10.0, radius1/10.0, slices, stacks);
  330. break;
  331. }
  332. glFlush();
  333. if (doubleBuffer) {
  334. glutSwapBuffers();
  335. }
  336. }
  337. static GLenum Args(int argc, char **argv)
  338. {
  339. GLint i;
  340. rgb = GL_TRUE;
  341. doubleBuffer = GL_FALSE;
  342. for (i = 1; i < argc; i++) {
  343. if (strcmp(argv[i], "-ci") == 0) {
  344. rgb = GL_FALSE;
  345. } else if (strcmp(argv[i], "-rgb") == 0) {
  346. rgb = GL_TRUE;
  347. } else if (strcmp(argv[i], "-sb") == 0) {
  348. doubleBuffer = GL_FALSE;
  349. } else if (strcmp(argv[i], "-db") == 0) {
  350. doubleBuffer = GL_TRUE;
  351. } else if (strcmp(argv[i], "-f") == 0) {
  352. if (i+1 >= argc || argv[i+1][0] == '-') {
  353. printf("-f (No file name).\n");
  354. return GL_FALSE;
  355. } else {
  356. texFileName = argv[++i];
  357. }
  358. } else {
  359. printf("%s (Bad option).\n", argv[i]);
  360. return GL_FALSE;
  361. }
  362. }
  363. return GL_TRUE;
  364. }
  365. int main(int argc, char **argv)
  366. {
  367. GLenum type;
  368. glutInit(&argc, argv);
  369. if (Args(argc, argv) == GL_FALSE) {
  370. exit(1);
  371. }
  372. glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
  373. type = GLUT_DEPTH;
  374. type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
  375. type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  376. glutInitDisplayMode(type);
  377. if (glutCreateWindow("Quad Test") == GL_FALSE) {
  378. exit(1);
  379. }
  380. InitMap();
  381. Init();
  382. glutReshapeFunc(Reshape);
  383. glutKeyboardFunc(Key);
  384. glutSpecialFunc(Key2);
  385. glutDisplayFunc(Draw);
  386. glutMainLoop();
  387. return 0;
  388. }