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

GIS编程

开发平台:

Visual C++

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "texture.h"
  5. #include <GL/glut.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. #define fabsf(x) ((float)fabs((x)))
  10. #endif
  11. static int pstyle = 3;
  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. void pfunc(void) { pstyle = (pstyle+1) % 4; }
  60. void help(void) {
  61.     printf("Usage: lightp [image]n");
  62.     printf("'h'            - helpn");
  63.     printf("'p'            - toggle point moden");
  64.     printf("left mouse     - pann");
  65.     printf("right mouse    - rotaten");
  66. }
  67. void init(char *filename) {
  68.     GLfloat fog_color[4], fog_density = 0.05, density, far_cull;
  69.     unsigned *image;
  70.     int width, height, components;
  71.     if (filename) {
  72. image = read_texture(filename, &width, &height, &components);
  73. if (image == NULL) {
  74.     fprintf(stderr, "Error: Can't load image file "%s".n",
  75.     filename);
  76.     exit(EXIT_FAILURE);
  77. } else {
  78.     printf("%d x %d image loadedn", width, height);
  79. }
  80. if (components != 1 && components != 2) {
  81.     printf("must be a l or la imagen");
  82.     exit(EXIT_FAILURE);
  83. }
  84. if (components == 1) {
  85.     /* hack for RE */
  86.     int i;
  87.     GLubyte *p = (GLubyte *)image;
  88.     for(i = 0; i < width*height; i++) {
  89. p[i*4+3] = p[i*4+0];
  90.     }
  91.     components = 2;
  92. }
  93.     } else {
  94. int i, j;
  95. unsigned char *img;
  96. components = 4; width = height = 512;
  97. image = (unsigned *) malloc(width*height*sizeof(unsigned));
  98. img = (unsigned char *)image;
  99. for (j = 0; j < height; j++)
  100.     for (i = 0; i < width; i++) {
  101. int w2 = width/2, h2 = height/2;
  102. if (i & 32)
  103.     img[4*(i+j*width)+0] = 0xff;
  104. else
  105.     img[4*(i+j*width)+1] = 0xff;
  106. if (j&32)
  107.     img[4*(i+j*width)+2] = 0xff;
  108. if ((i-w2)*(i-w2) + (j-h2)*(j-h2) > 64*64 &&
  109.     (i-w2)*(i-w2) + (j-h2)*(j-h2) < 300*300) img[4*(i+j*width)+3] = 0xff;
  110.     }
  111.     }
  112.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  113.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  114.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  115.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  116.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  117.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  118.     glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  119.                  height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  120.                  image);
  121.     /*glEnable(GL_TEXTURE_2D);*/
  122.     glMatrixMode(GL_PROJECTION);
  123.     glLoadIdentity();
  124.     gluPerspective(50.,1.,.1,far_cull = 10.);
  125.     glMatrixMode(GL_MODELVIEW);
  126.     glLoadIdentity();
  127.     glTranslatef(0.,0.,-5.5);
  128.     density = 1.- expf(-5.5 * fog_density * fog_density *
  129.       far_cull * far_cull);
  130. #define MAX(a,b) ((a) > (b) ? (a) : (b))
  131. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  132.     density = MAX(MIN(density, 1.), 0.);
  133.     fog_color[0] = .23*.19 + density *.57*.19;
  134.     fog_color[1] = .35*.19 + density *.45*.19;
  135.     fog_color[2] = .78*.19 + density *.22*.19;
  136.     glClearColor(fog_color[0], fog_color[1], fog_color[2], 1.f);
  137.     glFogi(GL_FOG_MODE, GL_EXP2);
  138.     glFogf(GL_FOG_DENSITY, fog_density);
  139.     glFogfv(GL_FOG_COLOR, fog_color);
  140.     if (fog_density > 0)
  141. glEnable(GL_FOG);
  142.     glLineWidth(2.0f);
  143.     glEnable(GL_LINE_SMOOTH);
  144.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  145.     glPointSize(10.f);
  146.     glEnable(GL_POINT_SMOOTH);
  147.     glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
  148. }
  149. void draw_base(void) {
  150.     glColor4f(.1, .3, .1, 1.0);
  151.     glBegin(GL_QUADS);
  152.     glTexCoord2f(0, 0); glVertex3f(-1.f, 0.f, -1.f);
  153.     glTexCoord2f(0, 1); glVertex3f(-1.f, 0.f,  1.f);
  154.     glTexCoord2f(1, 1); glVertex3f( 1.f, 0.f,  1.f);
  155.     glTexCoord2f(1, 0); glVertex3f( 1.f, 0.f, -1.f);
  156.     glEnd();
  157. }
  158. void draw_runway(void) {
  159.     glColor4f(.1, .1, .1, 1.0);
  160.     glPushMatrix();
  161.     glScalef(.1f, 1.f, 1.f);
  162.     glBegin(GL_QUADS);
  163.     glTexCoord2f(0, 0); glVertex3f(-1.f, 0.f, -1.f);
  164.     glTexCoord2f(0, 1); glVertex3f(-1.f, 0.f,  1.f);
  165.     glTexCoord2f(1, 1); glVertex3f( 1.f, 0.f,  1.f);
  166.     glTexCoord2f(1, 0); glVertex3f( 1.f, 0.f, -1.f);
  167.     glEnd();
  168.     glPopMatrix();
  169. }
  170. /* v0 = v1*mat */
  171. void xform(float *v0, float *mat, float *v1) {
  172.     v0[0] = v1[0]*mat[0] + v1[1]*mat[4] + v1[2]*mat[8] + v1[3]*mat[12];
  173.     v0[1] = v1[1]*mat[1] + v1[1]*mat[5] + v1[2]*mat[9] + v1[3]*mat[13];
  174.     v0[2] = v1[2]*mat[2] + v1[1]*mat[6] + v1[2]*mat[10] + v1[3]*mat[14];
  175.     v0[3] = v1[3]*mat[3] + v1[1]*mat[7] + v1[2]*mat[11] + v1[3]*mat[15];
  176. }
  177. /* m0 = m1*m2 */
  178. void xformm(float *m0, float *m1, float *m2) {
  179.     int i, j;
  180.     for(i = 0; i < 4; i++) {
  181. for(j = 0; j < 4; j++) {
  182.     m0[4*i+j] = m1[4*i+0]*m2[4*0+j] + m1[4*i+1]*m2[4*1+j] + m1[4*i+2]*m2[4*2+j] + m1[4*i+3]*m2[4*3+j];
  183. }
  184.     }
  185. }
  186. void draw_quad(float x, float y, float z) {
  187.     glPushMatrix();
  188.     glTranslatef(x, y, z);
  189.     glRotatef(90.f, 1.f, 0.f, 0.f);
  190.     glScalef(.03f, .03f, .03f);
  191.     glBegin(GL_QUADS);
  192.     glTexCoord2f(0, 0); glVertex3f(-1.f, 0.f, -1.f);
  193.     glTexCoord2f(0, 1); glVertex3f(-1.f, 0.f,  1.f);
  194.     glTexCoord2f(1, 1); glVertex3f( 1.f, 0.f,  1.f);
  195.     glTexCoord2f(1, 0); glVertex3f( 1.f, 0.f, -1.f);
  196.     glEnd();
  197.     glPopMatrix();
  198. }
  199. void draw_lights(void) {
  200.     int i;
  201.     GLfloat mat[16], matv[16], matp[16];
  202.     float v0[4], v1[4], v[4];
  203.     glEnable(GL_BLEND);
  204.     glColor4f(1.f, 1.f, 1.f, 1.0);
  205.     glPushMatrix();
  206.     if (pstyle != 3) {
  207. glScalef(.1f, 1.f, 1.f);
  208. if (pstyle == 0) glDisable(GL_POINT_SMOOTH);
  209. else glEnable(GL_POINT_SMOOTH);
  210. if (pstyle == 1) glPointSize(13.f);
  211. glGetFloatv(GL_MODELVIEW_MATRIX, matv);
  212. glGetFloatv(GL_PROJECTION_MATRIX, matp);
  213. xformm(mat, matv, matp);
  214. v[0] = -1.f;
  215. v[1] = 0.0f;
  216. v[3] = 1.0f;
  217. for(i = 0; i <= 20; i++) {
  218.     if (pstyle == 2) {
  219. float s;
  220. v[2] = -1.f+2.f/20*i;
  221. v[0] -= 1.;
  222. xform(v0, mat, v);
  223. v[0] += 2.;
  224. xform(v1, mat, v);
  225. v[0] -= 1.;
  226. s = fabsf(v0[0]/v0[3] - v1[0]/v1[3]);
  227. glPointSize(10.f*s);
  228.     }
  229.     glBegin(GL_POINTS);
  230.     glVertex3f(-1.f, 0.f, -1.f+2.f/20*i);
  231.     glVertex3f( 1.f, 0.f, -1.f+2.f/20*i);
  232.     glEnd();
  233. }
  234.     } else {
  235. glEnable(GL_TEXTURE_2D);
  236. glScalef(1.f, 10.f, 1.f);
  237. for(i = 0; i <= 20; i++) {
  238.     float v = -1.f+2.f/20*i;
  239.     draw_quad(-.1f, 0.f, v);
  240.     draw_quad( .1f, 0.f, v);
  241. }
  242. glDisable(GL_TEXTURE_2D);
  243.     }
  244.     glPopMatrix();
  245.     glDisable(GL_BLEND);
  246. }
  247. void display(void) {
  248.     glClear(GL_COLOR_BUFFER_BIT);
  249.     glPushMatrix();
  250.     glTranslatef(transx, transy, 0.f);
  251.     glRotatef(rotx, 0., 1., 0.);
  252.     glRotatef(roty, 1., 0., 0.);
  253.     glScalef(10.f,1.f,10.f);
  254.     glTranslatef(0.f,-.4f,0.f);
  255.     draw_base();
  256.     draw_runway();
  257.     draw_lights();
  258.     glPopMatrix();
  259.     glutSwapBuffers();
  260. }
  261. void reshape(int w, int h) {
  262.     glViewport(0, 0, w, h);
  263. }
  264. /*ARGSUSED1*/
  265. void
  266. key(unsigned char key, int x, int y) {
  267.     switch(key) {
  268.     case 'p': pfunc(); break;
  269.     case 'h': help(); break;
  270.     case '33': exit(EXIT_SUCCESS); break;
  271.     default: break;
  272.     }
  273.     glutPostRedisplay();
  274. }
  275. int main(int argc, char** argv) {
  276.     glutInitWindowSize(512, 512);
  277.     glutInit(&argc, argv);
  278.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  279.     (void)glutCreateWindow(argv[0]);
  280.     init(argc == 1 ? "../data/light.bw" : argv[1]);
  281.     glutDisplayFunc(display);
  282.     glutKeyboardFunc(key);
  283.     glutReshapeFunc(reshape);
  284.     glutMouseFunc(mouse);
  285.     glutMotionFunc(motion);
  286.     glutMainLoop();
  287.     return 0;
  288. }