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

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. /*
  6.  * Copyright (c) 1991-94 Silicon Graphics, Inc.
  7.  *
  8.  * Permission to use, copy, modify, distribute, and sell this software and
  9.  * its documentation for any purpose is hereby granted without fee, provided
  10.  * that the name of Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Silicon Graphics.
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  17.  *
  18.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
  19.  * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
  20.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE
  21.  * POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN
  22.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  23.  */
  24. /* Based on an example from the Inventor Mentor chapter 13, example 5. */
  25. #include <stdio.h>
  26. #include <unistd.h>
  27. #include <math.h>
  28. #include <GL/gl.h>
  29. #include <GL/glu.h>
  30. #include <GL/glut.h>
  31. #include <Inventor/SoDB.h>
  32. #include <Inventor/SoInput.h>
  33. #include <Inventor/SbViewportRegion.h>
  34. #include <Inventor/nodes/SoSeparator.h>
  35. #include <Inventor/actions/SoGLRenderAction.h>
  36. #include <Inventor/nodes/SoCylinder.h>
  37. #include <Inventor/nodes/SoDirectionalLight.h>
  38. #include <Inventor/nodes/SoEventCallback.h>
  39. #include <Inventor/nodes/SoMaterial.h>
  40. #include <Inventor/nodes/SoPerspectiveCamera.h>
  41. #include <Inventor/nodes/SoRotationXYZ.h>
  42. #include <Inventor/nodes/SoTransform.h>
  43. #include <Inventor/nodes/SoTranslation.h>
  44. /* Some <math.h> files do not define M_PI... */
  45. #ifndef M_PI
  46. #define M_PI 3.14159265358979323846
  47. #endif
  48. int W = 300, H = 300;
  49. int spinning = 0;
  50. GLubyte *image = NULL;
  51. SoSeparator *root;
  52. SoRotationXYZ *duckRotXYZ;
  53. float angle = 0.0;
  54. int moving  = 0;
  55. int begin;
  56. void
  57. reshape(int w, int h)
  58. {
  59.   glViewport(0, 0, w, h);
  60.   W = w;
  61.   H = h;
  62.   if (image)
  63.     free(image);
  64.   image = (GLubyte *) malloc(W * H * 3);
  65. }
  66. void
  67. renderScene(void)
  68. {
  69.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  70.   SbViewportRegion myViewport(W, H);
  71.   SoGLRenderAction myRenderAction(myViewport);
  72.   myRenderAction.apply(root);
  73. }
  74. void
  75. redraw(void)
  76. {
  77.   renderScene();
  78.   glutSwapBuffers();
  79. }
  80. int
  81. duckScene(void)
  82. {
  83.    root = new SoSeparator;
  84.    root->ref();
  85.    // Add a camera and light
  86.    SoPerspectiveCamera *myCamera = new SoPerspectiveCamera;
  87.    myCamera->position.setValue(0., -4., 8.0);
  88.    myCamera->heightAngle = M_PI/2.5; 
  89.    myCamera->nearDistance = 1.0;
  90.    myCamera->farDistance = 15.0;
  91.    root->addChild(myCamera);
  92.    root->addChild(new SoDirectionalLight);
  93.    // Rotate scene slightly to get better view
  94.    SoRotationXYZ *globalRotXYZ = new SoRotationXYZ;
  95.    globalRotXYZ->axis = SoRotationXYZ::X;
  96.    globalRotXYZ->angle = M_PI/9;
  97.    root->addChild(globalRotXYZ);
  98.    // Pond group
  99.    SoSeparator *pond = new SoSeparator; 
  100.    root->addChild(pond);
  101.    SoMaterial *cylMaterial = new SoMaterial;
  102.    cylMaterial->diffuseColor.setValue(0., 0.3, 0.8);
  103.    pond->addChild(cylMaterial);
  104.    SoTranslation *cylTranslation = new SoTranslation;
  105.    cylTranslation->translation.setValue(0., -6.725, 0.);
  106.    pond->addChild(cylTranslation);
  107.    SoCylinder *myCylinder = new SoCylinder;
  108.    myCylinder->radius.setValue(4.0);
  109.    myCylinder->height.setValue(0.5);
  110.    pond->addChild(myCylinder);
  111.    // Duck group
  112.    SoSeparator *duck = new SoSeparator;
  113.    root->addChild(duck);
  114.    // Read the duck object from a file and add to the group
  115.    SoInput myInput;
  116.    if (!myInput.openFile("duck.iv"))  {
  117.       if (!myInput.openFile("/usr/share/src/Inventor/examples/data/duck.iv")) {
  118.         return 1;
  119.       }
  120.    }
  121.    SoSeparator *duckObject = SoDB::readAll(&myInput);
  122.    if (duckObject == NULL) return 1;
  123.    // Set up the duck transformations
  124.    duckRotXYZ = new SoRotationXYZ;
  125.    duck->addChild(duckRotXYZ);
  126.    duckRotXYZ->angle = angle;
  127.    duckRotXYZ->axis = SoRotationXYZ::Y;  // rotate about Y axis
  128.    SoTransform *initialTransform = new SoTransform;
  129.    initialTransform->translation.setValue(0., 0., 3.);
  130.    initialTransform->scaleFactor.setValue(6., 6., 6.);
  131.    duck->addChild(initialTransform);
  132.    duck->addChild(duckObject);
  133.    return 0;
  134. }
  135. void
  136. updateModels(void)
  137. {
  138.   duckRotXYZ->angle = angle;
  139.   glutPostRedisplay();
  140. }
  141. void
  142. animate(void)
  143. {
  144.   angle += 0.1;
  145.   updateModels();
  146. }
  147. void
  148. setAnimation(int enable)
  149. {
  150.   if(enable) {
  151.     spinning = 1;
  152.     glutIdleFunc(animate);
  153.   } else {
  154.     spinning = 0;
  155.     glutIdleFunc(NULL);
  156.     glutPostRedisplay();
  157.   }
  158. }
  159. /* ARGSUSED */
  160. void
  161. keyboard(unsigned char ch, int x, int y)
  162. {
  163.   if(ch == ' ') {
  164.     setAnimation(0);
  165.     animate();
  166.   }
  167. }
  168. void
  169. menuSelect(int item)
  170. {
  171.    switch(item) {
  172.    case 1:
  173.      animate();
  174.      break;
  175.    case 2:
  176.      if(!spinning) {
  177.            setAnimation(1);
  178.      } else {
  179.            setAnimation(0);
  180.      }
  181.      break;
  182. #ifdef GL_MULTISAMPLE_SGIS
  183.    case 3:
  184.      if(glIsEnabled(GL_MULTISAMPLE_SGIS)) {
  185.        glDisable(GL_MULTISAMPLE_SGIS);
  186.      } else {
  187.        glEnable(GL_MULTISAMPLE_SGIS);
  188.      }
  189.      glutPostRedisplay();
  190.      break;
  191. #endif
  192.    }
  193. }
  194. void
  195. vis(int visible)
  196. {
  197.   if (visible == GLUT_VISIBLE) {
  198.     if (spinning)
  199.       glutIdleFunc(animate);
  200.   } else {
  201.     if (spinning)
  202.       glutIdleFunc(NULL);
  203.   }
  204. }
  205. /* ARGSUSED */
  206. void
  207. mouse(int button, int state, int x, int y)
  208. {
  209.   if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  210.     setAnimation(0);
  211.     moving = 1;
  212.     begin = x;
  213.   }
  214.   if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
  215.     moving = 0;
  216.     glutPostRedisplay();
  217.   }
  218. }
  219. /* ARGSUSED */
  220. void
  221. motion(int x, int y)
  222. {
  223.   if (moving) {
  224.     angle = angle + .01 * (x - begin);
  225.     begin = x;
  226.     updateModels();
  227.   }
  228. }
  229. int
  230. main(int argc, char **argv)
  231. {
  232.   glutInit(&argc, argv);
  233.   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
  234.   SoDB::init();
  235.   if(duckScene()) {
  236.     fprintf(stderr, "couldn't read IV filen");
  237.     exit(1);
  238.   }
  239.   glutInitWindowSize(W, H);
  240.   glutCreateWindow("GLUT Inventor Duck Pond");
  241.   glutDisplayFunc(redraw);
  242.   glutReshapeFunc(reshape);
  243.   glutCreateMenu(menuSelect);
  244.   glutAddMenuEntry("Step", 1);
  245.   glutAddMenuEntry("Toggle animation", 2);
  246.   if(glutGet(GLUT_WINDOW_NUM_SAMPLES) > 0) {
  247.       glutAddMenuEntry("Toggle multisampling", 3);
  248.   }
  249.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  250.   glutKeyboardFunc(keyboard);
  251.   glutMouseFunc(mouse);
  252.   glutMotionFunc(motion);
  253.   glutVisibilityFunc(vis);
  254.   glEnable(GL_DEPTH_TEST);
  255.   glClearColor(0.132, 0.542, 0.132, 1.0);
  256.   glutMainLoop();
  257.   return 0;             /* ANSI C requires main to return int. */
  258. }