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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /**
  3.  * (c) Copyright 1993, 1994, 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 <stdlib.h>
  40. #include <string.h>
  41. #include <math.h>
  42. #include <GL/glut.h>
  43. /* Some <math.h> files do not define M_PI... */
  44. #ifndef M_PI
  45. #define M_PI 3.14159265358979323846
  46. #endif
  47. #define TWO_PI (2*M_PI)
  48. typedef struct lightRec {
  49.   float amb[4];
  50.   float diff[4];
  51.   float spec[4];
  52.   float pos[4];
  53.   float spotDir[3];
  54.   float spotExp;
  55.   float spotCutoff;
  56.   float atten[3];
  57.   float trans[3];
  58.   float rot[3];
  59.   float swing[3];
  60.   float arc[3];
  61.   float arcIncr[3];
  62. } Light;
  63. static int useSAME_AMB_SPEC = 1;
  64. /* *INDENT-OFF* */
  65. static float modelAmb[4] = {0.2, 0.2, 0.2, 1.0};
  66. static float matAmb[4] = {0.2, 0.2, 0.2, 1.0};
  67. static float matDiff[4] = {0.8, 0.8, 0.8, 1.0};
  68. static float matSpec[4] = {0.4, 0.4, 0.4, 1.0};
  69. static float matEmission[4] = {0.0, 0.0, 0.0, 1.0};
  70. /* *INDENT-ON* */
  71. #define NUM_LIGHTS 3
  72. static Light spots[] =
  73. {
  74.   {
  75.     {0.2, 0.0, 0.0, 1.0},  /* ambient */
  76.     {0.8, 0.0, 0.0, 1.0},  /* diffuse */
  77.     {0.4, 0.0, 0.0, 1.0},  /* specular */
  78.     {0.0, 0.0, 0.0, 1.0},  /* position */
  79.     {0.0, -1.0, 0.0},   /* direction */
  80.     20.0,
  81.     60.0,               /* exponent, cutoff */
  82.     {1.0, 0.0, 0.0},    /* attenuation */
  83.     {0.0, 1.25, 0.0},   /* translation */
  84.     {0.0, 0.0, 0.0},    /* rotation */
  85.     {20.0, 0.0, 40.0},  /* swing */
  86.     {0.0, 0.0, 0.0},    /* arc */
  87.     {TWO_PI / 70.0, 0.0, TWO_PI / 140.0}  /* arc increment */
  88.   },
  89.   {
  90.     {0.0, 0.2, 0.0, 1.0},  /* ambient */
  91.     {0.0, 0.8, 0.0, 1.0},  /* diffuse */
  92.     {0.0, 0.4, 0.0, 1.0},  /* specular */
  93.     {0.0, 0.0, 0.0, 1.0},  /* position */
  94.     {0.0, -1.0, 0.0},   /* direction */
  95.     20.0,
  96.     60.0,               /* exponent, cutoff */
  97.     {1.0, 0.0, 0.0},    /* attenuation */
  98.     {0.0, 1.25, 0.0},   /* translation */
  99.     {0.0, 0.0, 0.0},    /* rotation */
  100.     {20.0, 0.0, 40.0},  /* swing */
  101.     {0.0, 0.0, 0.0},    /* arc */
  102.     {TWO_PI / 120.0, 0.0, TWO_PI / 60.0}  /* arc increment */
  103.   },
  104.   {
  105.     {0.0, 0.0, 0.2, 1.0},  /* ambient */
  106.     {0.0, 0.0, 0.8, 1.0},  /* diffuse */
  107.     {0.0, 0.0, 0.4, 1.0},  /* specular */
  108.     {0.0, 0.0, 0.0, 1.0},  /* position */
  109.     {0.0, -1.0, 0.0},   /* direction */
  110.     20.0,
  111.     60.0,               /* exponent, cutoff */
  112.     {1.0, 0.0, 0.0},    /* attenuation */
  113.     {0.0, 1.25, 0.0},   /* translation */
  114.     {0.0, 0.0, 0.0},    /* rotation */
  115.     {20.0, 0.0, 40.0},  /* swing */
  116.     {0.0, 0.0, 0.0},    /* arc */
  117.     {TWO_PI / 50.0, 0.0, TWO_PI / 100.0}  /* arc increment */
  118.   }
  119. };
  120. static void
  121. usage(char *name)
  122. {
  123.   printf("n");
  124.   printf("usage: %s [options]n", name);
  125.   printf("n");
  126.   printf("  Options:n");
  127.   printf("    -geometry Specify size and position WxH+X+Yn");
  128.   printf("    -lm       Toggle lighting(SPECULAR and AMBIENT are/not samen");
  129.   printf("n");
  130. #ifndef EXIT_FAILURE /* should be defined by ANSI C <stdlib.h> */
  131. #define EXIT_FAILURE 1
  132. #endif
  133.   exit(EXIT_FAILURE);
  134. }
  135. static void
  136. initLights(void)
  137. {
  138.   int k;
  139.   for (k = 0; k < NUM_LIGHTS; ++k) {
  140.     int lt = GL_LIGHT0 + k;
  141.     Light *light = &spots[k];
  142.     glEnable(lt);
  143.     glLightfv(lt, GL_AMBIENT, light->amb);
  144.     glLightfv(lt, GL_DIFFUSE, light->diff);
  145.     if (useSAME_AMB_SPEC)
  146.       glLightfv(lt, GL_SPECULAR, light->amb);
  147.     else
  148.       glLightfv(lt, GL_SPECULAR, light->spec);
  149.     glLightf(lt, GL_SPOT_EXPONENT, light->spotExp);
  150.     glLightf(lt, GL_SPOT_CUTOFF, light->spotCutoff);
  151.     glLightf(lt, GL_CONSTANT_ATTENUATION, light->atten[0]);
  152.     glLightf(lt, GL_LINEAR_ATTENUATION, light->atten[1]);
  153.     glLightf(lt, GL_QUADRATIC_ATTENUATION, light->atten[2]);
  154.   }
  155. }
  156. static void
  157. aimLights(void)
  158. {
  159.   int k;
  160.   for (k = 0; k < NUM_LIGHTS; ++k) {
  161.     Light *light = &spots[k];
  162.     light->rot[0] = light->swing[0] * sin(light->arc[0]);
  163.     light->arc[0] += light->arcIncr[0];
  164.     if (light->arc[0] > TWO_PI)
  165.       light->arc[0] -= TWO_PI;
  166.     light->rot[1] = light->swing[1] * sin(light->arc[1]);
  167.     light->arc[1] += light->arcIncr[1];
  168.     if (light->arc[1] > TWO_PI)
  169.       light->arc[1] -= TWO_PI;
  170.     light->rot[2] = light->swing[2] * sin(light->arc[2]);
  171.     light->arc[2] += light->arcIncr[2];
  172.     if (light->arc[2] > TWO_PI)
  173.       light->arc[2] -= TWO_PI;
  174.   }
  175. }
  176. static void
  177. setLights(void)
  178. {
  179.   int k;
  180.   for (k = 0; k < NUM_LIGHTS; ++k) {
  181.     int lt = GL_LIGHT0 + k;
  182.     Light *light = &spots[k];
  183.     glPushMatrix();
  184.     glTranslatef(light->trans[0], light->trans[1], light->trans[2]);
  185.     glRotatef(light->rot[0], 1, 0, 0);
  186.     glRotatef(light->rot[1], 0, 1, 0);
  187.     glRotatef(light->rot[2], 0, 0, 1);
  188.     glLightfv(lt, GL_POSITION, light->pos);
  189.     glLightfv(lt, GL_SPOT_DIRECTION, light->spotDir);
  190.     glPopMatrix();
  191.   }
  192. }
  193. static void
  194. drawLights(void)
  195. {
  196.   int k;
  197.   glDisable(GL_LIGHTING);
  198.   for (k = 0; k < NUM_LIGHTS; ++k) {
  199.     Light *light = &spots[k];
  200.     glColor4fv(light->diff);
  201.     glPushMatrix();
  202.     glTranslatef(light->trans[0], light->trans[1], light->trans[2]);
  203.     glRotatef(light->rot[0], 1, 0, 0);
  204.     glRotatef(light->rot[1], 0, 1, 0);
  205.     glRotatef(light->rot[2], 0, 0, 1);
  206.     glBegin(GL_LINES);
  207.     glVertex3f(light->pos[0], light->pos[1], light->pos[2]);
  208.     glVertex3f(light->spotDir[0], light->spotDir[1], light->spotDir[2]);
  209.     glEnd();
  210.     glPopMatrix();
  211.   }
  212.   glEnable(GL_LIGHTING);
  213. }
  214. static void
  215. drawPlane(int w, int h)
  216. {
  217.   int i, j;
  218.   float dw = 1.0 / w;
  219.   float dh = 1.0 / h;
  220.   glNormal3f(0.0, 0.0, 1.0);
  221.   for (j = 0; j < h; ++j) {
  222.     glBegin(GL_TRIANGLE_STRIP);
  223.     for (i = 0; i <= w; ++i) {
  224.       glVertex2f(dw * i, dh * (j + 1));
  225.       glVertex2f(dw * i, dh * j);
  226.     }
  227.     glEnd();
  228.   }
  229. }
  230. int spin = 0;
  231. void
  232. display(void)
  233. {
  234.   glClear(GL_COLOR_BUFFER_BIT);
  235.   glPushMatrix();
  236.   glRotatef(spin, 0, 1, 0);
  237.   aimLights();
  238.   setLights();
  239.   glPushMatrix();
  240.   glRotatef(-90.0, 1, 0, 0);
  241.   glScalef(1.9, 1.9, 1.0);
  242.   glTranslatef(-0.5, -0.5, 0.0);
  243.   drawPlane(16, 16);
  244.   glPopMatrix();
  245.   drawLights();
  246.   glPopMatrix();
  247.   glutSwapBuffers();
  248. }
  249. void
  250. animate(void)
  251. {
  252.   spin += 0.5;
  253.   if (spin > 360.0)
  254.     spin -= 360.0;
  255.   glutPostRedisplay();
  256. }
  257. void
  258. visibility(int state)
  259. {
  260.   if (state == GLUT_VISIBLE) {
  261.     glutIdleFunc(animate);
  262.   } else {
  263.     glutIdleFunc(NULL);
  264.   }
  265. }
  266. int
  267. main(int argc, char **argv)
  268. {
  269.   int i;
  270.   glutInit(&argc, argv);
  271.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  272.   /* process commmand line args */
  273.   for (i = 1; i < argc; ++i) {
  274.     if (!strcmp("-lm", argv[i])) {
  275.       useSAME_AMB_SPEC = !useSAME_AMB_SPEC;
  276.     } else {
  277.       usage(argv[0]);
  278.     }
  279.   }
  280.   glutCreateWindow("GLUT spotlight swing");
  281.   glutDisplayFunc(display);
  282.   glutVisibilityFunc(visibility);
  283.   glMatrixMode(GL_PROJECTION);
  284.   glFrustum(-1, 1, -1, 1, 2, 6);
  285.   glMatrixMode(GL_MODELVIEW);
  286.   glTranslatef(0.0, 0.0, -3.0);
  287.   glRotatef(45.0, 1, 0, 0);
  288.   glEnable(GL_LIGHTING);
  289.   glEnable(GL_NORMALIZE);
  290.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, modelAmb);
  291.   glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
  292.   glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
  293.   glMaterialfv(GL_FRONT, GL_AMBIENT, matAmb);
  294.   glMaterialfv(GL_FRONT, GL_DIFFUSE, matDiff);
  295.   glMaterialfv(GL_FRONT, GL_SPECULAR, matSpec);
  296.   glMaterialfv(GL_FRONT, GL_EMISSION, matEmission);
  297.   glMaterialf(GL_FRONT, GL_SHININESS, 10.0);
  298.   initLights();
  299.   glutMainLoop();
  300.   return 0;             /* ANSI C requires main to return int. */
  301. }