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

GIS编程

开发平台:

Visual C++

  1. #include "stdlib.h"
  2. #include "math.h"
  3. #include <GL/glut.h>
  4. #include "sm.h"
  5. #ifdef _WIN32
  6. #define drand48() ((double)rand()/RAND_MAX)
  7. #define srand48(x) (srand((x)))
  8. #endif
  9. #if !defined(GL_VERSION_1_1) && !defined(GL_VERSION_1_2)
  10. #define glBindTexture glBindTextureEXT
  11. #endif
  12. typedef struct elem {
  13.     float x, y, z; /* current position */
  14.     float dx, dy, dz; /* displacement */
  15.     float size; /* scale factor */
  16.     float ts; /* time stamp */
  17.     float opacity; /* alpha value */
  18. } elem_t;
  19. typedef struct smoke {
  20.     float ox, oy, oz; /* origin */
  21.     float dx, dy, dz; /* drift */
  22.     int elems;
  23.     float intensity;
  24.     float min_size;
  25.     float max_size;
  26.     unsigned texture;
  27.     elem_t *elem;
  28. } smoke_t;
  29. void *
  30. new_smoke(float x, float y, float z, float dx, float dy, float dz,
  31. int elems, float intensity, unsigned texture) {
  32.     int i;
  33.     smoke_t *s = malloc(sizeof(smoke_t));
  34.     s->ox = x; s->oy = y, s->oz = z;
  35.     s->dx = dx; s->dy = dy; s->dz = dz;
  36.     s->min_size = .1f;
  37.     s->max_size = 1.0;
  38.     s->elems = elems;
  39.     s->elem = malloc(sizeof(elem_t)*elems);
  40.     for(i = 0; i < elems; i++) {
  41. s->elem[i].ts = (float)i/elems;;
  42. s->elem[i].dx = -drand48()*1.5f;
  43. s->elem[i].dy = drand48()*1.5f;
  44. s->elem[i].dz = drand48()*1.5f;
  45.     }
  46.     s->intensity = intensity;
  47.     s->texture = texture;
  48.     return s;
  49. }
  50. void
  51. delete_smoke(void *smoke) {
  52.     smoke_t *s = smoke;
  53.     free(s->elem);
  54.     free(s);
  55. }
  56. void
  57. draw_smoke(void *smoke) {
  58.     smoke_t *s = smoke;
  59.     int i;
  60.     glEnable(GL_BLEND);
  61.     glDepthMask(0);
  62. #if 1
  63.     glEnable(GL_TEXTURE_2D);
  64. #else
  65.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  66. #endif
  67.     glBindTexture(GL_TEXTURE_2D, s->texture);
  68.     for(i = 0; i < s->elems; i++) {
  69. elem_t *e = s->elem+i;
  70. glPushMatrix();
  71. glTranslatef(e->x, e->y, e->z);
  72. glScalef(e->size, e->size, 1.);
  73. glColor4f(s->intensity,s->intensity,s->intensity,e->opacity);
  74. glBegin(GL_QUADS);
  75. glTexCoord2f(0, 0); glVertex3f(-1., -1., -0.);
  76. glTexCoord2f(0, 1); glVertex3f(-1., 1.,  0.);
  77. glTexCoord2f(1, 1); glVertex3f( 1., 1.,  0.);
  78. glTexCoord2f(1, 0); glVertex3f( 1., -1., -0.);
  79. glEnd();
  80. glPopMatrix();
  81.     }
  82.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  83.     glDisable(GL_TEXTURE_2D);
  84.     glDepthMask(1);
  85.     glDisable(GL_BLEND);
  86. }
  87. void
  88. update_smoke(void *smoke, float tick) {
  89.     smoke_t *s = smoke;
  90.     int i;
  91.     for(i = 0; i < s->elems; i++) {
  92. elem_t *e = s->elem+i;
  93. e->ts += tick;
  94. if (e->ts > 1.0) e->ts = 0;
  95. e->x = s->ox + s->dx*e->ts + e->dx*e->ts;
  96. e->y = s->oy + s->dy*e->ts + e->dy*e->ts;
  97. e->z = s->oz + s->dz*e->ts + e->dz*e->ts;
  98. e->size = s->min_size + e->ts*s->max_size;
  99. e->opacity = (1.0-e->ts);
  100.     }
  101. }