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

GIS编程

开发平台:

Visual C++

  1. /****************************************************************************
  2. Copyright 1995 by Silicon Graphics Incorporated, Mountain View, California.
  3.                         All Rights Reserved
  4. Permission to use, copy, modify, and distribute this software and its 
  5. documentation for any purpose and without fee is hereby granted, 
  6. provided that the above copyright notice appear in all copies and that
  7. both that copyright notice and this permission notice appear in 
  8. supporting documentation, and that the name of Silicon Graphics not be
  9. used in advertising or publicity pertaining to distribution of the
  10. software without specific, written prior permission.  
  11. SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  12. INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  13. EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  14. CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
  15. USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  16. OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. PERFORMANCE OF THIS SOFTWARE.
  18. ****************************************************************************/
  19. /**
  20.  * Derived from code written by Kurt Akeley, November 1992
  21.  *
  22.  * Uses PolygonOffset to draw hidden-line images.  PolygonOffset
  23.  *     shifts the z values of polygons an amount that is
  24.  *     proportional to their slope in screen z.  This keeps
  25.  *     the lines, which are drawn without displacement, from
  26.  *     interacting with their respective polygons, and
  27.  *     thus eliminates line dropouts.
  28.  *
  29.  * The left image shows an ordinary antialiased wireframe image.
  30.  * The center image shows an antialiased hidden-line image without
  31.  *     PolygonOffset.
  32.  * The right image shows an antialiased hidden-line image using
  33.  *     PolygonOffset to reduce artifacts.
  34.  *
  35.  * Drag with a mouse button pressed to rotate the models.
  36.  * Press the escape key to exit.
  37.  */
  38. /*
  39.  * Modified for OpenGL 1.1 glPolygonOffset() conventions
  40.  */
  41. /* Conversion to GLUT by Mark J. Kilgard */
  42. #include <GL/glut.h>
  43. #include <stdlib.h>
  44. #include <stdio.h>
  45. #include <string.h>
  46. #ifndef EXIT_FAILURE
  47. #define EXIT_FAILURE    1
  48. #endif
  49. #ifndef EXIT_SUCCESS
  50. #define EXIT_SUCCESS    0
  51. #endif
  52. #define MAXQUAD 6
  53. typedef float Vertex[3];
  54. typedef Vertex Quad[4];
  55. /* data to define the six faces of a unit cube */
  56. Quad quads[MAXQUAD] =
  57. {
  58.   { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0 },
  59.   { 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1 },
  60.   { 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1 },
  61.   { 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1 },
  62.   { 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0 },
  63.   { 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0 }
  64. };
  65. static int deltax = 90, deltay = 40;
  66. static int prevx, prevy;
  67. #define WIREFRAME 0
  68. #define HIDDEN_LINE 1
  69. static void error(const char *prog, const char *msg);
  70. static void cubes(int mx, int my, int mode);
  71. static void fill(Quad quad);
  72. static void outline(Quad quad);
  73. static void draw_hidden(Quad quad, int mode);
  74. static void draw_scene(void);
  75. static int dimension = 3;
  76. #define MODE_11   0 /* OpenGL 1.1 */
  77. #define MODE_EXT  1 /* Polygon offset extension */
  78. #define MODE_NONE 2 /* No polygon offset support */
  79. static int version;
  80. int
  81. supportsOneDotOne(void)
  82. {
  83.   const char *version;
  84.   int major, minor;
  85.   version = (char *) glGetString(GL_VERSION);
  86.   if (sscanf(version, "%d.%d", &major, &minor) == 2)
  87.     return major >= 1 && minor >= 1;
  88.   return 0;            /* OpenGL version string malformed! */
  89. }
  90. int
  91. main(int argc, char **argv)
  92. {
  93.   glutInit(&argc, argv);
  94.   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  95.   glutCreateWindow("offset");
  96.   glutDisplayFunc(draw_scene);
  97. #ifdef GL_VERSION_1_1
  98.   if (supportsOneDotOne()) {
  99.     glPolygonOffset(2.0, 1);
  100.     version = MODE_11;
  101.   } else
  102. #endif
  103.   {
  104. #ifdef GL_EXT_polygon_offset
  105.   /* check for the polygon offset extension */
  106.   if (glutExtensionSupported("GL_EXT_polygon_offset")) {
  107.     glPolygonOffsetEXT(0.75, 0.00);
  108.     version = MODE_EXT;
  109.   } else 
  110. #endif
  111.     {
  112.       error(argv[0], "Warning: running with out the polygon offset extension.n");
  113.       version = MODE_NONE;
  114.     }
  115.   }
  116.   /* set up viewing parameters */
  117.   glMatrixMode(GL_PROJECTION);
  118.   gluPerspective(20, 1, 0.1, 20);
  119.   glMatrixMode(GL_MODELVIEW);
  120.   glTranslatef(0, 0, -15);
  121.   /* set other relevant state information */
  122.   glEnable(GL_DEPTH_TEST);
  123.   glShadeModel(GL_FLAT);
  124.   glDisable(GL_DITHER);
  125.   glutMainLoop();
  126.   return 0;             /* ANSI C requires main to return int. */
  127. }
  128. static void
  129. draw_scene(void)
  130. {
  131.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  132.   glPushMatrix();
  133.   glTranslatef(-1.7, 0.0, 0.0);
  134.   cubes(deltax, deltay, WIREFRAME);
  135.   glPopMatrix();
  136.   glPushMatrix();
  137.   cubes(deltax, deltay, HIDDEN_LINE);
  138.   glPopMatrix();
  139.   glPushMatrix();
  140.   glTranslatef(1.7, 0.0, 0.0);
  141.   switch(version) {
  142. #ifdef GL_VERSION_1_1
  143.   case MODE_11:
  144.     glEnable(GL_POLYGON_OFFSET_FILL);
  145.     break;
  146. #endif
  147. #ifdef GL_EXT_polygon_offset
  148.   case MODE_EXT:
  149.     glEnable(GL_POLYGON_OFFSET_EXT);
  150.     break;
  151. #endif
  152.   }
  153.   cubes(deltax, deltay, HIDDEN_LINE);
  154.   switch(version) {
  155. #ifdef GL_VERSION_1_1
  156.   case MODE_11:
  157.     glDisable(GL_POLYGON_OFFSET_FILL);
  158.     break;
  159. #endif
  160. #ifdef GL_EXT_polygon_offset
  161.   case MODE_EXT:
  162.     glDisable(GL_POLYGON_OFFSET_EXT);
  163.     break;
  164. #endif
  165.   }
  166.   glPopMatrix();
  167.   glutSwapBuffers();
  168. }
  169. static void
  170. cubes(int mx, int my, int mode)
  171. {
  172.   int x, y, z, i;
  173.   /* track the mouse */
  174.   glRotatef(mx / 2.0, 0, 1, 0);
  175.   glRotatef(my / 2.0, 1, 0, 0);
  176.   /* draw the lines as hidden polygons */
  177.   glTranslatef(-0.5, -0.5, -0.5);
  178.   glScalef(1.0 / dimension, 1.0 / dimension, 1.0 / dimension);
  179.   for (z = 0; z < dimension; z++) {
  180.     for (y = 0; y < dimension; y++) {
  181.       for (x = 0; x < dimension; x++) {
  182.         glPushMatrix();
  183.         glTranslatef(x, y, z);
  184.         glScalef(0.8, 0.8, 0.8);
  185.         for (i = 0; i < MAXQUAD; i++)
  186.           draw_hidden(quads[i], mode);
  187.         glPopMatrix();
  188.       }
  189.     }
  190.   }
  191. }
  192. static void
  193. fill(Quad quad)
  194. {
  195.   /* draw a filled polygon */
  196.   glBegin(GL_QUADS);
  197.   glVertex3fv(quad[0]);
  198.   glVertex3fv(quad[1]);
  199.   glVertex3fv(quad[2]);
  200.   glVertex3fv(quad[3]);
  201.   glEnd();
  202. }
  203. static void
  204. outline(Quad quad)
  205. {
  206.   /* draw an outlined polygon */
  207.   glBegin(GL_LINE_LOOP);
  208.   glVertex3fv(quad[0]);
  209.   glVertex3fv(quad[1]);
  210.   glVertex3fv(quad[2]);
  211.   glVertex3fv(quad[3]);
  212.   glEnd();
  213. }
  214. static void
  215. draw_hidden(Quad quad, int mode)
  216. {
  217.   /* draw the outline using white, optionally fill the interior 
  218.      with black */
  219.   glColor3f(1, 1, 1);
  220.   outline(quad);
  221.   if (mode == HIDDEN_LINE) {
  222.     glColor3f(0, 0, 0);
  223.     fill(quad);
  224.   }
  225. }
  226. /* ARGSUSED1 */
  227. void
  228. keyboard(unsigned char key, int x, int y)
  229. {
  230.   if (key == 27) exit(EXIT_SUCCESS);
  231. }
  232. /* ARGSUSED */
  233. void
  234. button(int which, int state, int x, int y)
  235. {
  236.   if(state == GLUT_DOWN) {
  237.       prevx = x;
  238.       prevy = y;
  239.   }
  240. }
  241. void
  242. motion(int x, int y)
  243. {
  244.   deltax += (x - prevx);
  245.   prevx = x;
  246.   deltay += (y - prevy);
  247.   prevy = y;
  248.   glutPostRedisplay();
  249. }
  250. static void
  251. error(const char *prog, const char *msg)
  252. {
  253.   fprintf(stderr, "%s: %sn", prog, msg);
  254. }