📄 ftgldemo.cpp
字号:
#ifdef __APPLE_CC__ #include <GLUT/glut.h>#else #include <GL/glut.h>#endif#include <stdlib.h>#include <stdio.h>#include "tb.h"#include "FTGLExtrdFont.h"#include "FTGLOutlineFont.h"#include "FTGLPolygonFont.h"#include "FTGLTextureFont.h"#include "FTGLPixmapFont.h"#include "FTGLBitmapFont.h"// YOU'LL PROBABLY WANT TO CHANGE THESE#ifdef __linux__ #define FONT_FILE "/usr/share/fonts/truetype/arial.ttf"#endif#ifdef __APPLE_CC__ #define FONT_FILE "/Users/henry/Development/PROJECTS/FTGL/test/font_pack/arial.ttf"#endif#ifdef WIN32 #define FONT_FILE "C:\\WINNT\\Fonts\\arial.ttf"#endif#ifndef FONT_FILE #define FONT_FILE 0#endif#define EDITING 1#define INTERACTIVE 2#define FTGL_BITMAP 0#define FTGL_PIXMAP 1#define FTGL_OUTLINE 2#define FTGL_POLYGON 3#define FTGL_EXTRUDE 4#define FTGL_TEXTURE 5char* fontfile = FONT_FILE;int current_font = FTGL_EXTRUDE;GLint w_win = 640, h_win = 480;int mode = INTERACTIVE;int carat = 0;//wchar_t myString[16] = { 0x6FB3, 0x9580};wchar_t myString[16];static FTFont* fonts[6];static FTGLPixmapFont* infoFont;static float texture[] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};static GLuint textureID;void SetCamera(void);void setUpLighting(){ // Set up lighting. float light1_ambient[4] = { 1.0, 1.0, 1.0, 1.0 }; float light1_diffuse[4] = { 1.0, 0.9, 0.9, 1.0 }; float light1_specular[4] = { 1.0, 0.7, 0.7, 1.0 }; float light1_position[4] = { -1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular); glLightfv(GL_LIGHT1, GL_POSITION, light1_position); glEnable(GL_LIGHT1); float light2_ambient[4] = { 0.2, 0.2, 0.2, 1.0 }; float light2_diffuse[4] = { 0.9, 0.9, 0.9, 1.0 }; float light2_specular[4] = { 0.7, 0.7, 0.7, 1.0 }; float light2_position[4] = { 1.0, -1.0, -1.0, 0.0 }; glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient); glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse); glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular); glLightfv(GL_LIGHT2, GL_POSITION, light2_position);// glEnable(GL_LIGHT2); float front_emission[4] = { 0.3, 0.2, 0.1, 0.0 }; float front_ambient[4] = { 0.2, 0.2, 0.2, 0.0 }; float front_diffuse[4] = { 0.95, 0.95, 0.8, 0.0 }; float front_specular[4] = { 0.6, 0.6, 0.6, 0.0 }; glMaterialfv(GL_FRONT, GL_EMISSION, front_emission); glMaterialfv(GL_FRONT, GL_AMBIENT, front_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, front_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, front_specular); glMaterialf(GL_FRONT, GL_SHININESS, 16.0); glColor4fv(front_diffuse); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); glColorMaterial(GL_FRONT, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING);}void setUpFonts( const char* fontfile){ fonts[FTGL_BITMAP] = new FTGLBitmapFont( fontfile); fonts[FTGL_PIXMAP] = new FTGLPixmapFont( fontfile); fonts[FTGL_OUTLINE] = new FTGLOutlineFont( fontfile); fonts[FTGL_POLYGON] = new FTGLPolygonFont( fontfile); fonts[FTGL_EXTRUDE] = new FTGLExtrdFont( fontfile); fonts[FTGL_TEXTURE] = new FTGLTextureFont( fontfile); for( int x = 0; x < 6; ++x) { if( fonts[x]->Error()) { fprintf( stderr, "Failed to open font %s", fontfile); exit(1); } if( !fonts[x]->FaceSize( 144)) { fprintf( stderr, "Failed to set size"); exit(1); } fonts[x]->Depth(20); fonts[x]->CharMap(ft_encoding_unicode); } infoFont = new FTGLPixmapFont( fontfile); if( infoFont->Error()) { fprintf( stderr, "Failed to open font %s", fontfile); exit(1); } infoFont->FaceSize( 18); myString[0] = 65; myString[1] = 0;}void renderFontmetrics(){ float x1, y1, z1, x2, y2, z2; fonts[current_font]->BBox( myString, x1, y1, z1, x2, y2, z2); // Draw the bounding box glDisable( GL_LIGHTING); glDisable( GL_TEXTURE_2D); glEnable( GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc( GL_SRC_ALPHA, GL_ONE); // GL_ONE_MINUS_SRC_ALPHA glColor3f( 0.0, 1.0, 0.0); // Draw the front face glBegin( GL_LINE_LOOP); glVertex3f( x1, y1, z1); glVertex3f( x1, y2, z1); glVertex3f( x2, y2, z1); glVertex3f( x2, y1, z1); glEnd(); // Draw the back face if( current_font == FTGL_EXTRUDE && z1 != z2) { glBegin( GL_LINE_LOOP); glVertex3f( x1, y1, z2); glVertex3f( x1, y2, z2); glVertex3f( x2, y2, z2); glVertex3f( x2, y1, z2); glEnd(); // Join the faces glBegin( GL_LINES); glVertex3f( x1, y1, z1); glVertex3f( x1, y1, z2); glVertex3f( x1, y2, z1); glVertex3f( x1, y2, z2); glVertex3f( x2, y2, z1); glVertex3f( x2, y2, z2); glVertex3f( x2, y1, z1); glVertex3f( x2, y1, z2); glEnd(); } // Draw the baseline, Ascender and Descender glBegin( GL_LINES); glColor3f( 0.0, 0.0, 1.0); glVertex3f( 0.0, 0.0, 0.0); glVertex3f( fonts[current_font]->Advance( myString), 0.0, 0.0); glVertex3f( 0.0, fonts[current_font]->Ascender(), 0.0); glVertex3f( 0.0, fonts[current_font]->Descender(), 0.0); glEnd(); // Draw the origin glColor3f( 1.0, 0.0, 0.0); glPointSize( 5.0); glBegin( GL_POINTS); glVertex3f( 0.0, 0.0, 0.0); glEnd();}void renderFontInfo(){ glMatrixMode( GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, w_win, 0, h_win); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // draw mode glColor3f( 1.0, 1.0, 1.0); glRasterPos2f( 20.0f , h_win - ( 20.0f + infoFont->Ascender())); switch( mode) { case EDITING: infoFont->Render("Edit Mode"); break; case INTERACTIVE: break; } // draw font type glRasterPos2i( 20 , 20); switch( current_font) { case FTGL_BITMAP: infoFont->Render("Bitmap Font"); break; case FTGL_PIXMAP: infoFont->Render("Pixmap Font"); break; case FTGL_OUTLINE: infoFont->Render("Outline Font"); break; case FTGL_POLYGON: infoFont->Render("Polygon Font"); break; case FTGL_EXTRUDE: infoFont->Render("Extruded Font"); break; case FTGL_TEXTURE: infoFont->Render("Texture Font"); break; } glRasterPos2f( 20.0f , 20.0f + infoFont->LineHeight()); infoFont->Render(fontfile);}void do_display (void){ switch( current_font) { case FTGL_BITMAP: case FTGL_PIXMAP: case FTGL_OUTLINE: break; case FTGL_POLYGON: glEnable( GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textureID); glDisable( GL_BLEND); setUpLighting(); break; case FTGL_EXTRUDE: glEnable( GL_DEPTH_TEST); glDisable( GL_BLEND); glEnable( GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textureID); setUpLighting(); break; case FTGL_TEXTURE: glEnable( GL_TEXTURE_2D); glDisable( GL_DEPTH_TEST); setUpLighting(); glNormal3f( 0.0, 0.0, 1.0); break; } glColor3f( 1.0, 1.0, 1.0);// If you do want to switch the color of bitmaps rendered with glBitmap,// you will need to explicitly call glRasterPos3f (or its ilk) to lock// in a changed current color. glPushMatrix(); fonts[current_font]->Render( myString); glPopMatrix(); glPushMatrix(); renderFontmetrics(); glPopMatrix(); renderFontInfo();}void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SetCamera(); switch( current_font) { case FTGL_BITMAP: case FTGL_PIXMAP: glRasterPos2i( w_win / 2, h_win / 2); glTranslatef( w_win / 2, h_win / 2, 0.0); break; case FTGL_OUTLINE: case FTGL_POLYGON: case FTGL_EXTRUDE: case FTGL_TEXTURE: tbMatrix(); break; } glPushMatrix(); do_display(); glPopMatrix(); glutSwapBuffers();}void myinit( const char* fontfile){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor( 0.13, 0.17, 0.32, 0.0); glColor3f( 1.0, 1.0, 1.0); glEnable( GL_CULL_FACE); glFrontFace( GL_CCW); glEnable( GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glShadeModel(GL_SMOOTH); glEnable( GL_POLYGON_OFFSET_LINE); glPolygonOffset( 1.0, 1.0); // ???? SetCamera(); tbInit(GLUT_LEFT_BUTTON); tbAnimate( GL_FALSE); setUpFonts( fontfile); glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_2D, textureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, GL_RGB, GL_FLOAT, texture); }void parsekey(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; case 13: if( mode == EDITING) { mode = INTERACTIVE; } else { mode = EDITING; carat = 0; } break; case ' ': current_font++; if(current_font > 5) current_font = 0; break; default: if( mode == INTERACTIVE) { myString[0] = key; myString[1] = 0; break; } else { myString[carat] = key; myString[carat + 1] = 0; carat = carat > 14 ? 14 : ++carat; } } glutPostRedisplay();}void motion(int x, int y){ tbMotion( x, y);}void mouse(int button, int state, int x, int y){ tbMouse( button, state, x, y);}void myReshape(int w, int h){ glMatrixMode (GL_MODELVIEW); glViewport (0, 0, w, h); glLoadIdentity(); w_win = w; h_win = h; SetCamera(); tbReshape(w_win, h_win);}void SetCamera(void){ switch( current_font) { case FTGL_BITMAP: case FTGL_PIXMAP: glMatrixMode( GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, w_win, 0, h_win); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); break; case FTGL_OUTLINE: case FTGL_POLYGON: case FTGL_EXTRUDE: case FTGL_TEXTURE: glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective( 90, (float)w_win / (float)h_win, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( 0.0, 0.0, (float)h_win / 2.0f, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); break; } }int main(int argc, char *argv[]){#ifndef __APPLE_CC__ // Bloody finder args??? if (argc == 2) fontfile = argv[1];#endif if (!fontfile) { fprintf(stderr, "A font file must be specified on the command line\n"); exit(1); } glutInit( &argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE); glutInitWindowPosition(50, 50); glutInitWindowSize( w_win, h_win); glutCreateWindow("FTGL TEST"); glutDisplayFunc(display); glutKeyboardFunc(parsekey); glutMouseFunc(mouse); glutMotionFunc(motion); glutReshapeFunc(myReshape); glutIdleFunc(display); myinit( fontfile); glutMainLoop(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -