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

GIS编程

开发平台:

Visual C++

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <GL/glut.h>
  5. #include "texture.h"
  6. #ifndef __sgi
  7. /* Most math.h's do not define float versions of the math functions. */
  8. #define expf(x) ((float)exp((x)))
  9. #endif
  10. static float ttrans[2];
  11. static float scale = 1.;
  12. static float transx, transy, rotx, roty;
  13. static int ox = -1, oy = -1;
  14. static int mot;
  15. #define PAN 1
  16. #define ROT 2
  17. void
  18. pan(int x, int y) {
  19.     transx +=  (x-ox)/500.;
  20.     transy -= (y-oy)/500.;
  21.     ox = x; oy = y;
  22.     glutPostRedisplay();
  23. }
  24. void
  25. rotate(int x, int y) {
  26.     rotx += x-ox;
  27.     if (rotx > 360.) rotx -= 360.;
  28.     else if (rotx < -360.) rotx += 360.;
  29.     roty += y-oy;
  30.     if (roty > 360.) roty -= 360.;
  31.     else if (roty < -360.) roty += 360.;
  32.     ox = x; oy = y;
  33.     glutPostRedisplay();
  34. }
  35. void
  36. motion(int x, int y) {
  37.     if (mot == PAN) pan(x, y);
  38.     else if (mot == ROT) rotate(x,y);
  39. }
  40. void
  41. mouse(int button, int state, int x, int y) {
  42.     if(state == GLUT_DOWN) {
  43. switch(button) {
  44. case GLUT_LEFT_BUTTON:
  45.     mot = PAN;
  46.     motion(ox = x, oy = y);
  47.     break;
  48. case GLUT_RIGHT_BUTTON:
  49.     mot = ROT;
  50.     motion(ox = x, oy = y);
  51.     break;
  52. case GLUT_MIDDLE_BUTTON:
  53.     break;
  54. }
  55.     } else if (state == GLUT_UP) {
  56. mot = 0;
  57.     }
  58. }
  59. #if NATE
  60. void 
  61. wire(void) {
  62.     static int w;
  63.     if (w ^= 1)
  64. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  65.     else
  66. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  67. }
  68. #endif
  69. void up(void) { scale += .1; }
  70. void down(void) { scale -= .1; }
  71. void
  72. animate(void) {
  73.     ttrans[0] += .01;
  74.     if (ttrans[0] == 1.0) ttrans[0] = 0;
  75.     ttrans[1] += .005;
  76.     if (ttrans[1] == 1.0) ttrans[1] = 0;
  77.     glutPostRedisplay();
  78. }
  79. void help(void) {
  80.     printf("Usage: cloud [image]n");
  81.     printf("'h'            - helpn");
  82. #if NATE
  83.     printf("'w'            - toggle wireframen");
  84. #endif
  85.     printf("'UP'           - scale upn");
  86.     printf("'DOWN'         - scale downn");
  87.     printf("left mouse     - pann");
  88.     printf("right mouse    - rotaten");
  89. }
  90. void init(char *filename) {
  91.     GLfloat cloud_color[4] = { 1., 1., 1., 0., };
  92.     GLfloat fog_color[4], fog_density = 0.05, density, far_cull;
  93.     unsigned *image;
  94.     int width, height, components;
  95.     if (filename) {
  96. image = read_texture(filename, &width, &height, &components);
  97. if (image == NULL) {
  98.     fprintf(stderr, "Error: Can't load image file "%s".n",
  99.     filename);
  100.     exit(EXIT_FAILURE);
  101. } else {
  102.     printf("%d x %d image loadedn", width, height);
  103. }
  104. if (components != 1) {
  105.     printf("must be a bw imagen");
  106.     exit(EXIT_FAILURE);
  107. }
  108.     } else {
  109. int i, j;
  110. unsigned char *img;
  111. components = 4; width = height = 512;
  112. image = (unsigned *) malloc(width*height*sizeof(unsigned));
  113. img = (unsigned char *)image;
  114. for (j = 0; j < height; j++)
  115.     for (i = 0; i < width; i++) {
  116. int w2 = width/2, h2 = height/2;
  117. if (i & 32)
  118.     img[4*(i+j*width)+0] = 0xff;
  119. else
  120.     img[4*(i+j*width)+1] = 0xff;
  121. if (j&32)
  122.     img[4*(i+j*width)+2] = 0xff;
  123. if ((i-w2)*(i-w2) + (j-h2)*(j-h2) > 64*64 &&
  124.     (i-w2)*(i-w2) + (j-h2)*(j-h2) < 300*300) img[4*(i+j*width)+3] = 0xff;
  125.     }
  126.     }
  127.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  128.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
  129.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, cloud_color);
  130.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  131.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  132.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  133.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  134.     glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  135.                  height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  136.                  image);
  137.     glEnable(GL_TEXTURE_2D);
  138.     glMatrixMode(GL_PROJECTION);
  139.     glLoadIdentity();
  140.     gluPerspective(50.,1.,.1,far_cull = 10.);
  141.     glMatrixMode(GL_MODELVIEW);
  142.     glLoadIdentity();
  143.     glTranslatef(0.,0.,-5.5);
  144.     density = 1.- expf(-5.5 * fog_density * fog_density *
  145.       far_cull * far_cull);
  146. #define MAX(a,b) ((a) > (b) ? (a) : (b))
  147. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  148.     density = MAX(MIN(density, 1.), 0.);
  149.     fog_color[0] = .23 + density *.57;
  150.     fog_color[1] = .35 + density *.45;
  151.     fog_color[2] = .78 + density *.22;
  152.     glClearColor(fog_color[0], fog_color[1], fog_color[2], 1.f);
  153.     glFogi(GL_FOG_MODE, GL_EXP2);
  154.     glFogf(GL_FOG_DENSITY, fog_density);
  155.     glFogfv(GL_FOG_COLOR, fog_color);
  156.     if (fog_density > 0)
  157. glEnable(GL_FOG);
  158. }
  159. void display(void) {
  160.     glClear(GL_COLOR_BUFFER_BIT);
  161.     glPushMatrix();
  162.     glTranslatef(transx, transy, 0.f);
  163.     glRotatef(rotx, 0., 1., 0.);
  164.     glRotatef(roty, 1., 0., 0.);
  165.     glScalef(scale,scale,1.);
  166.     glScalef(10,1,10);
  167.     glColor3f(.19, .25, .70);
  168.     glMatrixMode(GL_TEXTURE);
  169.     glPushMatrix();
  170.     glTranslatef(ttrans[0], ttrans[1], 0.);
  171.     glBegin(GL_QUADS);
  172.     glTexCoord2f(0, 0); glVertex3f(-1., 1., -1.);
  173.     glTexCoord2f(0, 5); glVertex3f(-1., 1.,  1.);
  174.     glTexCoord2f(5, 5); glVertex3f( 1., 1.,  1.);
  175.     glTexCoord2f(5, 0); glVertex3f( 1., 1., -1.);
  176.     glEnd();
  177.     glPopMatrix();
  178.     glMatrixMode(GL_MODELVIEW);
  179.     glPopMatrix();
  180.     glutSwapBuffers();
  181. }
  182. void reshape(int w, int h) {
  183.     glViewport(0, 0, w, h);
  184. }
  185. /*ARGSUSED1*/
  186. void
  187. key(unsigned char key, int x, int y) {
  188.     switch(key) {
  189. #if NATE
  190.     case 'w': wire(); break;
  191. #endif
  192.     case 'h': help(); break;
  193.     case '33': exit(EXIT_SUCCESS); break;
  194.     default: break;
  195.     }
  196.     glutPostRedisplay();
  197. }
  198. /*ARGSUSED1*/
  199. void
  200. special(int key, int x, int y) {
  201.     switch(key) {
  202.     case GLUT_KEY_UP: up(); break;
  203.     case GLUT_KEY_DOWN: down(); break;
  204.     }
  205. }
  206. int main(int argc, char** argv) {
  207.     glutInitWindowSize(512, 512);
  208.     glutInit(&argc, argv);
  209.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  210.     (void)glutCreateWindow(argv[0]);
  211.     init(argc == 1 ? "../data/clouds.bw" : argv[1]);
  212.     glutDisplayFunc(display);
  213.     glutKeyboardFunc(key);
  214.     glutSpecialFunc(special);
  215.     glutReshapeFunc(reshape);
  216.     glutMouseFunc(mouse);
  217.     glutMotionFunc(motion);
  218.     glutIdleFunc(animate);
  219.     glutMainLoop();
  220.     return 0;
  221. }