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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /* This program is freely distributable without licensing fees 
  3.    and is provided without guarantee or warrantee expressed or 
  4.    implied. This program is -not- in the public domain. */
  5. #include <stdlib.h>
  6. #include <stdarg.h>
  7. #include <stdio.h>
  8. #include <GL/glut.h>
  9. enum {
  10.   BRASS, RED_PLASTIC, EMERALD, SLATE
  11. } MaterialType;
  12. enum {
  13.   TORUS_MATERIAL = 1, TEAPOT_MATERIAL = 2, ICO_MATERIAL = 3
  14. } MaterialDisplayList;
  15. enum {
  16.   LIGHT_OFF, LIGHT_RED, LIGHT_WHITE, LIGHT_GREEN
  17. } LightValues;
  18. GLfloat red_light[] =
  19. {1.0, 0.0, 0.0, 1.0}, green_light[] =
  20. {0.0, 1.0, 0.0, 1.0}, white_light[] =
  21. {1.0, 1.0, 1.0, 1.0};
  22. GLfloat left_light_position[] =
  23. {-1.0, 0.0, 1.0, 0.0}, right_light_position[] =
  24. {1.0, 0.0, 1.0, 0.0};
  25. GLfloat brass_ambient[] =
  26. {0.33, 0.22, 0.03, 1.0}, brass_diffuse[] =
  27. {0.78, 0.57, 0.11, 1.0}, brass_specular[] =
  28. {0.99, 0.91, 0.81, 1.0}, brass_shininess = 27.8;
  29. GLfloat red_plastic_ambient[] =
  30. {0.0, 0.0, 0.0}, red_plastic_diffuse[] =
  31. {0.5, 0.0, 0.0}, red_plastic_specular[] =
  32. {0.7, 0.6, 0.6}, red_plastic_shininess = 32.0;
  33. GLfloat emerald_ambient[] =
  34. {0.0215, 0.1745, 0.0215}, emerald_diffuse[] =
  35. {0.07568, 0.61424, 0.07568}, emerald_specular[] =
  36. {0.633, 0.727811, 0.633}, emerald_shininess = 76.8;
  37. GLfloat slate_ambient[] =
  38. {0.02, 0.02, 0.02}, slate_diffuse[] =
  39. {0.02, 0.01, 0.01}, slate_specular[] =
  40. {0.4, 0.4, 0.4}, slate_shininess = .78125;
  41. int shade_model = GL_SMOOTH;
  42. char *left_light, *right_light;
  43. char *ico_material, *teapot_material, *torus_material;
  44. void 
  45. output(GLfloat x, GLfloat y, char *format,...)
  46. {
  47.   va_list args;
  48.   char buffer[200], *p;
  49.   va_start(args, format);
  50.   vsprintf(buffer, format, args);
  51.   va_end(args);
  52.   glPushMatrix();
  53.   glTranslatef(x, y, 0);
  54.   for (p = buffer; *p; p++)
  55.     glutStrokeCharacter(GLUT_STROKE_ROMAN, *p);
  56.   glPopMatrix();
  57. }
  58. void 
  59. display(void)
  60. {
  61.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  62.   glMatrixMode(GL_MODELVIEW);
  63.   glPushMatrix();
  64.   glScalef(1.3, 1.3, 1.3);
  65.   glRotatef(20.0, 1.0, 0.0, 0.0);
  66.   glPushMatrix();
  67.   glTranslatef(-0.65, 0.7, 0.0);
  68.   glRotatef(90.0, 1.0, 0.0, 0.0);
  69.   glCallList(TORUS_MATERIAL);
  70.   glutSolidTorus(0.275, 0.85, 10, 15);
  71.   glPopMatrix();
  72.   glPushMatrix();
  73.   glTranslatef(-0.75, -0.8, 0.0);
  74.   glCallList(TEAPOT_MATERIAL);
  75.   glutSolidTeapot(0.7);
  76.   glPopMatrix();
  77.   glPushMatrix();
  78.   glTranslatef(1.0, 0.0, -1.0);
  79.   glCallList(ICO_MATERIAL);
  80.   glutSolidIcosahedron();
  81.   glPopMatrix();
  82.   glPopMatrix();
  83.   glPushAttrib(GL_ENABLE_BIT);
  84.   glDisable(GL_DEPTH_TEST);
  85.   glDisable(GL_LIGHTING);
  86.   glMatrixMode(GL_PROJECTION);
  87.   glPushMatrix();
  88.   glLoadIdentity();
  89.   gluOrtho2D(0, 3000, 0, 3000);
  90.   glMatrixMode(GL_MODELVIEW);
  91.   glPushMatrix();
  92.   glLoadIdentity();
  93.   output(80, 2800, "Torus: %s", torus_material);
  94.   output(80, 2650, "Icosahedron: %s", ico_material);
  95.   output(80, 2500, "Teapot: %s", teapot_material);
  96.   output(80, 250, "Left light: %s", left_light);
  97.   output(1700, 250, "Right light: %s", right_light);
  98.   output(850, 100, "Shade model: %s",
  99.     shade_model == GL_SMOOTH ? "smooth" : "flat");
  100.   glPopMatrix();
  101.   glMatrixMode(GL_PROJECTION);
  102.   glPopMatrix();
  103.   glPopAttrib();
  104.   glutSwapBuffers();
  105. }
  106. void 
  107. light_select(GLenum which, int value, char **label)
  108. {
  109.   glEnable(which);
  110.   switch (value) {
  111.   case LIGHT_OFF:
  112.     *label = "off";
  113.     glDisable(which);
  114.     break;
  115.   case LIGHT_RED:
  116.     *label = "red";
  117.     glLightfv(which, GL_DIFFUSE, red_light);
  118.     break;
  119.   case LIGHT_WHITE:
  120.     *label = "white";
  121.     glLightfv(which, GL_DIFFUSE, white_light);
  122.     break;
  123.   case LIGHT_GREEN:
  124.     *label = "green";
  125.     glLightfv(which, GL_DIFFUSE, green_light);
  126.     break;
  127.   }
  128.   glutPostRedisplay();
  129. }
  130. void 
  131. left_light_select(int value)
  132. {
  133.   light_select(GL_LIGHT0, value, &left_light);
  134. }
  135. void 
  136. right_light_select(int value)
  137. {
  138.   light_select(GL_LIGHT1, value, &right_light);
  139. }
  140. void 
  141. material(int dlist, GLfloat * ambient, GLfloat * diffuse,
  142.   GLfloat * specular, GLfloat shininess)
  143. {
  144.   glNewList(dlist, GL_COMPILE);
  145.   glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
  146.   glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
  147.   glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
  148.   glMaterialf(GL_FRONT, GL_SHININESS, shininess);
  149.   glEndList();
  150. }
  151. char *
  152. material_select(int object, int value)
  153. {
  154.   glutPostRedisplay();
  155.   switch (value) {
  156.   case BRASS:
  157.     material(object, brass_ambient,
  158.       brass_diffuse, brass_specular, brass_shininess);
  159.     return "brass";
  160.   case RED_PLASTIC:
  161.     material(object, red_plastic_ambient, red_plastic_diffuse,
  162.       red_plastic_specular, red_plastic_shininess);
  163.     return "red plastic";
  164.   case EMERALD:
  165.     material(object, emerald_ambient, emerald_diffuse,
  166.       emerald_specular, emerald_shininess);
  167.     return "emerald";
  168.   case SLATE:
  169.     material(object, slate_ambient, slate_diffuse,
  170.       slate_specular, slate_shininess);
  171.     return "slate";
  172.   }
  173.   return NULL; /* avoid bogus warning! */
  174. }
  175. void 
  176. torus_select(int value)
  177. {
  178.   torus_material = material_select(TORUS_MATERIAL, value);
  179. }
  180. void 
  181. teapot_select(int value)
  182. {
  183.   teapot_material = material_select(TEAPOT_MATERIAL, value);
  184. }
  185. void 
  186. ico_select(int value)
  187. {
  188.   ico_material = material_select(ICO_MATERIAL, value);
  189. }
  190. void 
  191. main_menu_select(int value)
  192. {
  193.   if (value == 666)
  194.     exit(0);
  195.   glShadeModel(shade_model = value);
  196.   glutPostRedisplay();
  197. }
  198. int 
  199. main(int argc, char **argv)
  200. {
  201.   int left_light_m, right_light_m, torus_m, teapot_m, ico_m;
  202.   glutInitWindowSize(400, 400);
  203.   glutInit(&argc, argv);
  204.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  205.   glutCreateWindow("Lighting Laboratory");
  206.   glutDisplayFunc(display);
  207. #define LIGHT_MENU_ENTRIES() 
  208.     glutAddMenuEntry("Disable", LIGHT_OFF); 
  209.     glutAddMenuEntry("Red", LIGHT_RED); 
  210.     glutAddMenuEntry("White", LIGHT_WHITE); 
  211.     glutAddMenuEntry("Green", LIGHT_GREEN);
  212. #define MATERIAL_MENU_ENTRIES() 
  213.     glutAddMenuEntry("Brass", BRASS); 
  214.     glutAddMenuEntry("Red plastic", RED_PLASTIC); 
  215.     glutAddMenuEntry("Emerald", EMERALD); 
  216.     glutAddMenuEntry("Slate", SLATE);
  217.   left_light_m = glutCreateMenu(left_light_select);
  218.   LIGHT_MENU_ENTRIES();
  219.   right_light_m = glutCreateMenu(right_light_select);
  220.   LIGHT_MENU_ENTRIES();
  221.   torus_m = glutCreateMenu(torus_select);
  222.   MATERIAL_MENU_ENTRIES();
  223.   teapot_m = glutCreateMenu(teapot_select);
  224.   MATERIAL_MENU_ENTRIES();
  225.   ico_m = glutCreateMenu(ico_select);
  226.   MATERIAL_MENU_ENTRIES();
  227.   glutCreateMenu(main_menu_select);
  228.   glutAddMenuEntry("Smooth shading", GL_SMOOTH);
  229.   glutAddMenuEntry("Flat shading", GL_FLAT);
  230.   glutAddSubMenu("Left light", left_light_m);
  231.   glutAddSubMenu("Right light", right_light_m);
  232.   glutAddSubMenu("Torus", torus_m);
  233.   glutAddSubMenu("Teapot", teapot_m);
  234.   glutAddSubMenu("Icosahedron", ico_m);
  235.   glutAddMenuEntry("Quit", 666);
  236.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  237.   glLightfv(GL_LIGHT0, GL_POSITION, left_light_position);
  238.   glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
  239.   glLightfv(GL_LIGHT1, GL_POSITION, right_light_position);
  240.   glLightfv(GL_LIGHT1, GL_SPECULAR, white_light);
  241.   left_light_select(LIGHT_RED);
  242.   right_light_select(LIGHT_GREEN);
  243.   torus_select(RED_PLASTIC);
  244.   teapot_select(BRASS);
  245.   ico_select(EMERALD);
  246.   glEnable(GL_LIGHTING);
  247.   glEnable(GL_DEPTH_TEST);
  248.   glEnable(GL_NORMALIZE);
  249.   glLineWidth(1.0);
  250.   glMatrixMode(GL_PROJECTION);
  251.   gluPerspective( /* degrees field of view */ 50.0,
  252.     /* aspect ratio */ 1.0, /* Z near */ 1.0, /* Z far */ 10.0);
  253.   glMatrixMode(GL_MODELVIEW);
  254.   gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
  255.     0.0, 0.0, 0.0,      /* center is at (0,0,0) */
  256.     0.0, 1.0, 0.);      /* up is in positive Y direction */
  257.   glTranslatef(0.0, 0.0, -1.0);
  258.   glutMainLoop();
  259.   return 0;             /* ANSI C requires main to return int. */
  260. }