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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1998. */
  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 demonstrates how to use the texture matrix
  6.    and texture coordinate generation (texgen) to generate
  7.    window space texture coordinates for arbitrary 3D geometry.
  8.    The basic technique is to generate texture coordinates
  9.    directly matching the object coordinates and using the
  10.    texture matrix to mimic the viewport, projection, and
  11.    modelview transformations to convert the texture coordinates
  12.    into window coordinates identically to how the actual
  13.    object coordinates are transformed into window space.  It
  14.    is important to have perspective correct texturing if you
  15.    want perspective projections to look right. */
  16. #include <stdlib.h>
  17. #include <GL/glut.h>
  18. GLfloat lightDiffuse[] = {1.0, 0.0, 0.0, 1.0};  /* Red diffuse light. */
  19. GLfloat lightPosition[] = {1.0, 1.0, 1.0, 0.0};  /* Infinite light location. */
  20. GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
  21.   {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  22.   {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };
  23. GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
  24.   {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  25.   {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
  26. GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */
  27. GLfloat angle = -20.0;
  28. int animating = 1;
  29. #define TEX_WIDTH 16
  30. #define TEX_HEIGHT 16
  31. /* Nice circle texture tiling pattern. */
  32. static char *circles[] = {
  33.   "....xxxx........",
  34.   "..xxxxxxxx......",
  35.   ".xxxxxxxxxx.....",
  36.   ".xxx....xxx.....",
  37.   "xxx......xxx....",
  38.   "xxx......xxx....",
  39.   "xxx......xxx....",
  40.   "xxx......xxx....",
  41.   ".xxx....xxx.....",
  42.   ".xxxxxxxxxx.....",
  43.   "..xxxxxxxx......",
  44.   "....xxxx........",
  45.   "................",
  46.   "................",
  47.   "................",
  48.   "................",
  49. };
  50. /* Nice grid texture tiling pattern. */
  51. static char *grid[] = {
  52.   "..............xx",
  53.   "..............xx",
  54.   "..............xx",
  55.   "..............xx",
  56.   "..............xx",
  57.   "..............xx",
  58.   "..............xx",
  59.   "..............xx",
  60.   "..............xx",
  61.   "..............xx",
  62.   "..............xx",
  63.   "..............xx",
  64.   "..............xx",
  65.   "..............xx",
  66.   "xxxxxxxxxxxxxxxx",
  67.   "xxxxxxxxxxxxxxxx",
  68. };
  69. static void
  70. makeTexture(char *pattern[])
  71. {
  72.   GLubyte floorTexture[TEX_WIDTH][TEX_HEIGHT][3];
  73.   GLubyte *loc;
  74.   int s, t;
  75.   /* Setup RGB image for the texture. */
  76.   loc = (GLubyte*) floorTexture;
  77.   for (t = 0; t < TEX_HEIGHT; t++) {
  78.     for (s = 0; s < TEX_WIDTH; s++) {
  79.       if (pattern[t][s] == 'x') {
  80. /* Nice green. */
  81.         loc[0] = 0x6f;
  82.         loc[1] = 0x8f;
  83.         loc[2] = 0x1f;
  84.       } else {
  85. /* Light gray. */
  86.         loc[0] = 0xaa;
  87.         loc[1] = 0xaa;
  88.         loc[2] = 0xaa;
  89.       }
  90.       loc += 3;
  91.     }
  92.   }
  93.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  94.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  95.   glTexImage2D(GL_TEXTURE_2D, 0, 3, TEX_WIDTH, TEX_HEIGHT, 0,
  96.     GL_RGB, GL_UNSIGNED_BYTE, floorTexture);
  97. }
  98. void
  99. drawBox(void)
  100. {
  101.   int i;
  102.   for (i = 0; i < 6; i++) {
  103.     glBegin(GL_QUADS);
  104.     glNormal3fv(&n[i][0]);
  105.     glVertex3fv(&v[faces[i][0]][0]);
  106.     glVertex3fv(&v[faces[i][1]][0]);
  107.     glVertex3fv(&v[faces[i][2]][0]);
  108.     glVertex3fv(&v[faces[i][3]][0]);
  109.     glEnd();
  110.   }
  111. }
  112. void
  113. display(void)
  114. {
  115.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  116.   glPushMatrix();
  117.     glRotatef(angle, 0.0, 0.0, 1.0);
  118.     drawBox();
  119.   glPopMatrix();
  120.   glutSwapBuffers();
  121. }
  122. int windowWidth;
  123. int windowHeight;
  124. int slideX = 0, slideY = 0;
  125. void
  126. configTextureMatrix(void)
  127. {
  128.   glMatrixMode(GL_TEXTURE);
  129.   glLoadIdentity();
  130.   /* Shift texture in pixel units (slideX,slideY).  You could use this
  131.      to copensate for a viewport origin different from the window
  132.      origin. */
  133.   glTranslatef(slideX/(GLfloat)TEX_WIDTH,
  134.                slideY/(GLfloat)TEX_HEIGHT,
  135.        0.0);
  136.   /* Scale based on the window size in pixel. */
  137.   glScalef(windowWidth/(GLfloat)TEX_WIDTH,
  138.            windowHeight/(GLfloat)TEX_HEIGHT,
  139.    1.0);
  140.   /* Mimic the scene's projection matrix setup. */
  141.   gluPerspective( /* field of view in degree */ 40.0,
  142.     /* aspect ratio */ 1.0,
  143.     /* Z near */ 1.0, /* Z far */ 10.0);
  144.   /* Mimic the scene's view matrix setup. */
  145.   gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
  146.     0.0, 0.0, 0.0,      /* center is at (0,0,0) */
  147.     0.0, 1.0, 0.);      /* up is in positive Y direction */
  148.   /* Mimic the scene's model matrix setup. */
  149.   /* Adjust cube position to be aesthetic angle. */
  150.   glTranslatef(0.0, 0.0, -1.0);
  151.   glRotatef(60, 1.0, 0.0, 0.0);
  152.   glRotatef(angle, 0.0, 0.0, 1.0);
  153.   /* Switch back to the modelview matrix. */
  154.   glMatrixMode(GL_MODELVIEW);
  155. }
  156. void
  157. idle(void)
  158. {
  159.   /* Slowly rotate object. */
  160.   angle += 0.5;
  161.   if (angle > 360.0) {
  162.     angle -= 360.0;
  163.   }
  164.   /* Make sure the texture matrix mimics the changing
  165.      modelview matrix. */
  166.   configTextureMatrix();
  167.   glutPostRedisplay();
  168. }
  169. void
  170. keyboard(unsigned char c, int x, int y)
  171. {
  172.   switch(c) {
  173.   case 27: /* Escape */
  174.     exit(0);
  175.     break;
  176.   case 'h':
  177.     slideX--;
  178.     break;
  179.   case 'j':
  180.     slideY--;
  181.     break;
  182.   case 'k':
  183.     slideY++;
  184.     break;
  185.   case 'l':
  186.     slideX++;
  187.     break;
  188.   case 'r':
  189.     angle += 10;
  190.     break;
  191.   case 'a':
  192.     animating = !animating;
  193.     if (animating) {
  194.       glutIdleFunc(idle);
  195.     } else {
  196.       glutIdleFunc(NULL);
  197.     }
  198.     break;
  199.   }
  200.   configTextureMatrix();
  201.   glutPostRedisplay();
  202. }
  203. void
  204. reshape(int width, int height)
  205. {
  206.   windowWidth = width;
  207.   windowHeight = height;
  208.   glViewport(0, 0, width, height);
  209.   configTextureMatrix();
  210. }
  211. void
  212. init(void)
  213. {
  214.   static GLfloat sPlane[4] = { 1.0, 0.0, 0.0, 0.0 };
  215.   static GLfloat tPlane[4] = { 0.0, 1.0, 0.0, 0.0 };
  216.   static GLfloat rPlane[4] = { 0.0, 0.0, 1.0, 0.0 };
  217.   static GLfloat qPlane[4] = { 0.0, 0.0, 0.0, 1.0 };
  218.   /* Setup cube vertex data. */
  219.   v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
  220.   v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;
  221.   v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
  222.   v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;
  223.   v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;
  224.   v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;
  225.   /* Use depth buffering for hidden surface elimination. */
  226.   glEnable(GL_DEPTH_TEST);
  227.   /* Enable a single OpenGL light. */
  228.   glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
  229.   glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
  230.   glEnable(GL_LIGHT0);
  231.   /* Setup the view of the cube. */
  232.   glMatrixMode(GL_PROJECTION);
  233.   gluPerspective( /* field of view in degree */ 40.0,
  234.     /* aspect ratio */ 1.0,
  235.     /* Z near */ 1.0, /* Z far */ 10.0);
  236.   glMatrixMode(GL_MODELVIEW);
  237.   gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
  238.     0.0, 0.0, 0.0,      /* center is at (0,0,0) */
  239.     0.0, 1.0, 0.);      /* up is in positive Y direction */
  240.   /* Texgen that maps object coordinates directly to texture
  241.      coordinates. */
  242.   glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  243.   glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  244.   glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  245.   glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  246.   glTexGenfv(GL_S, GL_OBJECT_PLANE, sPlane);
  247.   glTexGenfv(GL_T, GL_OBJECT_PLANE, tPlane);
  248.   glTexGenfv(GL_R, GL_OBJECT_PLANE, rPlane);
  249.   glTexGenfv(GL_Q, GL_OBJECT_PLANE, qPlane);
  250.   glEnable(GL_TEXTURE_GEN_S);
  251.   glEnable(GL_TEXTURE_GEN_T);
  252.   glEnable(GL_TEXTURE_GEN_R);
  253.   glEnable(GL_TEXTURE_GEN_Q);
  254.   /* Enable texturing.  Perspective correct texturing is
  255.      important to this demo! */
  256.   glEnable(GL_TEXTURE_2D);
  257.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  258.   /* Adjust cube position to be aesthetic orientation. */
  259.   glTranslatef(0.0, 0.0, -1.0);
  260.   glRotatef(60, 1.0, 0.0, 0.0);
  261. }
  262. void
  263. menu(int selection)
  264. {
  265.   switch (selection) {
  266.   case 1:
  267.     glEnable(GL_LIGHTING);
  268.     glutPostRedisplay();
  269.     break;
  270.   case 2:
  271.     glDisable(GL_LIGHTING);
  272.     glutPostRedisplay();
  273.     break;
  274.   case 3:
  275.     keyboard('a', 0, 0);
  276.     break;
  277.   case 4:
  278.     makeTexture(circles);
  279.     break;
  280.   case 5:
  281.     makeTexture(grid);
  282.     break;
  283.   case 666:
  284.     exit(0);
  285.   }
  286. }
  287. void
  288. visibility(int state)
  289. {
  290.   if (state == GLUT_VISIBLE) {
  291.     if (animating) {
  292.       glutIdleFunc(idle);
  293.     }
  294.   } else {
  295.     glutIdleFunc(NULL);
  296.   }
  297. }
  298. int
  299. main(int argc, char **argv)
  300. {
  301.   glutInit(&argc, argv);
  302.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  303.   glutCreateWindow("window space aligned textures");
  304.   glutDisplayFunc(display);
  305.   glutReshapeFunc(reshape);
  306.   glutKeyboardFunc(keyboard);
  307.   glutVisibilityFunc(visibility);
  308.   init();
  309.   makeTexture(grid);
  310.   glutCreateMenu(menu);
  311.   glutAddMenuEntry("Enable lighting", 1);
  312.   glutAddMenuEntry("Disable lighting", 2);
  313.   glutAddMenuEntry("Animating", 3);
  314.   glutAddMenuEntry("Circles", 4);
  315.   glutAddMenuEntry("Grid", 5);
  316.   glutAddMenuEntry("Quit", 666);
  317.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  318.   glutMainLoop();
  319.   return 0;             /* ANSI C requires main to return int. */
  320. }