1 #include <stdlib.h>
2 #include <stdio.h>
3
4 #include "FTGL.h"
5
6 #ifdef __APPLE_CC__
7 #include <GLUT/glut.h>
8 #else
9 #include <GL/glut.h>
10 #endif
11
12 #include "tb.h"
13
14 #ifndef FTGL_DO_NOT_USE_VECTORISER
15 #include "FTGLExtrdFont.h"
16 #include "FTGLOutlineFont.h"
17 #include "FTGLPolygonFont.h"
18 #endif
19
20 #ifndef FTGL_DO_NOT_USE_TEXTURE_FONT
21 #include "FTGLTextureFont.h"
22 #endif
23
24 #include "FTGLPixmapFont.h"
25 #include "FTGLBitmapFont.h"
26
27 // YOU'LL PROBABLY WANT TO CHANGE THESE
28
29 #ifdef __linux__
30 const char* FONT_FILE = "/usr/share/fonts/truetype/arial.ttf";
31 const char* FONT_INFO = "/usr/share/fonts/truetype/arial.ttf";
32 #else
33 #ifdef __APPLE_CC__
34 const char* FONT_FILE = "/Users/henry/Development/PROJECTS/FTGL/ftglcvs/FTGL/demo/arial.ttf";
35 const char* FONT_INFO = "/Users/henry/Development/PROJECTS/FTGL/ftglcvs/FTGL/demo/arial.ttf";
36 #else
37 #ifdef WIN32
38 const char* FONT_FILE = "C:\\WINNT\\Fonts\\arial.ttf";
39 const char* FONT_INFO = "C:\\WINNT\\Fonts\\arial.ttf";
40 #else
41 const char* FONT_FILE = "arial.ttf";
42 const char* FONT_INFO = "arial.ttf";
43 #endif
44 #endif
45 #endif
46
47 #define EDITING 1
48 #define INTERACTIVE 2
49
50 #define FTGL_BITMAP 0
51 #define FTGL_PIXMAP 1
52 #define FTGL_OUTLINE 2
53 #define FTGL_POLYGON 3
54 #define FTGL_EXTRUDE 4
55 #define FTGL_TEXTURE 5
56
57 #ifndef FTGL_DO_NOT_USE_VECTORISER
58 int current_font = FTGL_EXTRUDE;
59 #else
60 int current_font = FTGL_PIXMAP;
61 #endif
62
63 GLint w_win = 640, h_win = 480;
64 float posX, posY, posZ;
65 int mode = INTERACTIVE;
66 int carat = 0;
67
68 const char* fontfile;
69 const char* fontinfo;
70
71 //wchar_t myString[16] = { 0x6FB3, 0x9580};
72 wchar_t myString[16];
73
74 static FTFont* fonts[6];
75 static FTGLPixmapFont* infoFont;
76
77 void SetCamera(void);
78
my_lighting()79 void my_lighting()
80 {
81 // Set up lighting.
82 float light1_ambient[4] = { 1.0, 1.0, 1.0, 1.0 };
83 float light1_diffuse[4] = { 1.0, 0.9, 0.9, 1.0 };
84 float light1_specular[4] = { 1.0, 0.7, 0.7, 1.0 };
85 float light1_position[4] = { -1.0, 1.0, 1.0, 0.0 };
86 glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
87 glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
88 glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
89 glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
90 glEnable(GL_LIGHT1);
91
92 float light2_ambient[4] = { 0.2, 0.2, 0.2, 1.0 };
93 float light2_diffuse[4] = { 0.9, 0.9, 0.9, 1.0 };
94 float light2_specular[4] = { 0.7, 0.7, 0.7, 1.0 };
95 float light2_position[4] = { 1.0, -1.0, -1.0, 0.0 };
96 glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient);
97 glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse);
98 glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular);
99 glLightfv(GL_LIGHT2, GL_POSITION, light2_position);
100 // glEnable(GL_LIGHT2);
101
102 float front_emission[4] = { 0.3, 0.2, 0.1, 0.0 };
103 float front_ambient[4] = { 0.2, 0.2, 0.2, 0.0 };
104 float front_diffuse[4] = { 0.95, 0.95, 0.8, 0.0 };
105 float front_specular[4] = { 0.6, 0.6, 0.6, 0.0 };
106 glMaterialfv(GL_FRONT, GL_EMISSION, front_emission);
107 glMaterialfv(GL_FRONT, GL_AMBIENT, front_ambient);
108 glMaterialfv(GL_FRONT, GL_DIFFUSE, front_diffuse);
109 glMaterialfv(GL_FRONT, GL_SPECULAR, front_specular);
110 glMaterialf(GL_FRONT, GL_SHININESS, 16.0);
111 glColor4fv(front_diffuse);
112
113 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
114 glEnable(GL_CULL_FACE);
115 glColorMaterial(GL_FRONT, GL_DIFFUSE);
116 glEnable(GL_COLOR_MATERIAL);
117
118 glEnable(GL_LIGHTING);
119 glShadeModel(GL_SMOOTH);
120 }
121
122
do_display()123 void do_display ()
124 {
125 switch( current_font)
126 {
127 case FTGL_BITMAP:
128 // glDisable( GL_BLEND);
129 break;
130 case FTGL_PIXMAP:
131 // glDisable( GL_TEXTURE_2D);
132 // glEnable(GL_BLEND);
133 // glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE
134 break;
135 #ifndef FTGL_DO_NOT_USE_VECTORISER
136 case FTGL_OUTLINE:
137 // glDisable( GL_TEXTURE_2D);
138 // glEnable( GL_LINE_SMOOTH);
139 // glEnable(GL_BLEND);
140 // glBlendFunc( GL_SRC_ALPHA, GL_ONE); // GL_ONE_MINUS_SRC_ALPHA
141 break;
142 case FTGL_POLYGON:
143 glDisable( GL_BLEND);
144 my_lighting();
145 break;
146 case FTGL_EXTRUDE:
147 glEnable( GL_DEPTH_TEST);
148 glDisable( GL_BLEND);
149 my_lighting();
150 break;
151 #endif
152 #ifndef FTGL_DO_NOT_USE_TEXTURE_FONT
153 case FTGL_TEXTURE:
154 glEnable( GL_TEXTURE_2D);
155 glDisable( GL_DEPTH_TEST);
156 my_lighting();
157 glNormal3f( 0.0, 0.0, 1.0);
158 // glDisable( GL_BLEND);
159 break;
160 #endif
161 }
162
163 glColor3f( 1.0, 1.0, 1.0);
164 // If you do want to switch the color of bitmaps rendered with glBitmap,
165 // you will need to explicitly call glRasterPos3f (or its ilk) to lock
166 // in a changed current color.
167
168 fonts[current_font]->render( myString);
169
170 float x1, y1, z1, x2, y2, z2;
171 fonts[current_font]->BBox( myString, x1, y1, z1, x2, y2, z2);
172
173 // Draw the bounding box
174 glDisable( GL_LIGHTING);
175 glDisable( GL_TEXTURE_2D);
176 glEnable( GL_LINE_SMOOTH);
177 glEnable(GL_BLEND);
178 glBlendFunc( GL_SRC_ALPHA, GL_ONE); // GL_ONE_MINUS_SRC_ALPHA
179
180 glColor3f( 0.0, 1.0, 0.0);
181 // Draw the front face
182 glBegin( GL_LINE_LOOP);
183 glVertex3f( x1, y1, z1);
184 glVertex3f( x1, y2, z1);
185 glVertex3f( x2, y2, z1);
186 glVertex3f( x2, y1, z1);
187 glEnd();
188 #ifndef FTGL_DO_NOT_USE_VECTORISER
189 // Draw the back face
190 if( current_font == FTGL_EXTRUDE && z1 != z2)
191 {
192 glBegin( GL_LINE_LOOP);
193 glVertex3f( x1, y1, z2);
194 glVertex3f( x1, y2, z2);
195 glVertex3f( x2, y2, z2);
196 glVertex3f( x2, y1, z2);
197 glEnd();
198 // Join the faces
199 glBegin( GL_LINES);
200 glVertex3f( x1, y1, z1);
201 glVertex3f( x1, y1, z2);
202
203 glVertex3f( x1, y2, z1);
204 glVertex3f( x1, y2, z2);
205
206 glVertex3f( x2, y2, z1);
207 glVertex3f( x2, y2, z2);
208
209 glVertex3f( x2, y1, z1);
210 glVertex3f( x2, y1, z2);
211 glEnd();
212 }
213 #endif
214
215 // Draw the baseline, Ascender and Descender
216 glBegin( GL_LINES);
217 glColor3f( 0.0, 0.0, 1.0);
218 glVertex3f( 0.0, 0.0, 0.0);
219 glVertex3f( fonts[current_font]->Advance( myString), 0.0, 0.0);
220
221 glVertex3f( 0.0, fonts[current_font]->Ascender(), 0.0);
222 glVertex3f( 0.0, fonts[current_font]->Descender(), 0.0);
223
224 glEnd();
225
226 // Draw the origin
227 glColor3f( 1.0, 0.0, 0.0);
228 glPointSize( 5.0);
229 glBegin( GL_POINTS);
230 glVertex3f( 0.0, 0.0, 0.0);
231 glEnd();
232
233 // draw the info
234 int save_font = current_font;
235 current_font = FTGL_PIXMAP;
236 SetCamera();
237
238 // draw mode
239 glColor3f( 1.0, 1.0, 1.0);
240 glRasterPos2i( 20 , h_win - ( 20 + infoFont->Ascender()));
241
242 switch( mode)
243 {
244 case EDITING:
245 infoFont->render("Edit Mode");
246 break;
247 case INTERACTIVE:
248 break;
249 }
250
251 // draw font type
252 glRasterPos2i( 20 , 20);
253 switch( save_font)
254 {
255 case FTGL_BITMAP:
256 infoFont->render("Bitmap Font");
257 break;
258 case FTGL_PIXMAP:
259 infoFont->render("Pixmap Font");
260 break;
261 #ifndef FTGL_DO_NOT_USE_VECTORISER
262 case FTGL_OUTLINE:
263 infoFont->render("Outline Font");
264 break;
265 case FTGL_POLYGON:
266 infoFont->render("Polygon Font");
267 break;
268 case FTGL_EXTRUDE:
269 infoFont->render("Extruded Font");
270 break;
271 #endif
272 #ifndef FTGL_DO_NOT_USE_TEXTURE_FONT
273 case FTGL_TEXTURE:
274 infoFont->render("Texture Font");
275 break;
276 #endif
277 }
278
279 glRasterPos2i( 20 , 20 + infoFont->Ascender() - infoFont->Descender());
280 infoFont->render(fontfile);
281
282 current_font = save_font;
283
284 glutSwapBuffers();
285 }
286
myinit()287 void myinit ()
288 {
289 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
290 glClearColor( 0.13, 0.17, 0.32, 0.0);
291 glColor3f( 1.0, 1.0, 1.0);
292
293 glEnable( GL_CULL_FACE);
294 glFrontFace( GL_CCW);
295
296 glEnable( GL_DEPTH_TEST);
297
298 glEnable( GL_POLYGON_OFFSET_LINE);
299 glPolygonOffset( 1.0, 1.0); // ????
300
301 SetCamera();
302
303 fonts[FTGL_BITMAP] = new FTGLBitmapFont;
304 fonts[FTGL_PIXMAP] = new FTGLPixmapFont;
305
306 #ifndef FTGL_DO_NOT_USE_VECTORISER
307 fonts[FTGL_OUTLINE] = new FTGLOutlineFont;
308 fonts[FTGL_POLYGON] = new FTGLPolygonFont;
309 fonts[FTGL_EXTRUDE] = new FTGLExtrdFont;
310 #else
311 fonts[FTGL_OUTLINE] =
312 fonts[FTGL_POLYGON] =
313 fonts[FTGL_EXTRUDE] = 0;
314 #endif
315
316 #ifndef FTGL_DO_NOT_USE_TEXTURE_FONT
317 fonts[FTGL_TEXTURE] = new FTGLTextureFont;
318 #else
319 fonts[FTGL_TEXTURE] = 0;
320 #endif
321
322 for( int x = 0; x < 6; ++x)
323 {
324 if(!fonts[x])
325 {
326 continue;
327 }
328
329 if( !fonts[x]->Open( fontfile, false))
330 {
331 fprintf( stderr, "Failed to open font %s", fontfile);
332 exit(1);
333 }
334
335 if( !fonts[x]->FaceSize( 144))
336 {
337 fprintf( stderr, "Failed to set size");
338 exit(1);
339 }
340
341 fonts[x]->Depth(20);
342
343 fonts[x]->CharMap(ft_encoding_unicode);
344 }
345
346 infoFont = new FTGLPixmapFont;
347
348 if( !infoFont->Open( fontinfo, false))
349 {
350 fprintf( stderr, "Failed to open font %s", fontinfo);
351 exit(1);
352 }
353
354 infoFont->FaceSize( 18);
355
356 myString[0] = 65;
357 myString[1] = 0;
358
359
360 tbInit(GLUT_LEFT_BUTTON);
361 tbAnimate( GL_FALSE);
362
363 }
364
365 #ifndef GLUTCALLBACK
366 #define GLUTCALLBACK
367 #endif
368
369 extern "C" {
370
display()371 void GLUTCALLBACK display()
372 {
373 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
374
375 SetCamera();
376
377 glPushMatrix();
378
379 switch( current_font)
380 {
381 case FTGL_BITMAP:
382 case FTGL_PIXMAP:
383 glRasterPos2i( w_win / 2, h_win / 2);
384 glTranslatef( w_win / 2, h_win / 2, 0.0);
385 break;
386 #ifndef FTGL_DO_NOT_USE_VECTORISER
387 case FTGL_OUTLINE:
388 case FTGL_POLYGON:
389 case FTGL_EXTRUDE:
390 #endif
391 #ifndef FTGL_DO_NOT_USE_TEXTURE_FONT
392 case FTGL_TEXTURE:
393 #endif
394 #if !defined(FTGL_DO_NOT_USE_VECTORISER) || !defined(FTGL_DO_NOT_USE_TEXTURE_FONT)
395 tbMatrix();
396 break;
397 #endif
398 }
399
400 do_display();
401
402 glPopMatrix();
403
404 }
405
parsekey(unsigned char key,int,int)406 void GLUTCALLBACK parsekey(unsigned char key, int, int)
407 {
408 switch (key)
409 {
410 case 27: exit(0); break;
411 case 13:
412 if( mode == EDITING)
413 {
414 mode = INTERACTIVE;
415 }
416 else
417 {
418 mode = EDITING;
419 carat = 0;
420 }
421 break;
422 case ' ':
423 do
424 {
425 current_font++;
426 if(current_font > 5)
427 current_font = 0;
428 } while (!fonts[current_font]);
429 break;
430 default:
431 if( mode == INTERACTIVE)
432 {
433 myString[0] = key;
434 myString[1] = 0;
435 break;
436 }
437 else
438 {
439 myString[carat] = key;
440 myString[carat + 1] = 0;
441 carat = carat > 14 ? 15 : ++carat;
442 }
443 }
444
445 glutPostRedisplay();
446
447 }
448
449
parsekey_special(int key,int,int)450 void GLUTCALLBACK parsekey_special(int key, int, int)
451 {
452 switch (key)
453 {
454 case GLUT_KEY_UP:
455 posY += 10;
456 break;
457 case GLUT_KEY_DOWN:
458 posY -= 10;
459 break;
460 case GLUT_KEY_RIGHT:
461 posX += 10;
462 break;
463 case GLUT_KEY_LEFT:
464 posX -= 10;
465 break;
466 }
467 }
468
motion(int x,int y)469 void GLUTCALLBACK motion(int x, int y)
470 {
471 tbMotion( x, y);
472 }
473
mouse(int button,int state,int x,int y)474 void GLUTCALLBACK mouse(int button, int state, int x, int y)
475 {
476 tbMouse( button, state, x, y);
477 }
478
myReshape(int w,int h)479 void GLUTCALLBACK myReshape(int w, int h)
480 {
481 glMatrixMode (GL_MODELVIEW);
482 glViewport (0, 0, w, h);
483 glLoadIdentity();
484
485 w_win = w;
486 h_win = h;
487 SetCamera();
488
489 tbReshape(w_win, h_win);
490 }
491
492 } // End of extern C
493
SetCamera(void)494 void SetCamera(void)
495 {
496 switch( current_font)
497 {
498 case FTGL_BITMAP:
499 case FTGL_PIXMAP:
500 glMatrixMode( GL_PROJECTION);
501 glLoadIdentity();
502 #ifndef FTGL_DO_NOT_USE_VECTORISER
503 gluOrtho2D(0, w_win, 0, h_win);
504 #else
505 glOrtho(0, w_win, 0, h_win, -1.0, 1.0);
506 #endif
507 glMatrixMode(GL_MODELVIEW);
508 glLoadIdentity();
509 break;
510 #ifndef FTGL_DO_NOT_USE_VECTORISER
511 case FTGL_OUTLINE:
512 case FTGL_POLYGON:
513 case FTGL_EXTRUDE:
514 #endif
515 #ifndef FTGL_DO_NOT_USE_TEXTURE_FONT
516 case FTGL_TEXTURE:
517 #endif
518 #if !defined(FTGL_DO_NOT_USE_VECTORISER) || !defined(FTGL_DO_NOT_USE_TEXTURE_FONT)
519 glMatrixMode (GL_PROJECTION);
520 glLoadIdentity ();
521 gluPerspective( 90, (float)w_win / (float)h_win, 1, 1000);
522 glMatrixMode(GL_MODELVIEW);
523 glLoadIdentity();
524 gluLookAt( 0.0, 0.0, (float)h_win / 2.0f, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
525 break;
526 #endif
527 }
528 }
529
530
main(int argc,char * argv[])531 int main(int argc, char *argv[])
532 {
533 fontfile = FONT_FILE;
534 fontinfo = FONT_INFO;
535
536 if (argc == 2)
537 fontfile = fontinfo = argv[1];
538
539 glutInit( &argc, argv);
540 glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE);
541 glutInitWindowPosition(50, 50);
542 glutInitWindowSize( w_win, h_win);
543 glutCreateWindow("FTGL TEST");
544 glutDisplayFunc(&display);
545 glutKeyboardFunc(parsekey);
546 glutMouseFunc(mouse);
547 glutMotionFunc(motion);
548 glutSpecialFunc(parsekey_special);
549 glutReshapeFunc(myReshape);
550 glutIdleFunc(display);
551
552 myinit();
553
554 glutMainLoop();
555
556 return 0;
557 }
558