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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1997. */
  2. /* This program is freely distributable without licensing fees  and is
  3.    provided without guarantee or warrantee expressed or  implied. This
  4.    program is -not- in the public domain. */
  5. /* X compile line: cc -o simpletxf simpletxf.c texfont.c -lglut -lGLU -lGL -lXmu -lXext -lX11 -lm */
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <GL/glut.h>
  10. #include "TexFont.h"
  11. int doubleBuffer = 1;
  12. char *filename = "default.txf";
  13. TexFont *txf;
  14. GLfloat angle = 20;
  15. void
  16. idle(void)
  17. {
  18.   angle += 4;
  19.   glutPostRedisplay();
  20. }
  21. void 
  22. visible(int vis)
  23. {
  24.   if (vis == GLUT_VISIBLE)
  25.     glutIdleFunc(idle);
  26.   else
  27.     glutIdleFunc(NULL);
  28. }
  29. void
  30. display(void)
  31. {
  32.   char *str;
  33.   /* Clear the color buffer. */
  34.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  35.   glPushMatrix();
  36.   glRotatef(angle, 0, 0, 1);
  37.   glTranslatef(-2.0, 0.0, 0.0);
  38.   glScalef(1 / 60.0, 1 / 60.0, 1 / 60.0);
  39.   glPushMatrix();
  40.   glColor3f(0.0, 0.0, 1.0);
  41.   str = "OpenGL is";
  42.   txfRenderString(txf, str, (int) strlen(str));
  43.   glPopMatrix();
  44.   glPushMatrix();
  45.   glColor3f(1.0, 0.0, 0.0);
  46.   glTranslatef(0.0, -60.0, 0.0);
  47.   str = "the best.";
  48.   txfRenderString(txf, str, (int) strlen(str));
  49.   glPopMatrix();
  50.   glPopMatrix();
  51.   /* Swap the buffers if necessary. */
  52.   if (doubleBuffer) {
  53.     glutSwapBuffers();
  54.   }
  55. }
  56. int minifyMenu;
  57. void
  58. minifySelect(int value)
  59. {
  60.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, value);
  61.   glutPostRedisplay();
  62. }
  63. int alphaMenu;
  64. void
  65. alphaSelect(int value)
  66. {
  67.   switch (value) {
  68.   case GL_ALPHA_TEST:
  69.     glDisable(GL_BLEND);
  70.     glEnable(GL_ALPHA_TEST);
  71.     glAlphaFunc(GL_GEQUAL, 0.5);
  72.     break;
  73.   case GL_BLEND:
  74.     glDisable(GL_ALPHA_TEST);
  75.     glEnable(GL_BLEND);
  76.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  77.     break;
  78.   case GL_NONE:
  79.     glDisable(GL_ALPHA_TEST);
  80.     glDisable(GL_BLEND);
  81.     break;
  82.   }
  83. }
  84. void
  85. mainSelect(int value)
  86. {
  87.   if (value == 666) {
  88.     exit(0);
  89.   }
  90. }
  91. int
  92. main(int argc, char **argv)
  93. {
  94.   int i;
  95.   glutInit(&argc, argv);
  96.   for (i = 1; i < argc; i++) {
  97.     if (!strcmp(argv[i], "-sb")) {
  98.       doubleBuffer = 0;
  99.     } else {
  100.       filename = argv[i];
  101.     }
  102.   }
  103.   if (filename == NULL) {
  104.     fprintf(stderr, "usage: show [GLUT-options] [-sb] txf-filen");
  105.     exit(1);
  106.   }
  107.   txf = txfLoadFont(filename);
  108.   if (txf == NULL) {
  109.     fprintf(stderr, "Problem loading %sn", filename);
  110.     exit(1);
  111.   }
  112.   if (doubleBuffer) {
  113.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  114.   } else {
  115.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
  116.   }
  117.   glutInitWindowSize(300, 300);
  118.   glutCreateWindow("texfont");
  119.   glutDisplayFunc(display);
  120.   glMatrixMode(GL_PROJECTION);
  121.   glLoadIdentity();
  122.   gluPerspective(60.0, 1.0, 0.1, 20.0);
  123.   glMatrixMode(GL_MODELVIEW);
  124.   gluLookAt(0.0, 0.0, 5.0,
  125.     0.0, 0.0, 0.0,
  126.     0.0, 1.0, 0.0);
  127.   glEnable(GL_TEXTURE_2D);
  128.   glEnable(GL_DEPTH_TEST);
  129.   alphaSelect(GL_ALPHA_TEST);
  130.   minifySelect(GL_NEAREST);
  131.   txfEstablishTexture(txf, 0, GL_TRUE);
  132.   glutVisibilityFunc(visible);
  133.   minifyMenu = glutCreateMenu(minifySelect);
  134.   glutAddMenuEntry("Nearest", GL_NEAREST);
  135.   glutAddMenuEntry("Linear", GL_LINEAR);
  136.   glutAddMenuEntry("Nearest mipmap nearest", GL_NEAREST_MIPMAP_NEAREST);
  137.   glutAddMenuEntry("Linear mipmap nearest", GL_LINEAR_MIPMAP_NEAREST);
  138.   glutAddMenuEntry("Nearest mipmap linear", GL_NEAREST_MIPMAP_LINEAR);
  139.   glutAddMenuEntry("Linear mipmap linear", GL_LINEAR_MIPMAP_LINEAR);
  140.   alphaMenu = glutCreateMenu(alphaSelect);
  141.   glutAddMenuEntry("Alpha testing", GL_ALPHA_TEST);
  142.   glutAddMenuEntry("Alpha blending", GL_BLEND);
  143.   glutAddMenuEntry("Nothing", GL_NONE);
  144.   glutCreateMenu(mainSelect);
  145.   glutAddSubMenu("Filtering", minifyMenu);
  146.   glutAddSubMenu("Alpha", alphaMenu);
  147.   glutAddMenuEntry("Quit", 666);
  148.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  149.   glutMainLoop();
  150.   return 0;             /* ANSI C requires main to return int. */
  151. }