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

GIS编程

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <GL/glut.h>
  5. #include "texture.h"
  6. static unsigned *image;
  7. static int width, height, components;
  8. static float incr = .01, dir = 1.0;
  9. static float scale = 1.0, tscale = 1.0, trotx, troty;
  10. static float transx = 1.0, transy, rotx, roty;
  11. static int ox = -1, oy = -1;
  12. static int mot = 0;
  13. float *wrotx = &rotx, *wroty = &roty, *wscale = &scale;
  14. #define PAN 1
  15. #define ROT 2
  16. void
  17. pan(const int x, const int y) {
  18.     transx +=  (x-ox)/5.;
  19.     transy -= (y-oy)/5.;
  20.     ox = x; oy = y;
  21.     glutPostRedisplay();
  22. }
  23. void
  24. rotate(const int x, const int y) {
  25.     *wrotx += x-ox;
  26.     if (*wrotx > 360.) *wrotx -= 360.;
  27.     else if (*wrotx < -360.) *wrotx += 360.;
  28.     *wroty += y-oy;
  29.     if (*wroty > 360.) *wroty -= 360.;
  30.     else if (*wroty < -360.) *wroty += 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_MIDDLE_BUTTON:
  48.     mot = ROT;
  49.     motion(ox = x, oy = y);
  50.     break;
  51. case GLUT_RIGHT_BUTTON:
  52.     break;
  53. }
  54.     } else if (state == GLUT_UP) {
  55. mot = 0;
  56.     }
  57. }
  58. #define MAXMESH 64
  59. float Ml[4*2*(MAXMESH+1)*2 * (MAXMESH+1)];
  60. float N = 1.5;
  61. float B = -1.5;
  62. void
  63. mesh1(float x0, float x1, float y0, float y1,
  64.           float s0, float s1, float t0, float t1, float z, int nx, int ny)
  65. {
  66.     float y,x,s,t,dx,dy,ds,dt,vb[3],tb[2];
  67.     float v;
  68.     float *mp = Ml;
  69.     dx = (x1-x0)/nx;
  70.     dy = (y1-y0)/ny;
  71.     ds = (s1-s0)/nx;
  72.     dt = (t1-t0)/ny;
  73.     y = y0;
  74.     t = t0;
  75.     vb[2] = z;
  76.     while (y < y1) {
  77.         x = x0;
  78.         s = s0;
  79.         while(x <= x1) {
  80.             tb[0] = s; tb[1] = t;
  81.             vb[0] = x; vb[1] = y;
  82.             v = N*N - x*x - y*y;
  83.             if (v < 0.0) v = 0.0;
  84.             vb[2] = sqrt(v) + B;
  85.             if (vb[2] < 0.) vb[2] = 0.0;
  86.             *mp++ = tb[0];
  87.             *mp++ = tb[1];
  88.             mp += 2;
  89.             *mp++ = vb[0];
  90.             *mp++ = vb[1];
  91.             *mp++ = vb[2];
  92.             mp++;
  93.             tb[1] = t+dt;
  94.             vb[1] = y+dy;
  95.             v = N*N - x*x - (y+dy)*(y+dy);
  96.             if (v < 0.0) v = 0.0;
  97.             vb[2] = sqrt(v) + B;
  98.             if (vb[2] < 0.) vb[2] = 0.0;
  99.             *mp++ = tb[0];
  100.             *mp++ = tb[1];
  101.             mp += 2;
  102.             *mp++ = vb[0];
  103.             *mp++ = vb[1];
  104.             *mp++ = vb[2];
  105.             mp++;
  106.             x += dx;
  107.             s += ds;
  108.         }
  109.         y += dy;
  110.         t += dt;
  111.     }
  112. }
  113. void
  114. drawmesh(int nx,int ny) {
  115.     float *mp = Ml;
  116.     int i,j;
  117.     glColor4f(1,1,1,1);
  118.     for (i = ny+1; i; i--) {
  119.         glBegin(GL_TRIANGLE_STRIP);
  120.         for (j = nx+1; j; j--) {
  121.             glTexCoord2fv(mp);
  122.             glVertex3fv(mp+4);
  123.             glTexCoord2fv(mp+8);
  124.             glVertex3fv(mp+12); mp += 16;
  125.         }
  126.         glEnd();
  127.     }
  128. }
  129. void
  130. move(void) {
  131.     if (N > 2.1 || N < 1.5)
  132. dir = -dir;
  133.     N += incr*dir;
  134.     mesh1(-1.5,1.5,-1.5,1.5,0.0,1.0,0.0,1.0,0.0,64,64);
  135.     glutPostRedisplay();
  136. }
  137. void
  138. alphaup(void) {
  139.     incr += .01;
  140.     if (incr > .1) incr = .1;
  141.     glutPostRedisplay();
  142. }
  143. void
  144. alphadown(void) {
  145.     incr -= .01;
  146.     if (incr < 0) incr = 0;
  147.     glutPostRedisplay();
  148. }
  149. void
  150. left(void) {
  151.     *wscale -= .1;
  152. }
  153. void
  154. right(void) {
  155.     *wscale += .1;
  156. }
  157. void
  158. wire(void) {
  159.     static int wire_mode;
  160.     if (wire_mode ^= 1)
  161. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  162.     else
  163. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  164. }
  165. void
  166. tfunc(void) {
  167.     static state;
  168.     if (state ^= 1) {
  169. wrotx = &trotx;
  170. wroty = &troty;
  171. wscale = &tscale;
  172.     } else {
  173. wrotx = &rotx;
  174. wroty = &roty;
  175. wscale = &scale;
  176.     }
  177. }
  178. void
  179. help(void) {
  180.     printf("'h'   - helpn");
  181.     printf("'w'   - wire framen");
  182.     printf("UP   - fastern");
  183.     printf("DOWN  - slowern");
  184. }
  185. void
  186. init(char *filename) {
  187.     if (filename) {
  188. image = read_texture(filename, &width, &height, &components);
  189. if (image == NULL) {
  190.     fprintf(stderr, "Error: Can't load image file "%s".n",
  191.     filename);
  192.     exit(EXIT_FAILURE);
  193. } else {
  194.     printf("%d x %d image loadedn", width, height);
  195. }
  196. if (components < 3 || components > 4) {
  197.     printf("must be RGB or RGBA imagen");
  198.     exit(EXIT_FAILURE);
  199. }
  200.     } else {
  201. int i, j;
  202. components = 4; width = height = 128;
  203. image = (unsigned *) malloc(width*height*sizeof(unsigned));
  204. for (j = 0; j < height; j++)
  205.     for (i = 0; i < width; i++) {
  206. if (i & 16)
  207.     image[i+j*width] = 0xff;
  208. else
  209.     image[i+j*width] = 0xff00;
  210. if (j&16)
  211.     image[i+j*width] |= 0xff0000;
  212.     }
  213.     }
  214.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  215.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  216.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  217.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  218.     glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  219.                  height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  220.                  image);
  221.     glEnable(GL_TEXTURE_2D);
  222.     glMatrixMode(GL_TEXTURE);
  223.     glLoadIdentity();
  224.     glMatrixMode(GL_PROJECTION);
  225.     glLoadIdentity();
  226.     gluPerspective(90.,1.,.1,10.);
  227.     glMatrixMode(GL_MODELVIEW);
  228.     glLoadIdentity();
  229.     glTranslatef(0.,0.,-1.5);
  230.     glClearColor(.25, .25, .25, 0.);
  231. }
  232. void
  233. display(void) {
  234.     glClear(GL_COLOR_BUFFER_BIT);
  235.     glMatrixMode(GL_TEXTURE);
  236.     glPushMatrix();
  237.     glTranslatef(.5f, .5f, .5f);
  238.     glRotatef(trotx, 0.f, 0.f, 1.f);
  239.     glScalef(tscale, tscale, tscale);
  240.     glTranslatef(-.5f, -.5f, -.5f);
  241.     glMatrixMode(GL_MODELVIEW);
  242.     glPushMatrix();
  243.     glRotatef(rotx, 0.f, 0.f, 1.f);
  244.     glScalef(scale, scale, scale);
  245.     drawmesh(64,64);
  246.     glPopMatrix();
  247.     glMatrixMode(GL_TEXTURE);
  248.     glPopMatrix();
  249.     glMatrixMode(GL_MODELVIEW);
  250.     glutSwapBuffers();
  251. }
  252. void
  253. reshape(int w, int h) {
  254.     glViewport(0, 0, w, h);
  255. }
  256. /*ARGSUSED1*/
  257. void
  258. key(unsigned char key, int x, int y) {
  259.     switch(key) {
  260.     case '33': exit(0); break;
  261.     case 'h': help(); break;
  262.     case 't': tfunc(); break;
  263.     case 'w': wire(); break;
  264.     }
  265. }
  266. /*ARGSUSED1*/
  267. void
  268. special(int key, int x, int y) {
  269.     switch(key) {
  270.     case GLUT_KEY_UP: alphaup(); break;
  271.     case GLUT_KEY_DOWN: alphadown(); break;
  272.     case GLUT_KEY_LEFT: left(); break;
  273.     case GLUT_KEY_RIGHT:right(); break;
  274.     }
  275. }
  276. int
  277. main(int argc, char** argv) {
  278.     glutInitWindowSize(256, 256);
  279.     glutInit(&argc, argv);
  280.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  281.     (void)glutCreateWindow("warp");
  282.     init(argv[1] ? argv[1] : "../data/mandrill.rgb");
  283.     glutKeyboardFunc(key);
  284.     glutSpecialFunc(special);
  285.     glutDisplayFunc(display);
  286.     glutReshapeFunc(reshape);
  287.     glutIdleFunc(move);
  288.     glutMouseFunc(mouse);
  289.     glutMotionFunc(motion);
  290.     glutMainLoop();
  291.     return 0;
  292. }