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

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. #if !defined(GL_VERSION_1_1) && !defined(GL_VERSION_1_2)
  7. #define glBindTexture glBindTextureEXT
  8. #endif
  9. static int the_texture;
  10. static int texture_count;
  11. static int shrink = 1;
  12. void afunc(void) {
  13.     static int state;
  14.     if (state ^= 1)
  15. glEnable(GL_ALPHA_TEST);
  16.     else
  17. glDisable(GL_ALPHA_TEST);
  18. }
  19. void bfunc(void) {
  20.     static int state;
  21.     if (state ^= 1)
  22. glEnable(GL_BLEND);
  23.     else
  24. glDisable(GL_BLEND);
  25. }
  26. void sfunc(void) {
  27.     shrink ^= 1;
  28. }
  29. void tfunc(void) {
  30.     static int state;
  31.     if (state ^= 1)
  32. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  33.     else
  34. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  35. }
  36. void fourfunc(void) {
  37.     static int state;
  38.     GLenum wrap;
  39.     int i;
  40.     glMatrixMode(GL_TEXTURE);
  41.     if (state ^= 1) {
  42. wrap = GL_REPEAT;
  43. glScalef(4.f, 4.f, 1.f);
  44.     } else {
  45. wrap = GL_CLAMP;
  46. glLoadIdentity();
  47.     }
  48.     glMatrixMode(GL_MODELVIEW);
  49.     for(i = 0; i < texture_count; i++) {
  50. glBindTexture(GL_TEXTURE_2D, i+1);
  51. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap);
  52. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap);
  53.     }
  54. }
  55. void help(void) {
  56.     printf("Usage: texmovie image0 ... imagenn");
  57.     printf("'h'            - helpn");
  58.     printf("'a'            - toggle alpha testn");
  59.     printf("'b'            - toggle blendn");
  60.     printf("'s'            - toggle shrinkn");
  61.     printf("'t'            - toggle MODULATE or REPLACEn");
  62.     printf("'4'            - toggle repeat by 4n");
  63. }
  64. void init(int argc, char *argv[]) {
  65.     unsigned *image;
  66.     int i, width, height, components;
  67.     glEnable(GL_TEXTURE_2D);
  68.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  69. if (argv[0] == NULL) {
  70.   char name[256];
  71.   for (i = 0; i < 32; i++) {
  72.    sprintf(name, "../data/flame/f%02d", i);
  73.       image = read_texture(name, &width, &height, &components);
  74.     if (image == NULL) {
  75.   fprintf(stderr, "Error: Can't load image file "%s".n", argv[i]);
  76.   exit(EXIT_FAILURE);
  77. } else {
  78.   printf("%d x %d image loadedn", width, height);
  79. }
  80. glBindTexture(GL_TEXTURE_2D, i+1);
  81. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  82. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  83. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  84. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  85. glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  86.  height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
  87. texture_count++;
  88.   }
  89. }
  90.     for(i = 0; i < argc; i++) {
  91. image = read_texture(argv[i], &width, &height, &components);
  92. if (image == NULL) {
  93.     fprintf(stderr, "Error: Can't load image file "%s".n",
  94.     argv[i]);
  95.     exit(EXIT_FAILURE);
  96. } else {
  97.     printf("%d x %d image loadedn", width, height);
  98. }
  99. glBindTexture(GL_TEXTURE_2D, i+1);
  100. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  101. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  102. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  103. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  104. glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  105.                  height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
  106. texture_count++;
  107.     }
  108.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  109.     glEnable(GL_TEXTURE_2D);
  110.     glClearColor(.25f, .25f, .25f, .25f);
  111.     glAlphaFunc(GL_GREATER, 0.f);
  112.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  113. }
  114. void
  115. animate(void) {
  116.     the_texture++;
  117.     if (the_texture >= texture_count) the_texture = 0;
  118.     glutPostRedisplay();
  119. }
  120. void display(void) {
  121.     glClear(GL_COLOR_BUFFER_BIT);
  122.     glBindTexture(GL_TEXTURE_2D, the_texture+1);
  123.     glPushMatrix();
  124.     if (shrink) glScalef(.5f, .5f, 1.f);
  125.     glBegin(GL_POLYGON);
  126. glTexCoord2f(0.0, 0.0);
  127. glVertex2f(-1.0, -1.0);
  128. glTexCoord2f(1.0, 0.0);
  129. glVertex2f(1.0, -1.0);
  130. glTexCoord2f(1.0, 1.0);
  131. glVertex2f(1.0, 1.0);
  132. glTexCoord2f(0.0, 1.0);
  133. glVertex2f(-1.0, 1.0);
  134.     glEnd();
  135.     glPopMatrix();
  136.     glutSwapBuffers();
  137. }
  138. void reshape(int w, int h) {
  139.     glViewport(0, 0, w, h);
  140. }
  141. /* ARGSUSED1 */
  142. void
  143. key(unsigned char key, int x, int y) {
  144.     switch(key) {
  145.     case 'a': afunc(); break;
  146.     case 'b': bfunc(); break;
  147.     case 'h': help(); break;
  148.     case 's': sfunc(); break;
  149.     case 't': tfunc(); break;
  150.     case '4': fourfunc(); break;
  151.     case '33': exit(EXIT_SUCCESS); break;
  152.     default: break;
  153.     }
  154.     glutPostRedisplay();
  155. }
  156. int main(int argc, char** argv) {
  157.     glutInitWindowSize(256, 256);
  158.     glutInit(&argc, argv);
  159.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  160.     (void)glutCreateWindow(argv[0]);
  161.     init(argc-1, argv+1);
  162.     glutDisplayFunc(display);
  163.     glutKeyboardFunc(key);
  164.     glutReshapeFunc(reshape);
  165.     glutIdleFunc(animate);
  166.     glutMainLoop();
  167.     return 0;
  168. }