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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /**
  3.  * (c) Copyright 1993, Silicon Graphics, Inc.
  4.  * ALL RIGHTS RESERVED 
  5.  * Permission to use, copy, modify, and distribute this software for 
  6.  * any purpose and without fee is hereby granted, provided that the above
  7.  * copyright notice appear in all copies and that both the copyright notice
  8.  * and this permission notice appear in supporting documentation, and that 
  9.  * the name of Silicon Graphics, Inc. not be used in advertising
  10.  * or publicity pertaining to distribution of the software without specific,
  11.  * written prior permission. 
  12.  *
  13.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  14.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  16.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  17.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  18.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  19.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  20.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  21.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  22.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  23.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  24.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  25.  * 
  26.  * US Government Users Restricted Rights 
  27.  * Use, duplication, or disclosure by the Government is subject to
  28.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  29.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  30.  * clause at DFARS 252.227-7013 and/or in similar or successor
  31.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  32.  * Unpublished-- rights reserved under the copyright laws of the
  33.  * United States.  Contractor/manufacturer is Silicon Graphics,
  34.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  35.  *
  36.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  37.  */
  38. #include <stdio.h>
  39. #include <string.h>
  40. #include <stdlib.h>
  41. #include <GL/glut.h>
  42. GLenum doubleBuffer;
  43. double plane[4] = {
  44.   1.0, 0.0, -1.0, 0.0
  45. };
  46. float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
  47. float fogDensity = 0.02;
  48. GLint cubeList = 1;
  49. float scp[18][3] = {
  50.   {1.000000, 0.000000, 0.000000},
  51.   {1.000000, 0.000000, 5.000000},
  52.   {0.707107, 0.707107, 0.000000},
  53.   {0.707107, 0.707107, 5.000000},
  54.   {0.000000, 1.000000, 0.000000},
  55.   {0.000000, 1.000000, 5.000000},
  56.   {-0.707107, 0.707107, 0.000000},
  57.   {-0.707107, 0.707107, 5.000000},
  58.   {-1.000000, 0.000000, 0.000000},
  59.   {-1.000000, 0.000000, 5.000000},
  60.   {-0.707107, -0.707107, 0.000000},
  61.   {-0.707107, -0.707107, 5.000000},
  62.   {0.000000, -1.000000, 0.000000},
  63.   {0.000000, -1.000000, 5.000000},
  64.   {0.707107, -0.707107, 0.000000},
  65.   {0.707107, -0.707107, 5.000000},
  66.   {1.000000, 0.000000, 0.000000},
  67.   {1.000000, 0.000000, 5.000000},
  68. };
  69. static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  70. static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
  71. static float position[] = {90.0, 90.0, 0.0, 0.0};
  72. static float front_mat_shininess[] = {30.0};
  73. static float front_mat_specular[] = {0.0, 0.0, 0.0, 1.0};
  74. static float front_mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
  75. static float back_mat_shininess[] = {50.0};
  76. static float back_mat_specular[] = {0.0, 0.0, 1.0, 1.0};
  77. static float back_mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
  78. static float lmodel_ambient[] = {0.0, 0.0, 0.0, 1.0};
  79. static float fog_color[] = {0.8, 0.8, 0.8, 1.0};
  80. /* ARGSUSED1 */
  81. static void
  82.   Key(unsigned char key, int x, int y)
  83. {
  84.   switch (key) {
  85.   case 'd':
  86.     fogDensity *= 1.10;
  87.     glFogf(GL_FOG_DENSITY, fogDensity);
  88.     glutPostRedisplay();
  89.     break;
  90.   case 'D':
  91.     fogDensity /= 1.10;
  92.     glFogf(GL_FOG_DENSITY, fogDensity);
  93.     glutPostRedisplay();
  94.     break;
  95.   case 27:
  96.     exit(0);
  97.   }
  98. }
  99. /* ARGSUSED1 */
  100. static void
  101.   SpecialKey(int key, int x, int y)
  102. {
  103.   switch (key) {
  104.   case GLUT_KEY_UP:
  105.     rotX -= 5;
  106.     glutPostRedisplay();
  107.     break;
  108.   case GLUT_KEY_DOWN:
  109.     rotX += 5;
  110.     glutPostRedisplay();
  111.     break;
  112.   case GLUT_KEY_LEFT:
  113.     rotY -= 5;
  114.     glutPostRedisplay();
  115.     break;
  116.   case GLUT_KEY_RIGHT:
  117.     rotY += 5;
  118.     glutPostRedisplay();
  119.     break;
  120.   }
  121. }
  122. static void
  123.   Draw(void)
  124. {
  125.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  126.   glPushMatrix();
  127.   glTranslatef(0, 0, zTranslate);
  128.   /* XXX hooky dual axis rotation! */
  129.   glRotatef(rotY, 0, 1, 0);
  130.   glRotatef(rotX, 1, 0, 0);
  131.   glScalef(1.0, 1.0, 10.0);
  132.   glCallList(cubeList);
  133.   glPopMatrix();
  134.   if (doubleBuffer) {
  135.     glutSwapBuffers();
  136.   } else {
  137.     glFlush();
  138.   }
  139. }
  140. static void
  141.   Args(int argc, char **argv)
  142. {
  143.   GLint i;
  144.   doubleBuffer = GL_TRUE;
  145.   for (i = 1; i < argc; i++) {
  146.     if (strcmp(argv[i], "-sb") == 0) {
  147.       doubleBuffer = GL_FALSE;
  148.     } else if (strcmp(argv[i], "-db") == 0) {
  149.       doubleBuffer = GL_TRUE;
  150.     }
  151.   }
  152. }
  153. int
  154.   main(int argc, char **argv)
  155. {
  156.   GLenum type;
  157.   glutInit(&argc, argv);
  158.   Args(argc, argv);
  159.   type = GLUT_RGB | GLUT_DEPTH;
  160.   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  161.   glutInitDisplayMode(type);
  162.   glutInitWindowSize(300, 300);
  163.   glutCreateWindow("Fog Test");
  164.   glFrontFace(GL_CW);
  165.   glEnable(GL_DEPTH_TEST);
  166.   glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  167.   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  168.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  169.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  170.   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  171.   glEnable(GL_LIGHTING);
  172.   glEnable(GL_LIGHT0);
  173.   glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  174.   glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  175.   glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  176.   glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  177.   glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  178.   glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  179.   glEnable(GL_FOG);
  180.   glFogi(GL_FOG_MODE, GL_EXP);
  181.   glFogf(GL_FOG_DENSITY, fogDensity);
  182.   glFogfv(GL_FOG_COLOR, fog_color);
  183.   glClearColor(0.8, 0.8, 0.8, 1.0);
  184.   /* *INDENT-OFF* */
  185.   glNewList(cubeList, GL_COMPILE);
  186.     glBegin(GL_TRIANGLE_STRIP);
  187.       glNormal3fv(scp[0]);
  188.       glVertex3fv(scp[0]);
  189.       glNormal3fv(scp[0]);
  190.       glVertex3fv(scp[1]);
  191.       glNormal3fv(scp[2]);
  192.       glVertex3fv(scp[2]);
  193.       glNormal3fv(scp[2]);
  194.       glVertex3fv(scp[3]);
  195.       glNormal3fv(scp[4]);
  196.       glVertex3fv(scp[4]);
  197.       glNormal3fv(scp[4]);
  198.       glVertex3fv(scp[5]);
  199.       glNormal3fv(scp[6]);
  200.       glVertex3fv(scp[6]);
  201.       glNormal3fv(scp[6]);
  202.       glVertex3fv(scp[7]);
  203.       glNormal3fv(scp[8]);
  204.       glVertex3fv(scp[8]);
  205.       glNormal3fv(scp[8]);
  206.       glVertex3fv(scp[9]);
  207.       glNormal3fv(scp[10]);
  208.       glVertex3fv(scp[10]);
  209.       glNormal3fv(scp[10]);
  210.       glVertex3fv(scp[11]);
  211.       glNormal3fv(scp[12]);
  212.       glVertex3fv(scp[12]);
  213.       glNormal3fv(scp[12]);
  214.       glVertex3fv(scp[13]);
  215.       glNormal3fv(scp[14]);
  216.       glVertex3fv(scp[14]);
  217.       glNormal3fv(scp[14]);
  218.       glVertex3fv(scp[15]);
  219.       glNormal3fv(scp[16]);
  220.       glVertex3fv(scp[16]);
  221.       glNormal3fv(scp[16]);
  222.       glVertex3fv(scp[17]);
  223.     glEnd();
  224.   glEndList();
  225.   /* *INDENT-ON* */
  226.   glMatrixMode(GL_PROJECTION);
  227.   glLoadIdentity();
  228.   gluPerspective(45.0, 1.0, 1.0, 200.0);
  229.   glMatrixMode(GL_MODELVIEW);
  230.   glutKeyboardFunc(Key);
  231.   glutSpecialFunc(SpecialKey);
  232.   glutDisplayFunc(Draw);
  233.   glutMainLoop();
  234.   return 0;             /* ANSI C requires main to return int. */
  235. }