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