⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftgldemo.cpp

📁 ftgl-2.1.2 夸平台的opengl显示字体
💻 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 + -