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

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 transx, transy, rotx, roty;
  12. static int ox = -1, oy = -1;
  13. static int mot;
  14. #define PAN 1
  15. #define ROT 2
  16. void
  17. pan(int x, int y) {
  18.     transx +=  (x-ox)/500.;
  19.     transy -= (y-oy)/500.;
  20.     ox = x; oy = y;
  21.     glutPostRedisplay();
  22. }
  23. void
  24. rotate(int x, int y) {
  25.     rotx += x-ox;
  26.     if (rotx > 360.) rotx -= 360.;
  27.     else if (rotx < -360.) rotx += 360.;
  28.     roty += y-oy;
  29.     if (roty > 360.) roty -= 360.;
  30.     else if (roty < -360.) roty += 360.;
  31.     ox = x; oy = y;
  32.     glutPostRedisplay();
  33. }
  34. void
  35. motion(int x, int y) {
  36.     if (mot == PAN) pan(x, y);
  37.     else if (mot == ROT) rotate(x,y);
  38. }
  39. void
  40. mouse(int button, int state, int x, int y) {
  41.     if(state == GLUT_DOWN) {
  42. switch(button) {
  43. case GLUT_LEFT_BUTTON:
  44.     mot = PAN;
  45.     motion(ox = x, oy = y);
  46.     break;
  47. case GLUT_RIGHT_BUTTON:
  48.     mot = ROT;
  49.     motion(ox = x, oy = y);
  50.     break;
  51. case GLUT_MIDDLE_BUTTON:
  52.     break;
  53. }
  54.     } else if (state == GLUT_UP) {
  55. mot = 0;
  56.     }
  57. }
  58. void
  59. animate(void) {
  60.     ttrans[0] += .010f;
  61.     if (ttrans[0] == 1.0f) ttrans[0] = 0.0f;
  62.     ttrans[1] -= .020f;
  63.     if (ttrans[1] <= 0.0f) ttrans[1] = 1.0f;
  64.     glutPostRedisplay();
  65. }
  66. void xfunc(void) {
  67.     static state = 1;
  68.     glutIdleFunc((state ^= 1) ? animate : NULL);
  69. }
  70. void help(void) {
  71.     printf("Usage: cloudl [image]n");
  72.     printf("'h'            - helpn");
  73.     printf("'x'            - toggle cloud motionn");
  74.     printf("left mouse     - pann");
  75.     printf("middle mouse   - rotaten");
  76. }
  77. void init(char *filename) {
  78.     GLfloat fog_color[4], fog_density = 0.05, density, far_cull;
  79.     unsigned *image;
  80.     int width, height, components;
  81.     if (filename) {
  82. image = read_texture(filename, &width, &height, &components);
  83. if (image == NULL) {
  84.     fprintf(stderr, "Error: Can't load image file "%s".n",
  85.     filename);
  86.     exit(EXIT_FAILURE);
  87. } else {
  88.     printf("%d x %d image loadedn", width, height);
  89. }
  90. if (components != 1 && components != 2) {
  91.     printf("must be a l or la imagen");
  92.     exit(EXIT_FAILURE);
  93. }
  94. if (components == 1) {
  95.     /* hack for RE */
  96.     int i;
  97.     GLubyte *p = (GLubyte *)image;
  98.     for(i = 0; i < width*height; i++) {
  99. p[i*4+3] = p[i*4+0];
  100.     }
  101.     components = 2;
  102. }
  103.     } else {
  104. int i, j;
  105. unsigned char *img;
  106. components = 4; width = height = 512;
  107. image = (unsigned *) malloc(width*height*sizeof(unsigned));
  108. img = (unsigned char *)image;
  109. for (j = 0; j < height; j++)
  110.     for (i = 0; i < width; i++) {
  111. int w2 = width/2, h2 = height/2;
  112. if (i & 32)
  113.     img[4*(i+j*width)+0] = 0xff;
  114. else
  115.     img[4*(i+j*width)+1] = 0xff;
  116. if (j&32)
  117.     img[4*(i+j*width)+2] = 0xff;
  118. if ((i-w2)*(i-w2) + (j-h2)*(j-h2) > 64*64 &&
  119.     (i-w2)*(i-w2) + (j-h2)*(j-h2) < 300*300) img[4*(i+j*width)+3] = 0xff;
  120.     }
  121.     }
  122.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  123.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  124.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  125.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  126.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  127.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  128.     glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  129.                  height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  130.                  image);
  131.     /*glEnable(GL_TEXTURE_2D);*/
  132.     glMatrixMode(GL_PROJECTION);
  133.     glLoadIdentity();
  134.     gluPerspective(50.,1.,.1,far_cull = 10.);
  135.     glMatrixMode(GL_MODELVIEW);
  136.     glLoadIdentity();
  137.     glTranslatef(0.,0.,-5.5);
  138.     density = 1.- expf(-5.5 * fog_density * fog_density *
  139.       far_cull * far_cull);
  140. #define MAX(a,b) ((a) > (b) ? (a) : (b))
  141. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  142.     density = MAX(MIN(density, 1.), 0.);
  143.     fog_color[0] = .23*.2 + density *.57*.2;
  144.     fog_color[1] = .35*.2 + density *.45*.2;
  145.     fog_color[2] = .78*.5 + density *.22*.2;
  146.     glClearColor(fog_color[0], fog_color[1], fog_color[2], 1.f);
  147.     glFogi(GL_FOG_MODE, GL_EXP2);
  148.     glFogf(GL_FOG_DENSITY, fog_density);
  149.     glFogfv(GL_FOG_COLOR, fog_color);
  150.     if (fog_density > 0)
  151. glEnable(GL_FOG);
  152.     glLineWidth(2.0f);
  153.     glEnable(GL_LINE_SMOOTH);
  154.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  155.     glPointSize(10.f);
  156.     glEnable(GL_POINT_SMOOTH);
  157.     glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
  158. }
  159. void draw_base(void) {
  160.     glColor4f(.1, .3, .1, 1.0);
  161.     glBegin(GL_QUADS);
  162.     glTexCoord2f(0, 0); glVertex3f(-1.f, 0.f, -1.f);
  163.     glTexCoord2f(0, 1); glVertex3f(-1.f, 0.f,  1.f);
  164.     glTexCoord2f(1, 1); glVertex3f( 1.f, 0.f,  1.f);
  165.     glTexCoord2f(1, 0); glVertex3f( 1.f, 0.f, -1.f);
  166.     glEnd();
  167. }
  168. void draw_runway(void) {
  169.     glColor4f(.1, .1, .1, 1.0);
  170.     glPushMatrix();
  171.     glScalef(.1f, 1.f, 1.f);
  172.     glBegin(GL_QUADS);
  173.     glTexCoord2f(0, 0); glVertex3f(-1.f, 0.f, -1.f);
  174.     glTexCoord2f(0, 1); glVertex3f(-1.f, 0.f,  1.f);
  175.     glTexCoord2f(1, 1); glVertex3f( 1.f, 0.f,  1.f);
  176.     glTexCoord2f(1, 0); glVertex3f( 1.f, 0.f, -1.f);
  177.     glEnd();
  178.     glPopMatrix();
  179. }
  180. void draw_lights(void) {
  181.     int i;
  182.     glEnable(GL_BLEND);
  183.     glColor4f(.7f, .7f, .1f, 1.0);
  184.     glPushMatrix();
  185.     glScalef(.1f, 1.f, 1.f);
  186.     glEnable(GL_POINT_SMOOTH);
  187.     for(i = 0; i <= 20; i++) {
  188. glPointSize((float)i/2.);
  189. glBegin(GL_POINTS);
  190. glVertex3f(-1.f, 0.f, -1.f+2.f/20*i);
  191. glVertex3f( 1.f, 0.f, -1.f+2.f/20*i);
  192. glEnd();
  193.     }
  194.     glPopMatrix();
  195.     glDisable(GL_BLEND);
  196. }
  197. void
  198. draw_clouds(void) {
  199.     glEnable(GL_BLEND);
  200.     glEnable(GL_TEXTURE_2D);
  201.     glMatrixMode(GL_TEXTURE);
  202.     glPushMatrix();
  203.     glTranslatef(ttrans[0], ttrans[1], 0.);
  204.     glColor4f(1.f, 1.f, 1.f, 1.0);
  205.     glBegin(GL_QUADS);
  206.     glTexCoord2f(0, 0); glVertex3f(-1., .2, -1.);
  207.     glTexCoord2f(0, 5); glVertex3f(-1., .2,  1.);
  208.     glTexCoord2f(5, 5); glVertex3f( 1., .2,  1.);
  209.     glTexCoord2f(5, 0); glVertex3f( 1., .2, -1.);
  210.     glEnd();
  211.     glPopMatrix();
  212.     glMatrixMode(GL_MODELVIEW);
  213.     glDisable(GL_TEXTURE_2D);
  214.     glDisable(GL_BLEND);
  215. }
  216. void display(void) {
  217.     glClear(GL_COLOR_BUFFER_BIT);
  218.     glPushMatrix();
  219.     glTranslatef(transx, transy, 0.f);
  220.     glRotatef(rotx, 0., 1., 0.);
  221.     glRotatef(roty, 1., 0., 0.);
  222.     glScalef(10,1,10);
  223.     glTranslatef(0.f,-1.f,0.f);
  224.     draw_base();
  225.     draw_runway();
  226.     draw_lights();
  227.     draw_clouds();
  228.     glPopMatrix();
  229.     glutSwapBuffers();
  230. }
  231. void reshape(int w, int h) {
  232.     glViewport(0, 0, w, h);
  233. }
  234. /*ARGSUSED1*/
  235. void
  236. key(unsigned char key, int x, int y) {
  237.     switch(key) {
  238.     case 'x': xfunc(); break;
  239.     case 'h': help(); break;
  240.     case '33': exit(EXIT_SUCCESS); break;
  241.     default: break;
  242.     }
  243.     glutPostRedisplay();
  244. }
  245. int main(int argc, char** argv) {
  246.     glutInitWindowSize(512, 512);
  247.     glutInit(&argc, argv);
  248.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  249.     (void)glutCreateWindow(argv[0]);
  250.     init(argc == 1 ? "../data/clouds.bw" : argv[1]);
  251.     glutDisplayFunc(display);
  252.     glutKeyboardFunc(key);
  253.     glutReshapeFunc(reshape);
  254.     glutMouseFunc(mouse);
  255.     glutMotionFunc(motion);
  256.     glutIdleFunc(animate);
  257.     glutMainLoop();
  258.     return 0;
  259. }