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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1996. */
  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. /* This program was originally written by someone else (Simon Hui?);
  6.    I just added a bit more GLUT stuff to it. */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11. #include <GL/glut.h>
  12. #define VORDER 10
  13. #define CORDER 10
  14. #define TORDER 3
  15. #define VMAJOR_ORDER 2
  16. #define VMINOR_ORDER 3
  17. #define CMAJOR_ORDER 2
  18. #define CMINOR_ORDER 2
  19. #define TMAJOR_ORDER 2
  20. #define TMINOR_ORDER 2
  21. #define VDIM 4
  22. #define CDIM 4
  23. #define TDIM 2
  24. #define ONE_D 1
  25. #define TWO_D 2
  26. #define EVAL 3
  27. #define MESH 4
  28. GLenum doubleBuffer;
  29. float rotX = 0.0, rotY = 0.0, translateZ = -1.0;
  30. GLenum arrayType = ONE_D;
  31. GLenum colorType = GL_FALSE;
  32. GLenum textureType = GL_FALSE;
  33. GLenum polygonFilled = GL_FALSE;
  34. GLenum lighting = GL_FALSE;
  35. GLenum mapPoint = GL_FALSE;
  36. GLenum mapType = EVAL;
  37. double point1[10 * 4] =
  38. {
  39.   -0.5, 0.0, 0.0, 1.0,
  40.   -0.4, 0.5, 0.0, 1.0,
  41.   -0.3, -0.5, 0.0, 1.0,
  42.   -0.2, 0.5, 0.0, 1.0,
  43.   -0.1, -0.5, 0.0, 1.0,
  44.   0.0, 0.5, 0.0, 1.0,
  45.   0.1, -0.5, 0.0, 1.0,
  46.   0.2, 0.5, 0.0, 1.0,
  47.   0.3, -0.5, 0.0, 1.0,
  48.   0.4, 0.0, 0.0, 1.0,
  49. };
  50. double cpoint1[10 * 4] =
  51. {
  52.   0.0, 0.0, 1.0, 1.0,
  53.   0.3, 0.0, 0.7, 1.0,
  54.   0.6, 0.0, 0.3, 1.0,
  55.   1.0, 0.0, 0.0, 1.0,
  56.   1.0, 0.3, 0.0, 1.0,
  57.   1.0, 0.6, 0.0, 1.0,
  58.   1.0, 1.0, 0.0, 1.0,
  59.   1.0, 1.0, 0.5, 1.0,
  60.   1.0, 1.0, 1.0, 1.0,
  61. };
  62. double tpoint1[11 * 4] =
  63. {
  64.   0.0, 0.0, 0.0, 1.0,
  65.   0.0, 0.1, 0.0, 1.0,
  66.   0.0, 0.2, 0.0, 1.0,
  67.   0.0, 0.3, 0.0, 1.0,
  68.   0.0, 0.4, 0.0, 1.0,
  69.   0.0, 0.5, 0.0, 1.0,
  70.   0.0, 0.6, 0.0, 1.0,
  71.   0.0, 0.7, 0.0, 1.0,
  72.   0.0, 0.8, 0.0, 1.0,
  73.   0.0, 0.9, 0.0, 1.0,
  74. };
  75. double point2[2 * 3 * 4] =
  76. {
  77.   -0.5, -0.5, 0.5, 1.0,
  78.   0.0, 1.0, 0.5, 1.0,
  79.   0.5, -0.5, 0.5, 1.0,
  80.   -0.5, 0.5, -0.5, 1.0,
  81.   0.0, -1.0, -0.5, 1.0,
  82.   0.5, 0.5, -0.5, 1.0,
  83. };
  84. double cpoint2[2 * 2 * 4] =
  85. {
  86.   0.0, 0.0, 0.0, 1.0,
  87.   0.0, 0.0, 1.0, 1.0,
  88.   0.0, 1.0, 0.0, 1.0,
  89.   1.0, 1.0, 1.0, 1.0,
  90. };
  91. double tpoint2[2 * 2 * 2] =
  92. {
  93.   0.0, 0.0, 0.0, 1.0,
  94.   1.0, 0.0, 1.0, 1.0,
  95. };
  96. float textureImage[4 * 2 * 4] =
  97. {
  98.   1.0, 1.0, 1.0, 1.0,
  99.   1.0, 0.0, 0.0, 1.0,
  100.   1.0, 0.0, 0.0, 1.0,
  101.   1.0, 1.0, 1.0, 1.0,
  102.   1.0, 1.0, 1.0, 1.0,
  103.   1.0, 0.0, 0.0, 1.0,
  104.   1.0, 0.0, 0.0, 1.0,
  105.   1.0, 1.0, 1.0, 1.0,
  106. };
  107. static void
  108. Init(void)
  109. {
  110.   static float ambient[] =
  111.   {0.1, 0.1, 0.1, 1.0};
  112.   static float diffuse[] =
  113.   {1.0, 1.0, 1.0, 1.0};
  114.   static float position[] =
  115.   {0.0, 0.0, -150.0, 0.0};
  116.   static float front_mat_diffuse[] =
  117.   {1.0, 0.2, 1.0, 1.0};
  118.   static float back_mat_diffuse[] =
  119.   {1.0, 1.0, 0.2, 1.0};
  120.   static float lmodel_ambient[] =
  121.   {1.0, 1.0, 1.0, 1.0};
  122.   static float lmodel_twoside[] =
  123.   {GL_TRUE};
  124.   static float decal[] =
  125.   {GL_DECAL};
  126.   static float repeat[] =
  127.   {GL_REPEAT};
  128.   static float nr[] =
  129.   {GL_NEAREST};
  130.   glFrontFace(GL_CCW);
  131.   glEnable(GL_DEPTH_TEST);
  132.   glMap1d(GL_MAP1_VERTEX_4, 0.0, 1.0, VDIM, VORDER, point1);
  133.   glMap1d(GL_MAP1_COLOR_4, 0.0, 1.0, CDIM, CORDER, cpoint1);
  134.   glMap2d(GL_MAP2_VERTEX_4, 0.0, 1.0, VMINOR_ORDER * VDIM, VMAJOR_ORDER, 0.0,
  135.     1.0, VDIM, VMINOR_ORDER, point2);
  136.   glMap2d(GL_MAP2_COLOR_4, 0.0, 1.0, CMINOR_ORDER * CDIM, CMAJOR_ORDER, 0.0,
  137.     1.0, CDIM, CMINOR_ORDER, cpoint2);
  138.   glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, TMINOR_ORDER * TDIM,
  139.     TMAJOR_ORDER, 0.0, 1.0, TDIM, TMINOR_ORDER, tpoint2);
  140.   glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  141.   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  142.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  143.   glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  144.   glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  145.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  146.   glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  147.   glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  148.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  149.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  150.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nr);
  151.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nr);
  152.   glTexImage2D(GL_TEXTURE_2D, 0, 4, 2, 4, 0, GL_RGBA, GL_FLOAT,
  153.     (GLvoid *) textureImage);
  154. }
  155. static void
  156. DrawPoints1(void)
  157. {
  158.   GLint i;
  159.   glColor3f(0.0, 1.0, 0.0);
  160.   glPointSize(2);
  161.   glBegin(GL_POINTS);
  162.   for (i = 0; i < VORDER; i++) {
  163.     glVertex4dv(&point1[i * 4]);
  164.   }
  165.   glEnd();
  166. }
  167. static void
  168. DrawPoints2(void)
  169. {
  170.   GLint i, j;
  171.   glColor3f(1.0, 0.0, 1.0);
  172.   glPointSize(2);
  173.   glBegin(GL_POINTS);
  174.   for (i = 0; i < VMAJOR_ORDER; i++) {
  175.     for (j = 0; j < VMINOR_ORDER; j++) {
  176.       glVertex4dv(&point2[i * 4 * VMINOR_ORDER + j * 4]);
  177.     }
  178.   }
  179.   glEnd();
  180. }
  181. static void
  182. DrawMapEval1(float du)
  183. {
  184.   float u;
  185.   glColor3f(1.0, 0.0, 0.0);
  186.   glBegin(GL_LINE_STRIP);
  187.   for (u = 0.0; u < 1.0; u += du) {
  188.     glEvalCoord1d(u);
  189.   }
  190.   glEvalCoord1d(1.0);
  191.   glEnd();
  192. }
  193. static void
  194. DrawMapEval2(float du, float dv)
  195. {
  196.   float u, v, tmp;
  197.   glColor3f(1.0, 0.0, 0.0);
  198.   for (v = 0.0; v < 1.0; v += dv) {
  199.     glBegin(GL_QUAD_STRIP);
  200.     for (u = 0.0; u <= 1.0; u += du) {
  201.       glEvalCoord2d(u, v);
  202.       tmp = (v + dv < 1.0) ? (v + dv) : 1.0;
  203.       glEvalCoord2d(u, tmp);
  204.     }
  205.     glEvalCoord2d(1.0, v);
  206.     glEvalCoord2d(1.0, v + dv);
  207.     glEnd();
  208.   }
  209. }
  210. static void
  211. RenderEval(void)
  212. {
  213.   if (colorType) {
  214.     glEnable(GL_MAP1_COLOR_4);
  215.     glEnable(GL_MAP2_COLOR_4);
  216.   } else {
  217.     glDisable(GL_MAP1_COLOR_4);
  218.     glDisable(GL_MAP2_COLOR_4);
  219.   }
  220.   if (textureType) {
  221.     glEnable(GL_TEXTURE_2D);
  222.     glEnable(GL_MAP2_TEXTURE_COORD_2);
  223.   } else {
  224.     glDisable(GL_TEXTURE_2D);
  225.     glDisable(GL_MAP2_TEXTURE_COORD_2);
  226.   }
  227.   if (polygonFilled) {
  228.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  229.   } else {
  230.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  231.   }
  232.   glShadeModel(GL_SMOOTH);
  233.   switch (mapType) {
  234.   case EVAL:
  235.     switch (arrayType) {
  236.     case ONE_D:
  237.       glDisable(GL_MAP2_VERTEX_4);
  238.       glEnable(GL_MAP1_VERTEX_4);
  239.       DrawPoints1();
  240.       DrawMapEval1(0.1 / VORDER);
  241.       break;
  242.     case TWO_D:
  243.       glDisable(GL_MAP1_VERTEX_4);
  244.       glEnable(GL_MAP2_VERTEX_4);
  245.       DrawPoints2();
  246.       DrawMapEval2(0.1 / VMAJOR_ORDER, 0.1 / VMINOR_ORDER);
  247.       break;
  248.     }
  249.     break;
  250.   case MESH:
  251.     switch (arrayType) {
  252.     case ONE_D:
  253.       DrawPoints1();
  254.       glDisable(GL_MAP2_VERTEX_4);
  255.       glEnable(GL_MAP1_VERTEX_4);
  256.       glColor3f(0.0, 0.0, 1.0);
  257.       glMapGrid1d(40, 0.0, 1.0);
  258.       if (mapPoint) {
  259.         glPointSize(2);
  260.         glEvalMesh1(GL_POINT, 0, 40);
  261.       } else {
  262.         glEvalMesh1(GL_LINE, 0, 40);
  263.       }
  264.       break;
  265.     case TWO_D:
  266.       DrawPoints2();
  267.       glDisable(GL_MAP1_VERTEX_4);
  268.       glEnable(GL_MAP2_VERTEX_4);
  269.       glColor3f(0.0, 0.0, 1.0);
  270.       glMapGrid2d(20, 0.0, 1.0, 20, 0.0, 1.0);
  271.       if (mapPoint) {
  272.         glPointSize(2);
  273.         glEvalMesh2(GL_POINT, 0, 20, 0, 20);
  274.       } else if (polygonFilled) {
  275.         glEvalMesh2(GL_FILL, 0, 20, 0, 20);
  276.       } else {
  277.         glEvalMesh2(GL_LINE, 0, 20, 0, 20);
  278.       }
  279.       break;
  280.     default:;
  281.       /* Mesa makes GLenum be a C "enum" and gcc will warn if
  282.          all the cases of an enum are not tested in a switch
  283.  statement.  Add default case to supress the error. */
  284.     }
  285.     break;
  286.   }
  287. }
  288. static void
  289. Reshape(int width, int height)
  290. {
  291.   glViewport(0, 0, width, height);
  292.   glMatrixMode(GL_PROJECTION);
  293.   glLoadIdentity();
  294.   glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 10.0);
  295.   glMatrixMode(GL_MODELVIEW);
  296. }
  297. /* ARGSUSED1 */
  298. static void
  299. Key(unsigned char key, int x, int y)
  300. {
  301.   switch (key) {
  302.   case '1':
  303.     arrayType = ONE_D;
  304.     glDisable(GL_AUTO_NORMAL);
  305.     glutPostRedisplay();
  306.     break;
  307.   case '2':
  308.     arrayType = TWO_D;
  309.     glEnable(GL_AUTO_NORMAL);
  310.     glutPostRedisplay();
  311.     break;
  312.   case '3':
  313.     mapType = EVAL;
  314.     glutPostRedisplay();
  315.     break;
  316.   case '4':
  317.     mapType = MESH;
  318.     glutPostRedisplay();
  319.     break;
  320.   case '5':
  321.     polygonFilled = !polygonFilled;
  322.     glutPostRedisplay();
  323.     break;
  324.   case '6':
  325.     mapPoint = !mapPoint;
  326.     glutPostRedisplay();
  327.     break;
  328.   case '7':
  329.     colorType = !colorType;
  330.     glutPostRedisplay();
  331.     break;
  332.   case '8':
  333.     textureType = !textureType;
  334.     glutPostRedisplay();
  335.     break;
  336.   case '9':
  337.     lighting = !lighting;
  338.     if (lighting) {
  339.       glEnable(GL_LIGHTING);
  340.       glEnable(GL_LIGHT0);
  341.       if (arrayType == TWO_D) {
  342.         glEnable(GL_AUTO_NORMAL);
  343.       } else {
  344.         glDisable(GL_AUTO_NORMAL);
  345.       }
  346.     } else {
  347.       glDisable(GL_LIGHTING);
  348.       glDisable(GL_LIGHT0);
  349.       glDisable(GL_AUTO_NORMAL);
  350.     }
  351.     glutPostRedisplay();
  352.     break;
  353.   case 27:             /* Escape key. */
  354.     exit(0);
  355.   }
  356. }
  357. static void
  358. Menu(int value)
  359. {
  360.   /* Menu items have key values assigned to them.  Just pass
  361.      this value to the key routine. */
  362.   Key((unsigned char) value, 0, 0);
  363. }
  364. /* ARGSUSED1 */
  365. static void
  366. SpecialKey(int key, int x, int y)
  367. {
  368.   switch (key) {
  369.   case GLUT_KEY_LEFT:
  370.     rotY -= 30;
  371.     glutPostRedisplay();
  372.     break;
  373.   case GLUT_KEY_RIGHT:
  374.     rotY += 30;
  375.     glutPostRedisplay();
  376.     break;
  377.   case GLUT_KEY_UP:
  378.     rotX -= 30;
  379.     glutPostRedisplay();
  380.     break;
  381.   case GLUT_KEY_DOWN:
  382.     rotX += 30;
  383.     glutPostRedisplay();
  384.     break;
  385.   }
  386. }
  387. static void
  388. Draw(void)
  389. {
  390.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  391.   glPushMatrix();
  392.   glTranslatef(0.0, 0.0, translateZ);
  393.   glRotatef(rotX, 1, 0, 0);
  394.   glRotatef(rotY, 0, 1, 0);
  395.   RenderEval();
  396.   glPopMatrix();
  397.   if (doubleBuffer) {
  398.     glutSwapBuffers();
  399.   } else {
  400.     glFlush();
  401.   }
  402. }
  403. static void
  404. Args(int argc, char **argv)
  405. {
  406.   GLint i;
  407.   doubleBuffer = GL_FALSE;
  408.   for (i = 1; i < argc; i++) {
  409.     if (strcmp(argv[i], "-sb") == 0) {
  410.       doubleBuffer = GL_FALSE;
  411.     } else if (strcmp(argv[i], "-db") == 0) {
  412.       doubleBuffer = GL_TRUE;
  413.     }
  414.   }
  415. }
  416. int
  417. main(int argc, char **argv)
  418. {
  419.   GLenum type;
  420.   glutInit(&argc, argv);
  421.   Args(argc, argv);
  422.   type = GLUT_RGB | GLUT_DEPTH;
  423.   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  424.   glutInitDisplayMode(type);
  425.   glutInitWindowSize(300, 300);
  426.   glutCreateWindow("Evaluator Test");
  427.   glutCreateMenu(Menu);
  428.   glutAddMenuEntry("One dimensional", '1');
  429.   glutAddMenuEntry("Two dimensional", '2');
  430.   glutAddMenuEntry("Eval map type", '3');
  431.   glutAddMenuEntry("Mesh map type", '4');
  432.   glutAddMenuEntry("Toggle filled", '5');
  433.   glutAddMenuEntry("Toggle map point", '6');
  434.   glutAddMenuEntry("Toggle color", '7');
  435.   glutAddMenuEntry("Toggle texture", '8');
  436.   glutAddMenuEntry("Toggle lighting", '9');
  437.   glutAddMenuEntry("Quit", 27);
  438.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  439.   glutAttachMenu(GLUT_LEFT_BUTTON);
  440.   Init();
  441.   glutReshapeFunc(Reshape);
  442.   glutKeyboardFunc(Key);
  443.   glutSpecialFunc(SpecialKey);
  444.   glutDisplayFunc(Draw);
  445.   glutMainLoop();
  446.   return 0;
  447. }