12
#include "FTGLExtrdFont.h"
13
#include "FTGLOutlineFont.h"
14
#include "FTGLPolygonFont.h"
15
#include "FTGLTextureFont.h"
16
#include "FTGLPixmapFont.h"
17
#include "FTGLBitmapFont.h"
19
// YOU'LL PROBABLY WANT TO CHANGE THESE
21
#define FONT_FILE "/usr/share/fonts/truetype/arial.ttf"
24
#define FONT_FILE "/Users/henry/Development/PROJECTS/FTGL/test/font_pack/arial.ttf"
27
#define FONT_FILE "C:\\WINNT\\Fonts\\arial.ttf"
38
#define FTGL_OUTLINE 2
39
#define FTGL_POLYGON 3
40
#define FTGL_EXTRUDE 4
41
#define FTGL_TEXTURE 5
43
char* fontfile = FONT_FILE;
44
int current_font = FTGL_EXTRUDE;
46
GLint w_win = 640, h_win = 480;
47
int mode = INTERACTIVE;
50
//wchar_t myString[16] = { 0x6FB3, 0x9580};
53
static FTFont* fonts[6];
54
static FTGLPixmapFont* infoFont;
61
float light1_ambient[4] = { 1.0, 1.0, 1.0, 1.0 };
62
float light1_diffuse[4] = { 1.0, 0.9, 0.9, 1.0 };
63
float light1_specular[4] = { 1.0, 0.7, 0.7, 1.0 };
64
float light1_position[4] = { -1.0, 1.0, 1.0, 0.0 };
65
glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
66
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
67
glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
68
glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
71
float light2_ambient[4] = { 0.2, 0.2, 0.2, 1.0 };
72
float light2_diffuse[4] = { 0.9, 0.9, 0.9, 1.0 };
73
float light2_specular[4] = { 0.7, 0.7, 0.7, 1.0 };
74
float light2_position[4] = { 1.0, -1.0, -1.0, 0.0 };
75
glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient);
76
glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse);
77
glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular);
78
glLightfv(GL_LIGHT2, GL_POSITION, light2_position);
79
// glEnable(GL_LIGHT2);
81
float front_emission[4] = { 0.3, 0.2, 0.1, 0.0 };
82
float front_ambient[4] = { 0.2, 0.2, 0.2, 0.0 };
83
float front_diffuse[4] = { 0.95, 0.95, 0.8, 0.0 };
84
float front_specular[4] = { 0.6, 0.6, 0.6, 0.0 };
85
glMaterialfv(GL_FRONT, GL_EMISSION, front_emission);
86
glMaterialfv(GL_FRONT, GL_AMBIENT, front_ambient);
87
glMaterialfv(GL_FRONT, GL_DIFFUSE, front_diffuse);
88
glMaterialfv(GL_FRONT, GL_SPECULAR, front_specular);
89
glMaterialf(GL_FRONT, GL_SHININESS, 16.0);
90
glColor4fv(front_diffuse);
92
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
93
glEnable(GL_CULL_FACE);
94
glColorMaterial(GL_FRONT, GL_DIFFUSE);
95
glEnable(GL_COLOR_MATERIAL);
97
glEnable(GL_LIGHTING);
98
glShadeModel(GL_SMOOTH);
102
void setUpFonts( const char* fontfile)
104
fonts[FTGL_BITMAP] = new FTGLBitmapFont( fontfile);
105
fonts[FTGL_PIXMAP] = new FTGLPixmapFont( fontfile);
106
fonts[FTGL_OUTLINE] = new FTGLOutlineFont( fontfile);
107
fonts[FTGL_POLYGON] = new FTGLPolygonFont( fontfile);
108
fonts[FTGL_EXTRUDE] = new FTGLExtrdFont( fontfile);
109
fonts[FTGL_TEXTURE] = new FTGLTextureFont( fontfile);
111
for( int x = 0; x < 6; ++x)
113
if( fonts[x]->Error())
115
fprintf( stderr, "Failed to open font %s", fontfile);
119
if( !fonts[x]->FaceSize( 144))
121
fprintf( stderr, "Failed to set size");
127
fonts[x]->CharMap(ft_encoding_unicode);
130
infoFont = new FTGLPixmapFont( fontfile);
132
if( infoFont->Error())
134
fprintf( stderr, "Failed to open font %s", fontfile);
138
infoFont->FaceSize( 18);
145
void renderFontmetrics()
147
float x1, y1, z1, x2, y2, z2;
148
fonts[current_font]->BBox( myString, x1, y1, z1, x2, y2, z2);
150
// Draw the bounding box
151
glDisable( GL_LIGHTING);
152
glDisable( GL_TEXTURE_2D);
153
glEnable( GL_LINE_SMOOTH);
155
glBlendFunc( GL_SRC_ALPHA, GL_ONE); // GL_ONE_MINUS_SRC_ALPHA
157
glColor3f( 0.0, 1.0, 0.0);
158
// Draw the front face
159
glBegin( GL_LINE_LOOP);
160
glVertex3f( x1, y1, z1);
161
glVertex3f( x1, y2, z1);
162
glVertex3f( x2, y2, z1);
163
glVertex3f( x2, y1, z1);
165
// Draw the back face
166
if( current_font == FTGL_EXTRUDE && z1 != z2)
168
glBegin( GL_LINE_LOOP);
169
glVertex3f( x1, y1, z2);
170
glVertex3f( x1, y2, z2);
171
glVertex3f( x2, y2, z2);
172
glVertex3f( x2, y1, z2);
176
glVertex3f( x1, y1, z1);
177
glVertex3f( x1, y1, z2);
179
glVertex3f( x1, y2, z1);
180
glVertex3f( x1, y2, z2);
182
glVertex3f( x2, y2, z1);
183
glVertex3f( x2, y2, z2);
185
glVertex3f( x2, y1, z1);
186
glVertex3f( x2, y1, z2);
190
// Draw the baseline, Ascender and Descender
192
glColor3f( 0.0, 0.0, 1.0);
193
glVertex3f( 0.0, 0.0, 0.0);
194
glVertex3f( fonts[current_font]->Advance( myString), 0.0, 0.0);
195
glVertex3f( 0.0, fonts[current_font]->Ascender(), 0.0);
196
glVertex3f( 0.0, fonts[current_font]->Descender(), 0.0);
201
glColor3f( 1.0, 0.0, 0.0);
204
glVertex3f( 0.0, 0.0, 0.0);
209
void renderFontInfo()
211
glMatrixMode( GL_PROJECTION);
213
gluOrtho2D(0, w_win, 0, h_win);
214
glMatrixMode(GL_MODELVIEW);
218
glColor3f( 1.0, 1.0, 1.0);
219
glRasterPos2f( 20.0f , h_win - ( 20.0f + infoFont->Ascender()));
224
infoFont->Render("Edit Mode");
231
glRasterPos2i( 20 , 20);
232
switch( current_font)
235
infoFont->Render("Bitmap Font");
238
infoFont->Render("Pixmap Font");
241
infoFont->Render("Outline Font");
244
infoFont->Render("Polygon Font");
247
infoFont->Render("Extruded Font");
250
infoFont->Render("Texture Font");
254
glRasterPos2f( 20.0f , 20.0f + infoFont->Ascender() - infoFont->Descender());
255
infoFont->Render(fontfile);
258
void do_display (void)
260
switch( current_font)
267
glDisable( GL_BLEND);
271
glEnable( GL_DEPTH_TEST);
272
glDisable( GL_BLEND);
276
glEnable( GL_TEXTURE_2D);
277
glDisable( GL_DEPTH_TEST);
279
glNormal3f( 0.0, 0.0, 1.0);
284
glColor3f( 1.0, 1.0, 1.0);
285
// If you do want to switch the color of bitmaps rendered with glBitmap,
286
// you will need to explicitly call glRasterPos3f (or its ilk) to lock
287
// in a changed current color.
289
fonts[current_font]->Render( myString);
297
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
301
switch( current_font)
305
glRasterPos2i( w_win / 2, h_win / 2);
306
glTranslatef( w_win / 2, h_win / 2, 0.0);
326
void myinit( const char* fontfile)
328
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
329
glClearColor( 0.13, 0.17, 0.32, 0.0);
330
glColor3f( 1.0, 1.0, 1.0);
332
glEnable( GL_CULL_FACE);
333
glFrontFace( GL_CCW);
335
glEnable( GL_DEPTH_TEST);
337
glEnable( GL_POLYGON_OFFSET_LINE);
338
glPolygonOffset( 1.0, 1.0); // ????
342
tbInit(GLUT_LEFT_BUTTON);
343
tbAnimate( GL_FALSE);
345
setUpFonts( fontfile);
349
void parsekey(unsigned char key, int x, int y)
353
case 27: exit(0); break;
371
if( mode == INTERACTIVE)
379
myString[carat] = key;
380
myString[carat + 1] = 0;
381
carat = carat > 14 ? 14 : ++carat;
390
void motion(int x, int y)
395
void mouse(int button, int state, int x, int y)
397
tbMouse( button, state, x, y);
400
void myReshape(int w, int h)
402
glMatrixMode (GL_MODELVIEW);
403
glViewport (0, 0, w, h);
410
tbReshape(w_win, h_win);
415
switch( current_font)
419
glMatrixMode( GL_PROJECTION);
421
gluOrtho2D(0, w_win, 0, h_win);
422
glMatrixMode(GL_MODELVIEW);
429
glMatrixMode (GL_PROJECTION);
431
gluPerspective( 90, (float)w_win / (float)h_win, 1, 1000);
432
glMatrixMode(GL_MODELVIEW);
434
gluLookAt( 0.0, 0.0, (float)h_win / 2.0f, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
440
int main(int argc, char *argv[])
442
#ifndef __APPLE_CC__ // Bloody finder args???
449
fprintf(stderr, "A font file must be specified on the command line\n");
453
glutInit( &argc, argv);
454
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE);
455
glutInitWindowPosition(50, 50);
456
glutInitWindowSize( w_win, h_win);
457
glutCreateWindow("FTGL TEST");
458
glutDisplayFunc(display);
459
glutKeyboardFunc(parsekey);
460
glutMouseFunc(mouse);
461
glutMotionFunc(motion);
462
glutReshapeFunc(myReshape);
463
glutIdleFunc(display);