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

GIS编程

开发平台:

Visual C++

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "texture.h"
  7. /* Some <math.h> files do not define M_PI... */
  8. #ifndef M_PI
  9. #define M_PI 3.14159265358979323846
  10. #endif
  11. #ifdef _WIN32
  12. #include <windows.h>
  13. #define sleep(x) Sleep((x*1000))
  14. #else
  15. #include <unistd.h>
  16. #endif
  17. #include <GL/glut.h>
  18. const char defaultBaseName[] = "../data/";
  19. GLuint *faces[6];
  20. GLsizei faceW[6], faceH[6];
  21. GLfloat angle1[6] = {90, 180, 270, 0, 90, -90};
  22. GLfloat axis1[6][3] = {{0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {1,0,0}, {1,0,0}};
  23. GLfloat angle2[6] = {0, 0, 0, 0, 180, 180};
  24. GLfloat axis2[6][3] = {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,1,0}, {0,1,0}};
  25. GLuint *load_texture(const char *fname, GLsizei *w, GLsizei *h)
  26. {
  27.     int comps;
  28.     GLuint *img;
  29.     int i;
  30.     img = read_texture(fname, w, h, &comps);
  31.     if (!img) {
  32. fprintf(stderr, "Could not open %sn", fname);
  33. exit(1);
  34.     }
  35.     for (i = 0; i < *w * *h; i++) {
  36. img[i] |= 0xff;
  37.     }
  38.     return img;
  39. }
  40. void set_texture_border(GLuint val, GLuint mask, 
  41. GLsizei w, GLsizei h, GLuint *pix)
  42. {
  43.     int x, y;
  44.     val &= mask;
  45.     mask = ~mask;
  46.     /* top & bottom rows */
  47.     for (x = 0; x < w; x++) {
  48. pix[x] = (pix[x] & mask) | val;
  49. pix[x + (h-1)*w] = (pix[x + (h-1)*w] & mask) | val;
  50.     }
  51.     for (y = 0; y < h; y++) {
  52. pix[y*w] = (pix[y*w] & mask) | val;
  53. pix[y*w + (w-1)] = (pix[y*w + (w-1)] & mask) | val;
  54.     }
  55. }
  56. void init(void)
  57. {
  58.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  59.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  60. }
  61. void reshape(GLsizei w, GLsizei h) 
  62. {
  63.     glViewport(0, 0, w, h);
  64.     glLoadIdentity();
  65.     glOrtho(-2, 2, -2, 2, 0, 5);
  66. }
  67. void draw_special_sphere(int tess)
  68. {
  69.     float r = 1.0, r1, r2, z1, z2;
  70.     float theta, phi;
  71.     int nlon = tess, nlat = tess;
  72.     int i, j;
  73.     glBegin(GL_TRIANGLE_FAN);
  74.     theta = M_PI*1.0/nlat;
  75.     r2 = r*sin(theta); z2 = r*cos(theta);
  76.     glNormal3f(0.0, 0.0, 1.0);
  77.     glVertex4f(0.0, 0.0, r*r, r);
  78.     for (j = 0, phi = 0.0; j <= nlon; j++, phi = 2*M_PI*j/nlon) {
  79. glNormal3f(r2*cos(phi), r2*sin(phi), z2);
  80. glVertex4f(r2*cos(phi)*z2, r2*sin(phi)*z2, z2*z2, z2); /* top */
  81.     }
  82.     glEnd();
  83.     for (i = 2; i < nlat; i++) {
  84. theta = M_PI*i/nlat;
  85. r1 = r*sin(M_PI*(i-1)/nlat); z1 = r*cos(M_PI*(i-1)/nlat);
  86. r2 = r*sin(theta); z2 = r*cos(theta);
  87. if (fabs(z1) < 0.01 || fabs(z2) < 0.01)
  88.     break;
  89. glBegin(GL_QUAD_STRIP);
  90. for (j = 0, phi = 0; j <= nlat; j++, phi = 2*M_PI*j/nlon) {
  91.     glNormal3f(r1*cos(phi), r1*sin(phi), z1);
  92.     glVertex4f(r1*cos(phi)*z1, r1*sin(phi)*z1, z1*z1, z1);
  93.     glNormal3f(r2*cos(phi), r2*sin(phi), z2);
  94.     glVertex4f(r2*cos(phi)*z2, r2*sin(phi)*z2, z2*z2, z2);
  95. }
  96. glEnd();
  97.     }
  98. }
  99. void render_spheremap(int width, int height)
  100. {
  101.     GLfloat p[4];
  102.     int i;
  103.     glColor4f(1, 1, 1, 1);
  104.     glEnable(GL_TEXTURE_2D);
  105.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  106.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  107.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  108.     glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  109.     p[0] = 2.0; p[1] = p[2] = p[3] = 0.0; /* 2zx */
  110.     glTexGenfv(GL_S, GL_OBJECT_PLANE, p);
  111.   
  112.     glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  113.     p[0] = 0.0; p[1] = 2.0; p[2] = p[3] = 0.0; /* 2zy */
  114.     glTexGenfv(GL_T, GL_OBJECT_PLANE, p);
  115.   
  116.     glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  117.     p[0] = p[1] = 0.0; p[2] = 0.0; p[3] = 2.0; /* 2z */
  118.     glTexGenfv(GL_R, GL_OBJECT_PLANE, p);
  119.     glEnable(GL_TEXTURE_GEN_S);
  120.     glEnable(GL_TEXTURE_GEN_T);
  121.     glEnable(GL_TEXTURE_GEN_R);
  122.   
  123.     glMatrixMode(GL_PROJECTION);
  124.     glPushMatrix();
  125.     glMatrixMode(GL_MODELVIEW);
  126.     glPushMatrix();
  127.     glMatrixMode(GL_TEXTURE);
  128.     glPushMatrix();
  129.     glMatrixMode(GL_PROJECTION);
  130.     glLoadIdentity();
  131.     glOrtho(-1, 1, -1, 1, 1.0, 100);
  132.     glMatrixMode(GL_MODELVIEW);
  133.     glLoadIdentity();
  134.     gluLookAt(0, 0, 6,
  135.       0, 0, 0,
  136.       0, 1, 0);
  137.     glEnable(GL_DEPTH_TEST);
  138.     glEnable(GL_CULL_FACE);
  139.     glEnable(GL_BLEND);
  140.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  141.     glClearColor(0.0, 0.0, 0.0, 1.0);
  142.     glClearDepth(1.0);
  143.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  144.     for (i = 0; i < 6; i++) {
  145. glTexImage2D(GL_TEXTURE_2D, 0, 4, faceW[i], faceH[i], 0, 
  146.      GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)faces[i]);
  147. glMatrixMode(GL_TEXTURE);
  148. glLoadIdentity();
  149. glScalef(0.5, 0.5, 1.0);
  150. glTranslatef(1.0, 1.0, 0.0);
  151. glFrustum(-1.01, 1.01, -1.01, 1.01, 1.0, 100.0);
  152. if (angle2[i]) {
  153.     glRotatef(angle2[i], axis2[i][0], axis2[i][1], axis2[i][2]);
  154. }
  155. glRotatef(angle1[i], axis1[i][0], axis1[i][1], axis1[i][2]);
  156.     
  157. /* XXX atul does another angle thing here... */
  158. /* XXX atul does a third angle thing here... */
  159.     
  160. glTranslatef(0.0, 0.0, -1.00);
  161.     
  162. glMatrixMode(GL_MODELVIEW);
  163. glClear(GL_DEPTH_BUFFER_BIT);
  164. draw_special_sphere(20);
  165. sleep(1);
  166.     }
  167.     glDisable(GL_BLEND);
  168.     glDisable(GL_CULL_FACE);
  169.     glMatrixMode(GL_PROJECTION);
  170.     glPopMatrix();
  171.     glMatrixMode(GL_MODELVIEW);
  172.     glPopMatrix();
  173.     glMatrixMode(GL_TEXTURE);
  174.     glPopMatrix();
  175.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  176.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  177.     glDisable(GL_TEXTURE_GEN_S);
  178.     glDisable(GL_TEXTURE_GEN_T);
  179.     glDisable(GL_TEXTURE_GEN_R);
  180.     glDisable(GL_TEXTURE_2D);
  181. }
  182. void draw(void)
  183. {
  184.     GLenum err;
  185.     glClear(GL_COLOR_BUFFER_BIT);
  186.     render_spheremap(256, 256);
  187.     err = glGetError();
  188.     if (err != GL_NO_ERROR) printf("Error:  %sn", gluErrorString(err));
  189. }
  190. /* ARGSUSED1 */
  191. void key(unsigned char key, int x, int y)
  192. {
  193.     if (key == 27) exit(0);
  194. }
  195. void show_usage(void)
  196. {
  197.     fprintf(stderr, "Usage:n");
  198.     fprintf(stderr, "genspheremap -- use default files"
  199.     "(%s00.rgb through %s05.rgb)n", defaultBaseName, defaultBaseName);
  200.     fprintf(stderr, "genspheremap baseName -- use files of the form "
  201.     "baseName0.rgb through baseName5.rgbn");
  202.     fprintf(stderr, "genspheremap f0.rgb f1.rgb f2.rgb f3.rgb f4.rgb f5.rgbn");
  203. }
  204. main(int argc, char *argv[])
  205. {
  206.     const char *baseName;
  207.     char fname[128];
  208.     int i;
  209.     glutInitWindowSize(512, 512);
  210.     glutInitWindowPosition(0, 0);
  211.     glutInit(&argc, argv);
  212.     glutInitDisplayMode(GLUT_RGB);
  213.     glutCreateWindow(argv[0]);
  214.     glutDisplayFunc(draw);
  215.     glutKeyboardFunc(key);
  216.     glutReshapeFunc(reshape);
  217.     init();
  218.     if (argc == 1 || argc == 2) {
  219. if (argc == 1) baseName = defaultBaseName;
  220. else baseName = argv[1];
  221. assert(strlen(baseName) < 128 - (strlen("0.rgb") + 1));
  222. for (i = 0; i < 6; i++) {
  223.     sprintf(fname, "%s%02d.rgb", baseName, i);
  224.     faces[i] = load_texture(fname, &faceW[i], &faceH[i]);
  225. }
  226.     } else if (argc == 7) {
  227. for (i = 0; i < 6; i++) {
  228.     faces[i] = load_texture(fname, &faceW[i], &faceH[i]);
  229. }
  230.     } else {
  231. show_usage();
  232. exit(1);
  233.     }
  234.   
  235.     for (i = 0; i < 6; i++) {
  236. set_texture_border(0x00, 0xff, faceW[i], faceH[i], faces[i]);
  237.     }
  238.   
  239.     glutMainLoop();
  240.     return 0;
  241. }