/* Copyright (c) Mark J. Kilgard, 1997. */ /* This program is freely distributable without licensing fees and is provided without guarantee or warrantee expressed or implied. This program is -not- in the public domain. */ /* X compile line: cc -o txfdemo txfdemo.c -lglut -lGLU -lGL -lXmu -lXext -lX11 -lm */ #include #include #include #include #include #include "TexFont.h" /* Uncomment to debug various scenarios. */ #if 0 #undef GL_VERSION_1_1 #undef GL_EXT_polygon_offset #endif #ifndef GL_VERSION_1_1 #ifdef GL_EXT_polygon_offset #define GL_POLYGON_OFFSET_FILL GL_POLYGON_OFFSET_EXT #define glPolygonOffset(s,b) glPolygonOffsetEXT(s,b*0.001); #else /* Gag. No polygon offset? Artifacts will exist. */ #define glPolygonOffset(s,b) /* nothing */ #endif #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif static int doubleBuffer = 1; static char *filename = "rockfont.txf"; static GLfloat angle = 20; static TexFont *txf; static int usePolygonOffset = 1; static int animation = 1; void idle(void) { angle += 4; glutPostRedisplay(); } void visible(int vis) { if (vis == GLUT_VISIBLE) { if (animation) { glutIdleFunc(idle); } } else { glutIdleFunc(NULL); } } void cubeSide(void) { glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glDisable(GL_ALPHA_TEST); glColor3f(0.3, 0.7, 0.3); glRectf(-1.0, -1.0, 1.0, 1.0); } int alphaMode; void alphaModeSet(void) { switch (alphaMode) { case GL_ALPHA_TEST: glDisable(GL_BLEND); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.5); break; case GL_BLEND: glDisable(GL_ALPHA_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; case GL_ALPHA_TEST + GL_BLEND: glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.0625); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; case GL_NONE: glDisable(GL_ALPHA_TEST); glDisable(GL_BLEND); break; } } void cubeSideWithOpenGLcircle(void) { int w, ow, a, d; char *text; int len; int i; GLfloat flen; cubeSide(); glPushMatrix(); alphaModeSet(); glEnable(GL_TEXTURE_2D); if (usePolygonOffset) { #if defined(GL_EXT_polygon_offset) || defined(GL_VERSION_1_1) glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(0.0, -3); #endif } glColor3f(0.2, 0.2, 0.9); txfGetStringMetrics(txf, "OpenGL", 6, &w, &a, &d); text = "OpenGL OpenGL "; len = (int) strlen(text); txfGetStringMetrics(txf, text, len, &w, &a, &d); txfGetStringMetrics(txf, "O", 1, &ow, &a, &d); glScalef(5.6/w, 5.6/w, 5.6/w); flen = len; glTranslatef(-ow/2.0, -w/(M_PI*2.0), 0.0); for (i=0; i