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

GIS编程

开发平台:

Visual C++

  1. /* textext.c - by David Blythe, SGI */
  2. /* Example of using texturing for 3D transformable fonts. */
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <GL/glut.h>
  7. #include "texture.h"
  8. #include "textmap.h"
  9. static float scale = .03;
  10. static char *string = "OpenGL rules";
  11. static float transx, transy, rotx, roty;
  12. static int ox = -1, oy = -1;
  13. static int mot = 0;
  14. #define PAN 1
  15. #define ROT 2
  16. void
  17. pan(int x, int y)
  18. {
  19.   transx += (x - ox) / 500.;
  20.   transy -= (y - oy) / 500.;
  21.   ox = x;
  22.   oy = y;
  23.   glutPostRedisplay();
  24. }
  25. void
  26. rotate(int x, int y)
  27. {
  28.   rotx += x - ox;
  29.   if (rotx > 360.)
  30.     rotx -= 360.;
  31.   else if (rotx < -360.)
  32.     rotx += 360.;
  33.   roty += y - oy;
  34.   if (roty > 360.)
  35.     roty -= 360.;
  36.   else if (roty < -360.)
  37.     roty += 360.;
  38.   ox = x;
  39.   oy = y;
  40.   glutPostRedisplay();
  41. }
  42. void
  43. motion(int x, int y)
  44. {
  45.   if (mot == PAN)
  46.     pan(x, y);
  47.   else if (mot == ROT)
  48.     rotate(x, y);
  49. }
  50. void
  51. mouse(int button, int state, int x, int y)
  52. {
  53.   if (state == GLUT_DOWN) {
  54.     switch (button) {
  55.     case GLUT_LEFT_BUTTON:
  56.       mot = PAN;
  57.       motion(ox = x, oy = y);
  58.       break;
  59.     case GLUT_MIDDLE_BUTTON:
  60.       mot = ROT;
  61.       motion(ox = x, oy = y);
  62.       break;
  63.     case GLUT_RIGHT_BUTTON:
  64.       break;
  65.     }
  66.   } else if (state == GLUT_UP) {
  67.     mot = 0;
  68.   }
  69. }
  70. void 
  71. up(void)
  72. {
  73.   scale += .0025;
  74. }
  75. void 
  76. down(void)
  77. {
  78.   scale -= .0025;
  79. }
  80. void 
  81. help(void)
  82. {
  83.   printf("Usage: textext [string]n");
  84.   printf("'h'            - helpn");
  85.   printf("'UP'           - scale upn");
  86.   printf("'DOWN'         - scale downn");
  87.   printf("left mouse     - pann");
  88.   printf("middle mouse   - rotaten");
  89. }
  90. void 
  91. init(void)
  92. {
  93.   texfntinit("Times-Italic.bw");
  94.   glEnable(GL_TEXTURE_2D);
  95.   glMatrixMode(GL_PROJECTION);
  96.   glLoadIdentity();
  97.   gluPerspective(90., 1., .1, 10.);
  98.   glMatrixMode(GL_MODELVIEW);
  99.   glLoadIdentity();
  100.   glTranslatef(0., 0., -1.5);
  101. }
  102. void 
  103. display(void)
  104. {
  105.   float width = texstrwidth(string);
  106.   glClear(GL_COLOR_BUFFER_BIT);
  107.   glPushMatrix();
  108.   glTranslatef(transx, transy, 0.f);
  109.   glRotatef(rotx, 0., 1., 0.);
  110.   glRotatef(roty, 1., 0., 0.);
  111.   glScalef(scale, scale, 0.);
  112.   glTranslatef(-width * 5, 0.f, 0.f);
  113.   texfntstroke(string, 0.f, 0.f);
  114.   glPopMatrix();
  115.   glutSwapBuffers();
  116. }
  117. void 
  118. reshape(int w, int h)
  119. {
  120.   glViewport(0, 0, w, h);
  121. }
  122. /* ARGSUSED1 */
  123. void
  124. key(unsigned char key, int x, int y)
  125. {
  126.   switch (key) {
  127.   case 'h':
  128.     help();
  129.     break;
  130.   case '33':
  131.     exit(1);
  132.     break;
  133.   default:
  134.     break;
  135.   }
  136. }
  137. /* ARGSUSED1 */
  138. void
  139. special(int key, int x, int y)
  140. {
  141.   switch (key) {
  142.   case GLUT_KEY_UP:
  143.     up();
  144.     break;
  145.   case GLUT_KEY_DOWN:
  146.     down();
  147.     break;
  148.   }
  149.   glutPostRedisplay();
  150. }
  151. int 
  152. main(int argc, char **argv)
  153. {
  154.   if (argc > 1)
  155.     string = argv[1];
  156.   glutInit(&argc, argv);
  157.   glutInitWindowSize(512, 512);
  158.   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
  159.   (void) glutCreateWindow("textext");
  160.   init();
  161.   glutDisplayFunc(display);
  162.   glutKeyboardFunc(key);
  163.   glutSpecialFunc(special);
  164.   glutReshapeFunc(reshape);
  165.   glutMouseFunc(mouse);
  166.   glutMotionFunc(motion);
  167.   glutMainLoop();
  168.   return 0;             /* ANSI C requires main to return int. */
  169. }