Выбрать главу

* DOWNLOAD Delphi Code For This Lesson. (Conversion by Marc Aarts)

* DOWNLOAD Game GLUT Code For This Lesson. (Conversion by Milikas Anastasios)

* DOWNLOAD Java Code For This Lesson. (Conversion by Jeff Kirby)

* DOWNLOAD Mac OS Code For This Lesson. (Conversion by Anthony Parker)

* DOWNLOAD Visual Basic Code For This Lesson. (Conversion by Ross Dawson)

* DOWNLOAD Visual Basic Code For This Lesson. (Conversion by Edo

Lesson 15

After posting the last two tutorials on bitmap and outlined fonts, I received quite a few emails from people wondering how they could texture map the fonts. You can use autotexture coordinate generation. This will generate texture coordinates for each of the polygons on the font.

A small note, this code is Windows specific. It uses the wgl functions of Windows to build the font. Apparently Apple has agl support that should do the same thing, and X has glx. Unfortunately I can't guarantee this code is portable. If anyone has platform independant code to draw fonts to the screen, send it my way and I'll write another font tutorial.

We'll build our Texture Font demo using the code from lesson 14. If any of the code has changed in a particular section of the program, I'll rewrite the entire section of code so that it's easier to see the changes that I have made.

The following section of code is similar to the code in lesson 14, but this time we're not going to include the stdarg.h file.

#include <windows.h> // Header File For Windows

#include <math.h> // Header File For Windows Math Library

#include <stdio.h> // Header File For Standard Input/Output

#include <gl\gl.h> // Header File For The OpenGL32 Library

#include <gl\glu.h> // Header File For The GLu32 Library

#include <gl\glaux.h> // Header File For The GLaux Library

HDC hDC=NULL; // Private GDI Device Context

HGLRC hRC=NULL; // Permanent Rendering Context

HWND hWnd=NULL; // Holds Our Window Handle

HINSTANCE hInstance; // Holds The Instance Of The Application

bool keys[256]; // Array Used For The Keyboard Routine

bool active=TRUE; // Window Active Flag Set To TRUE By Default

bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default

We're going to add one new integer variable here called texture[ ]. It will be used to store our texture. The last three lines were in tutorial 14 and have not changed in this tutorial.

GLuint texture[1]; // One Texture Map ( NEW )

GLuint base; // Base Display List For The Font Set

GLfloat rot; // Used To Rotate The Text

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc

The following section of code has some minor changes. In this tutorial I'm going to use the wingdings font to display a skull and crossbones type object. If you want to display text instead, you can leave the code the same as it was in lesson 14, or change to a font of your own.

A few of you were wondering how to use the wingdings font, which is another reason I'm not using a standard font. Wingdings is a SYMBOL font, and requires a few changes to make it work. It's not as easy as telling Windows to use the wingdings font. If you change the font name to wingdings, you'll notice that the font doesn't get selected. You have to tell Windows that the font is a symbol font and not a standard character font. More on this later.

GLvoid BuildFont(GLvoid) // Build Our Bitmap Font

{

 GLYPHMETRICSFLOAT gmf[256]; // Address Buffer For Font Storage

 HFONT font; // Windows Font ID

 base = glGenLists(256); // Storage For 256 Characters

 font = CreateFont(–12, // Height Of Font

  0, // Width Of Font

  0, // Angle Of Escapement

  0, // Orientation Angle

  FW_BOLD, // Font Weight

  FALSE, // Italic

  FALSE, // Underline

  FALSE, // Strikeout

This is the magic line! Instead of using ANSI_CHARSET like we did in tutorial 14, we're going to use SYMBOL_CHARSET. This tells Windows that the font we are building is not your typical font made up of characters. A symbol font is usually made up of tiny pictures (symbols). If you forget to change this line, wingdings, webdings and any other symbol font you may be trying to use will not work.

  SYMBOL_CHARSET, // Character Set Identifier ( Modified )

The next few lines have not changed.

  OUT_TT_PRECIS, // Output Precision

  CLIP_DEFAULT_PRECIS, // Clipping Precision

  ANTIALIASED_QUALITY, // Output Quality

  FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch

Now that we've selected the symbol character set identifier, we can select the wingdings font!

  "Wingdings"); // Font Name ( Modified )

The remaining lines of code have not changed.

 SelectObject(hDC, font); // Selects The Font We Created

 wglUseFontOutlines(hDC, // Select The Current DC

  0, // Starting Character

  255, // Number Of Display Lists To Build

  base, // Starting Display Lists

I'm allowing for more deviation. This means GL will not try to follow the outline of the font as closely. If you set deviation to 0.0f, you'll notice problems with the texturing on really curved surfaces. If you allow for some deviation, most of the problems will disappear.

  0.1f, // Deviation From The True Outlines

The next three lines of code are still the same.

  0.2f, // Font Thickness In The Z Direction

  WGL_FONT_POLYGONS, // Use Polygons, Not Lines

  gmf); // Address Of Buffer To Recieve Data

}

Right before ReSizeGLScene() we're going to add the following section of code to load our texture. You might recognize the code from previous tutorials. We create storage for the bitmap image. We load the bitmap image. We tell OpenGL to generate 1 texture, and we store this texture in texture[0].

I'm creating a mipmapped texture only because it looks better. The name of the texture is lights.bmp.

AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image

{

 FILE *File=NULL; // File Handle

 if (!Filename) // Make Sure A Filename Was Given

 {

  return NULL; // If Not Return NULL

 }

 File=fopen(Filename,"r"); // Check To See If The File Exists