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

GIS编程

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <GL/glut.h>
  5. #ifndef __sgi
  6. /* Most math.h's do not define float versions of math functions. */
  7. #define floorf(x) ((float)floor((x)))
  8. #endif
  9. static float transx = 1.0, transy, rotx, roty;
  10. static int ox = -1, oy = -1;
  11. static int mot = 0;
  12. #define PAN 1
  13. #define ROT 2
  14. void
  15. pan(const int x, const int y) {
  16.     transx +=  (x-ox)/5.;
  17.     transy -= (y-oy)/5.;
  18.     ox = x; oy = y;
  19.     glutPostRedisplay();
  20. }
  21. void
  22. rotate(const int x, const int y) {
  23.     rotx += x-ox;
  24.     if (rotx > 360.) rotx -= 360.;
  25.     else if (rotx < -360.) rotx += 360.;
  26.     roty += y-oy;
  27.     if (roty > 360.) roty -= 360.;
  28.     else if (roty < -360.) roty += 360.;
  29.     ox = x; oy = y;
  30.     glutPostRedisplay();
  31. }
  32. void
  33. motion(int x, int y) {
  34.     if (mot == PAN) pan(x, y);
  35.     else if (mot == ROT) rotate(x,y);
  36. }
  37. void
  38. mouse(int button, int state, int x, int y) {
  39.     if(state == GLUT_DOWN) {
  40. switch(button) {
  41. case GLUT_LEFT_BUTTON:
  42.     mot = PAN;
  43.     motion(ox = x, oy = y);
  44.     break;
  45. case GLUT_MIDDLE_BUTTON:
  46.     mot = ROT;
  47.     motion(ox = x, oy = y);
  48.     break;
  49. case GLUT_RIGHT_BUTTON:
  50.     break;
  51. }
  52.     } else if (state == GLUT_UP) {
  53. mot = 0;
  54.     }
  55. }
  56. #define stripeImageWidth 32
  57. GLubyte stripeImage[4*stripeImageWidth];
  58. void makeStripeImage(void) {
  59.    int j;
  60.     
  61.    for (j = 0; j < stripeImageWidth; j++) {
  62.       stripeImage[4*j] = (GLubyte) ((j<=4) ? 255 : 0);
  63.       stripeImage[4*j+1] = (GLubyte) ((j>4) ? 255 : 0);
  64.       stripeImage[4*j+2] = (GLubyte) 0;
  65.       stripeImage[4*j+3] = (GLubyte) 255;
  66.    }
  67. }
  68. void
  69. hsv_to_rgb(float h,float s,float v,float *r,float *g,float *b)
  70. {
  71.     int i;
  72.     float f, p, q, t;
  73.     h *= 360.0;
  74.     if (s==0) {
  75. *r = v;
  76. *g = v;
  77. *b = v;
  78.     } else {
  79. if (h==360) 
  80.     h = 0;
  81. h /= 60;
  82. i = floorf(h);
  83. f = h - i;
  84. p = v*(1.0-s);
  85. q = v*(1.0-(s*f));
  86. t = v*(1.0-(s*(1.0-f)));
  87. switch (i) {
  88.     case 0 : 
  89. *r = v;
  90. *g = t;
  91. *b = p;
  92. break;
  93.     case 1 : 
  94. *r = q;
  95. *g = v;
  96. *b = p;
  97. break;
  98.     case 2 : 
  99. *r = p;
  100. *g = v;
  101. *b = t;
  102. break;
  103.     case 3 : 
  104. *r = p;
  105. *g = q;
  106. *b = v;
  107. break;
  108.     case 4 : 
  109. *r = t;
  110. *g = p;
  111. *b = v;
  112. break;
  113.     case 5 : 
  114. *r = v;
  115. *g = p;
  116. *b = q;
  117. break;
  118. }
  119.     }
  120. }
  121. GLubyte rainbow[4*stripeImageWidth];
  122. void makeRainbow(void) {
  123.    int j;
  124.    for (j = 0; j < stripeImageWidth; j++) {
  125.       float r, g, b;
  126.       hsv_to_rgb((float)j/(stripeImageWidth-1.f), 1.0, 1.0, &r, &g, &b);
  127.       rainbow[4*j] = r*255;
  128.       rainbow[4*j+1] = g*255;
  129.       rainbow[4*j+2] = b*255;
  130.       rainbow[4*j+3] = (GLubyte) 255;
  131.    }
  132. }
  133. /*  planes for texture coordinate generation  */
  134. static GLfloat xequalzero[] = {1.0, 0.0, 0.0, 0.0};
  135. static GLfloat slanted[] = {1.0, 1.0, 1.0, 0.0};
  136. static GLfloat *currentCoeff;
  137. static GLenum currentPlane;
  138. static GLint currentGenMode;
  139. void init(void) {
  140.    glClearColor (0.0, 0.0, 0.0, 0.0);
  141.    glEnable(GL_DEPTH_TEST);
  142.    glShadeModel(GL_SMOOTH);
  143.    makeStripeImage();
  144.    makeRainbow();
  145.    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  146.    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  147.    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  148.    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  149.    glTexImage1D(GL_TEXTURE_1D, 0, 4, stripeImageWidth, 0,
  150.                 GL_RGBA, GL_UNSIGNED_BYTE, stripeImage);
  151.    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  152.    currentCoeff = xequalzero;
  153.    currentGenMode = GL_OBJECT_LINEAR;
  154.    currentPlane = GL_OBJECT_PLANE;
  155.    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
  156.    glTexGenfv(GL_S, currentPlane, currentCoeff);
  157.    glEnable(GL_TEXTURE_GEN_S);
  158.    glEnable(GL_TEXTURE_1D);
  159.    glEnable(GL_CULL_FACE);
  160.    glEnable(GL_LIGHTING);
  161.    glEnable(GL_LIGHT0);
  162.    glEnable(GL_AUTO_NORMAL);
  163.    glEnable(GL_NORMALIZE);
  164.    glFrontFace(GL_CW);
  165.    glCullFace(GL_BACK);
  166.    glMaterialf (GL_FRONT, GL_SHININESS, 64.0);
  167. }
  168. void tfunc(void) {
  169.     static int state;
  170.     if (state ^= 1) {
  171. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  172. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  173. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  174. glTexImage1D(GL_TEXTURE_1D, 0, 4, stripeImageWidth, 0,
  175.                 GL_RGBA, GL_UNSIGNED_BYTE, rainbow);
  176.     } else {
  177. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  178. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  179. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  180. glTexImage1D(GL_TEXTURE_1D, 0, 4, stripeImageWidth, 0,
  181.                 GL_RGBA, GL_UNSIGNED_BYTE, stripeImage);
  182.     }
  183.     glutPostRedisplay();
  184. }
  185. void display(void) {
  186. #if 0
  187.     static GLUquadricObj *q = NULL;
  188. #endif
  189.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  190.    glPushMatrix();
  191.    glTranslatef(0., 0., transx);
  192.    glRotatef(rotx, 1.0, 0.0, 0.0);
  193.    glRotatef(45.0, 0.0, 0.0, 1.0);
  194.    glutSolidTeapot(2.0);
  195. #if 0
  196.    if (!q) q = gluNewQuadric();
  197.     gluQuadricTexture(q, GL_TRUE);
  198.    gluCylinder(q, 1.0, 2.0, 3.0, 10, 10);
  199. #endif
  200.    glPopMatrix();
  201.    glutSwapBuffers();
  202. }
  203. void reshape(int w, int h) {
  204.    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
  205.    glMatrixMode(GL_PROJECTION);
  206.    glLoadIdentity();
  207.    if (w <= h)
  208.       glOrtho (-3.5, 3.5, -3.5*(GLfloat)h/(GLfloat)w, 
  209.                3.5*(GLfloat)h/(GLfloat)w, -3.5, 3.5);
  210.    else
  211.       glOrtho (-3.5*(GLfloat)w/(GLfloat)h, 
  212.                3.5*(GLfloat)w/(GLfloat)h, -3.5, 3.5, -3.5, 3.5);
  213.    glMatrixMode(GL_MODELVIEW);
  214.    glLoadIdentity();
  215. }
  216. /*ARGSUSED1*/
  217. void keyboard (unsigned char key, int x, int y) {
  218.    switch (key) {
  219.       case 'e':
  220.       case 'E':
  221.          currentGenMode = GL_EYE_LINEAR;
  222.          currentPlane = GL_EYE_PLANE;
  223.          glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
  224.          glTexGenfv(GL_S, currentPlane, currentCoeff);
  225.          glutPostRedisplay();
  226.          break;
  227.       case 'o':
  228.       case 'O':
  229.          currentGenMode = GL_OBJECT_LINEAR;
  230.          currentPlane = GL_OBJECT_PLANE;
  231.          glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
  232.          glTexGenfv(GL_S, currentPlane, currentCoeff);
  233.          glutPostRedisplay();
  234.          break;
  235.       case 's':
  236.       case 'S':
  237.          currentCoeff = slanted;
  238.          glTexGenfv(GL_S, currentPlane, currentCoeff);
  239.          glutPostRedisplay();
  240.          break;
  241.       case 'x':
  242.       case 'X':
  243.          currentCoeff = xequalzero;
  244.          glTexGenfv(GL_S, currentPlane, currentCoeff);
  245.          glutPostRedisplay();
  246.          break;
  247.       case 't': tfunc(); break;
  248.       case 27:
  249.          exit(0);
  250.          break;
  251.       default:
  252.          break;
  253.    }
  254. }
  255. int main(int argc, char*argv[]) {
  256.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  257.     glutInitWindowSize(256, 256);
  258.     glutInitWindowPosition(100, 100);
  259.     glutInit(&argc, argv);
  260.     glutCreateWindow(argv[0]);
  261.     init();
  262.     glutDisplayFunc(display);
  263.     glutReshapeFunc(reshape);
  264.     glutKeyboardFunc(keyboard);
  265.     glutMouseFunc(mouse);
  266.     glutMotionFunc(motion);
  267.     glutMainLoop();
  268.     return 0;
  269. }