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

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. #include "sm.h"
  7. /* Some <math.h> files do not define M_PI... */
  8. #ifndef M_PI
  9. #define M_PI 3.14159265358979323846
  10. #endif
  11. #ifndef __sgi
  12. /* Most math.h's do not define float versions of the trig functions. */
  13. #define sinf(x) ((float)sin((x)))
  14. #define cosf(x) ((float)cos((x)))
  15. #define atan2f(y, x) ((float)atan2((y), (x)))
  16. #endif
  17. #if !defined(GL_VERSION_1_1) && !defined(GL_VERSION_1_2)
  18. #define glBindTexture glBindTextureEXT
  19. #endif
  20. static void *smoke;
  21. static int marshmallow;
  22. static int the_texture;
  23. static int texture_count;
  24. static int texture = 1;
  25. static float rot = 0;
  26. static float opacity = 1.0;
  27. static float intensity = 1.0;
  28. static float transx, transy, rotx, roty;
  29. static int ox = -1, oy = -1;
  30. static int mot = 0;
  31. #define PAN 1
  32. #define ROT 2
  33. void
  34. pan(int x, int y) {
  35.     transx +=  (x-ox)/500.;
  36.     transy -= (y-oy)/500.;
  37.     ox = x; oy = y;
  38.     glutPostRedisplay();
  39. }
  40. void
  41. rotate(int x, int y) {
  42.     rotx += x-ox;
  43.     if (rotx > 360.) rotx -= 360.;
  44.     else if (rotx < -360.) rotx += 360.;
  45.     roty += y-oy;
  46.     if (roty > 360.) roty -= 360.;
  47.     else if (roty < -360.) roty += 360.;
  48.     ox = x; oy = y;
  49.     glutPostRedisplay();
  50. }
  51. void
  52. motion(int x, int y) {
  53.     if (mot == PAN) pan(x, y);
  54.     else if (mot == ROT) rotate(x,y);
  55. }
  56. void
  57. mouse(int button, int state, int x, int y) {
  58.     if(state == GLUT_DOWN) {
  59. switch(button) {
  60. case GLUT_LEFT_BUTTON:
  61.     mot = PAN;
  62.     motion(ox = x, oy = y);
  63.     break;
  64. case GLUT_RIGHT_BUTTON:
  65.     mot = ROT;
  66.     motion(ox = x, oy = y);
  67.     break;
  68. case GLUT_MIDDLE_BUTTON:
  69.     break;
  70. }
  71.     } else if (state == GLUT_UP) {
  72. mot = 0;
  73.     }
  74. }
  75. void afunc(void) {
  76.     static int state;
  77.     if (state ^= 1)
  78. glEnable(GL_ALPHA_TEST);
  79.     else
  80. glDisable(GL_ALPHA_TEST);
  81. }
  82. void bfunc(void) {
  83.     static int state;
  84.     if (state ^= 1)
  85. glEnable(GL_BLEND);
  86.     else
  87. glDisable(GL_BLEND);
  88. }
  89. void mfunc(void) {
  90.     marshmallow += 1;
  91.     if (marshmallow > 2) marshmallow = 0;
  92. }
  93. void sfunc(void) {
  94.     the_texture++;
  95.     if (the_texture >= texture_count) the_texture = 0;
  96. }
  97. void tfunc(void) {
  98.     static int state;
  99.     if (state ^= 1)
  100. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  101.     else
  102. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  103. }
  104. void fourfunc(void) {
  105.     static int state;
  106.     GLenum wrap;
  107.     int i;
  108.     glMatrixMode(GL_TEXTURE);
  109.     if (state ^= 1) {
  110. wrap = GL_REPEAT;
  111. glScalef(4.f, 4.f, 1.f);
  112.     } else {
  113. wrap = GL_CLAMP;
  114. glLoadIdentity();
  115.     }
  116.     glMatrixMode(GL_MODELVIEW);
  117.     for(i = 0; i < texture_count; i++) {
  118. glBindTexture(GL_TEXTURE_2D, i+1);
  119. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap);
  120. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap);
  121.     }
  122. }
  123. void help(void) {
  124.     printf("Usage: fire image0 ... imagenn");
  125.     printf("'h'            - helpn");
  126.     printf("'a'            - toggle alpha testn");
  127.     printf("'b'            - toggle blendn");
  128.     printf("'s'            - single stepn");
  129.     printf("'t'            - toggle MODULATE or REPLACEn");
  130.     printf("'m'            - marshmallown");
  131.     printf("'x'            - toggle animationn");
  132.     printf("left mouse     - pann");
  133.     printf("right mouse    - rotaten");
  134. }
  135. void init(int argc, char *argv[]) {
  136.     unsigned *image;
  137.     int i, width, height, components;
  138.     GLfloat pos[] = { 0.f, 1.f, 1.f, 0.f};
  139.     glEnable(GL_TEXTURE_2D);
  140.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  141.     for(i = 0; i < argc; i++) {
  142. image = read_texture(argv[i], &width, &height, &components);
  143. if (image == NULL) {
  144.     fprintf(stderr, "Error: Can't load image file "%s".n",
  145.     argv[i]);
  146.     exit(EXIT_FAILURE);
  147. } else {
  148.     printf("%d x %d image loadedn", width, height);
  149. }
  150. glBindTexture(GL_TEXTURE_2D, i+1);
  151. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  152. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  153. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  154. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  155. glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  156.                  height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
  157. texture_count++;
  158.     }
  159.     glBindTexture(GL_TEXTURE_2D, 1+texture_count);
  160.     image = read_texture("../data/smoke.bw", &width, &height, &components);
  161.     if (image == NULL) {
  162. fprintf(stderr, "Error: Can't load image file "%s".n", "smoke.la");
  163. exit(EXIT_FAILURE);
  164.     }
  165.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  166.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  167.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  168.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  169.     glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  170.      height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
  171.     smoke = new_smoke(0.f, 0.f, 0.f, .0f, 2.5f, 0.f, 25, .4f, 1+texture_count);
  172.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  173.     glEnable(GL_TEXTURE_2D);
  174.     glClearColor(.25f, .25f, .25f, .25f);
  175.     glLightfv(GL_LIGHT0, GL_POSITION, pos);
  176.     glMatrixMode(GL_PROJECTION);
  177.     glLoadIdentity();
  178.     gluPerspective(50.,1.,.1,20.);
  179.     glMatrixMode(GL_MODELVIEW);
  180.     glLoadIdentity();
  181.     glTranslatef(0.,0.,-5.5);
  182.     glClearColor(.25f, .25f, .75f, .25f);
  183.     glAlphaFunc(GL_GREATER, 0.016f);
  184.     glEnable(GL_ALPHA_TEST);
  185.     glEnable(GL_BLEND);
  186.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  187.     glEnable(GL_DEPTH_TEST);
  188.     glEnable(GL_LIGHT0);
  189.     glEnable(GL_NORMALIZE);
  190. }
  191. void
  192. animate(void) {
  193.     static int cnt;
  194.     if (cnt++ == 2) {
  195. the_texture++;
  196. if (the_texture >= texture_count) the_texture = 0;
  197. cnt = 0;
  198.     }
  199.     update_smoke(smoke, .003);
  200.     glutPostRedisplay();
  201. }
  202. void
  203. xfunc(void) {
  204.     static int state = 1;
  205.     glutIdleFunc((state ^= 1) ? animate : NULL);
  206. }
  207. void
  208. cube(void) {
  209.     glBegin(GL_QUADS);
  210. glNormal3f(0.f, 0.f, -1.f);
  211. glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  212. glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
  213. glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
  214. glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
  215. glNormal3f(0.f, 0.f, 1.f);
  216. glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
  217. glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
  218. glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
  219. glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
  220. glNormal3f(0.f, 1.f, 0.f);
  221. glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0, -1.0);
  222. glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0, -1.0);
  223. glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
  224. glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
  225. glNormal3f(0.f, -1.f, 0.f);
  226. glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  227. glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
  228. glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, -1.0,  1.0);
  229. glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0,  1.0);
  230. glNormal3f( 1.f, 0.f, 0.f);
  231. glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
  232. glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0, -1.0);
  233. glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
  234. glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0,  1.0);
  235. glNormal3f(-1.f, 0.f, 0.f);
  236. glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  237. glTexCoord2f(1.0, 0.0); glVertex3f(-1.0,  1.0, -1.0);
  238. glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
  239. glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0,  1.0);
  240.     glEnd();
  241. }
  242. void
  243. logs(void) {
  244.     static GLUquadricObj *quadric;
  245.     if (!quadric) {
  246. quadric = gluNewQuadric();
  247. glNewList(100, GL_COMPILE);
  248. gluQuadricOrientation(quadric, GLU_OUTSIDE);
  249. glTranslatef(0.f, 0.f, -2.f);
  250. gluCylinder(quadric, .5, .5, 4., 5, 1);
  251. glTranslatef(0.f, 0.f, 4.f);
  252. gluDisk(quadric, 0., .5, 10, 1);
  253. glTranslatef(0.f, 0.f, -4.f);
  254. gluQuadricOrientation(quadric, GLU_INSIDE);
  255. gluDisk(quadric, 0., .5, 10, 1);
  256. glEndList();
  257.     }
  258.     glPushMatrix();
  259.     glTranslatef(0.f, -.5f, 0.f);
  260.     glColor3f(.55f, .14f, .14f);
  261.     glPushMatrix();
  262.     glRotatef(55., 0., 1., 0.);
  263.     glCallList(100);
  264.     glPopMatrix();
  265.     glPushMatrix();
  266.     glRotatef(-55., 0., 1., 0.);
  267.     glCallList(100);
  268.     glPopMatrix();
  269.     if (marshmallow) {
  270. glPushMatrix();
  271. glColor4f(1.f, 1.f, 1.f, 1.f);
  272. glTranslatef(0.f, 1.7f, 0.f);
  273. glRotatef(45.f, 0.f, 0.f, 1.f);
  274. glRotatef(90.f, 0.f, 1.f, 0.f);
  275. glScalef(1., 1., .25f);
  276. glCallList(100);
  277. glPopMatrix();
  278. glPushMatrix();
  279. glColor4f(.1f, .1f, .1f, 1.f);
  280. glTranslatef(1.5f, 3.4f, 0.f);
  281. glRotatef(45.f, 0.f, 0.f, 1.f);
  282. glRotatef(90.f, 0.f, 1.f, 0.f);
  283. glScalef(.2f, .2f, 1.f);
  284. glCallList(100);
  285. glPopMatrix();
  286. if (marshmallow == 2) {
  287.     extern void drawDinosaur(void);
  288.     glDisable(GL_COLOR_MATERIAL);
  289.     glPushMatrix();
  290.     glTranslatef(10.f, 0.f, 0.f);
  291.     glRotatef(180.f, 0.f, 1.f, 0.f);
  292.     glScalef(.5f, .5f, .5f);
  293.     drawDinosaur();
  294.     glPopMatrix();
  295. }
  296.     }
  297.     glPopMatrix();
  298. }
  299. static void calcMatrix(void);
  300. void display(void) {
  301.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  302.     glLoadIdentity();
  303. #define RAD(x) (((x)*M_PI)/180.)
  304.     gluLookAt(-sinf(RAD(rotx))*5.5,transy,cosf(RAD(rotx))*5.5, 0.,0.,0., 0.,1.,0.);
  305.     glTranslatef(0.f, 0.f, transx*10.f);
  306.     /* floor */
  307.     glColor4f(0.f,.2f,0.f,1.f);
  308.     glBegin(GL_POLYGON);
  309. glVertex3f(-4.0, -1.0, -4.0);
  310. glVertex3f( 4.0, -1.0, -4.0);
  311. glVertex3f( 4.0, -1.0,  4.0);
  312. glVertex3f(-4.0, -1.0,  4.0);
  313.     glEnd();
  314.     glEnable(GL_COLOR_MATERIAL);
  315.     glEnable(GL_LIGHTING);
  316.     glColor3f(.1f,.1f,.1f);
  317.     glPushMatrix();
  318.     glTranslatef(-1.f, -1.+.2f, -1.5f);
  319.     glScalef(.2f,.2f, .2f);
  320.     logs();
  321.     /*cube();*/
  322.     glDisable(GL_LIGHTING);
  323.     glPopMatrix();
  324.     glPushMatrix();
  325.     glTranslatef(-1.f, -1.f+.2f, -1.5f);
  326.     calcMatrix();
  327.     draw_smoke(smoke);
  328.     glPopMatrix();
  329.     glPushMatrix();
  330.     glTranslatef(/*(delta/2.f*/-1.f, /*delta*/-.25f, -1.5f);
  331.     calcMatrix();
  332.     glScalef(1.f,1.f,1.);
  333.     if (texture) {
  334. glBindTexture(GL_TEXTURE_2D, the_texture+1);
  335. glEnable(GL_TEXTURE_2D);
  336.     }
  337.     glColor4f(intensity, intensity, intensity, opacity);
  338.     glRotatef(rot, 0., 0., 1.);
  339.     glDepthMask(0);
  340.     glBegin(GL_POLYGON);
  341. glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
  342. glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
  343. glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
  344. glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
  345.     glEnd();
  346.     glDepthMask(1);
  347.     glPopMatrix();
  348.     glDisable(GL_TEXTURE_2D);
  349.     glutSwapBuffers();
  350. }
  351. void reshape(int w, int h) {
  352.     glViewport(0, 0, w, h);
  353. }
  354. /* ARGSUSED1 */
  355. void
  356. key(unsigned char key, int x, int y) {
  357.     switch(key) {
  358.     case 'a': afunc(); break;
  359.     case 'b': bfunc(); break;
  360.     case 'h': help(); break;
  361.     case 'm': mfunc(); break;
  362.     case 's': sfunc(); break;
  363.     case 't': tfunc(); break;
  364.     case 'x': xfunc(); break;
  365.     case '33': exit(EXIT_SUCCESS); break;
  366.     default: break;
  367.     }
  368.     glutPostRedisplay();
  369. }
  370. int main(int argc, char** argv) {
  371.     glutInitWindowSize(512, 512);
  372.     glutInit(&argc, argv);
  373.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
  374.     (void)glutCreateWindow(argv[0]);
  375.     init(argc-1, argv+1);
  376.     glutDisplayFunc(display);
  377.     glutKeyboardFunc(key);
  378.     glutReshapeFunc(reshape);
  379.     glutMouseFunc(mouse);
  380.     glutMotionFunc(motion);
  381.     glutIdleFunc(animate);
  382.     glutMainLoop();
  383.     return 0;
  384. }
  385. void
  386. buildRot(float theta, float x, float y, float z, float m[16]) {
  387.     float d = x*x + y*y + z*z;
  388.     float ct = cosf(RAD(theta)), st = sinf(RAD(theta));
  389.     /* normalize */
  390.     if (d > 0) {
  391. d = 1/d;
  392. x *= d;
  393. y *= d;
  394. z *= d;
  395.     }
  396.     m[ 0] = 1; m[ 1] = 0; m[ 2] = 0; m[ 3] = 0;
  397.     m[ 4] = 0; m[ 5] = 1; m[ 6] = 0; m[ 7] = 0;
  398.     m[ 8] = 0; m[ 9] = 0; m[10] = 1; m[11] = 0;
  399.     m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1;
  400.     /* R = uu' + cos(theta)*(I-uu') + sin(theta)*S
  401.      *
  402.      * S =  0  -z   y    u' = (x, y, z)
  403.      *     z   0  -x
  404.      *    -y   x   0
  405.      */
  406.      m[0] = x*x + ct*(1-x*x) + st*0;
  407.      m[4] = x*y + ct*(0-x*y) + st*-z;
  408.      m[8] = x*z + ct*(0-x*z) + st*y;
  409.      m[1] = y*x + ct*(0-y*x) + st*z;
  410.      m[5] = y*y + ct*(1-y*y) + st*0;
  411.      m[9] = y*z + ct*(0-y*z) + st*-x;
  412.      m[2] = z*x + ct*(0-z*x) + st*-y;
  413.      m[6] = z*y + ct*(0-z*y) + st*x;
  414.      m[10]= z*z + ct*(1-z*z) + st*0;
  415. }
  416. static void
  417. calcMatrix(void) {
  418.     float mat[16];
  419.     glGetFloatv(GL_MODELVIEW_MATRIX, mat);
  420.     buildRot(-180*atan2f(mat[8], mat[10])/M_PI, 0, 1, 0, mat);
  421.     glMultMatrixf(mat);
  422. }