www.pudn.com > 3dterrain.zip > bitmap_Font.cpp
#include "bitmap_font.h"
Font::Font(char *file_name, int *error) // Build Our Font Display List
{
float cx; // Holds Our X Character Coord
float cy; // Holds Our Y Character Coord
*error = !LoadGLTextures(file_name, &number_texture);
if(*error)return;
base=glGenLists(256); // Creating 256 Display Lists
glBindTexture(GL_TEXTURE_2D, number_texture); // Select Our Font Texture
for (loop=0; loop<256; loop++) // Loop Through All 256 Lists
{
cx=float(loop%16)/16.0f; // X Position Of Current Character
cy=float(loop/16)/16.0f; // Y Position Of Current Character
glNewList(base+loop,GL_COMPILE); // Start Building A List
glBegin(GL_QUADS); // Use A Quad For Each Character
glTexCoord2f(cx,1.0f-cy-0.0625f); // Texture Coord (Bottom Left)
glVertex2i(0,0); // Vertex Coord (Bottom Left)
glTexCoord2f(cx+0.0625f,1.0f-cy-0.0625f); // Texture Coord (Bottom Right)
glVertex2i(16,0); // Vertex Coord (Bottom Right)
glTexCoord2f(cx+0.0625f,1.0f-cy); // Texture Coord (Top Right)
glVertex2i(16,16); // Vertex Coord (Top Right)
glTexCoord2f(cx,1.0f-cy); // Texture Coord (Top Left)
glVertex2i(0,16); // Vertex Coord (Top Left)
glEnd(); // Done Building Our Quad (Character)
glTranslatef(11,0,0); //10,0,0 // Move To The Right Of The Character
glEndList(); // Done Building The Display List
} // Loop Until All 256 Are Built
}
Font::~Font(GLvoid) // Delete The Font From Memory
{
glDeleteLists(base,256); // Delete All 256 Display Lists
glDeleteTextures( 1, &number_texture );
}
GLvoid Font::glPrint_xy(GLint x, GLint y, char *string, int set) // Where The Printing Happens
{
if (set>1)set=1;
glBlendFunc(GL_SRC_ALPHA , GL_ONE_MINUS_SRC_COLOR); // nastavenie miešania farieb
//farba bodu = (pôvodná farba * ALPHA) + (kreslená farba - pôvodná farba)
glEnable(GL_BLEND); // povolenie miešania farieb
glBindTexture(GL_TEXTURE_2D, number_texture); // Select Our Font Texture
glDisable(GL_DEPTH_TEST); // Disables Depth Testing
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
glOrtho(0,screen_x_font,0,screen_y_font,-1,1); // Set Up An Ortho Screen
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPushMatrix(); // Store The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left)
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDisable(GL_BLEND); //vypnutie miešania farieb
}
GLvoid Font::glPrint(GLint x, GLint y, char *string, int set) // Where The Printing Happens
{
x = x*11; // vypocet x zo suradnice stlpca
y = screen_y_font - (y+1)*16; // vypocet y zo suradnice riadka
if (set>1)set=1;
glBlendFunc(GL_SRC_ALPHA , GL_ONE_MINUS_SRC_COLOR); // nastavenie miešania farieb
//farba bodu = (pôvodná farba * ALPHA) + (kreslená farba - pôvodná farba)
glEnable(GL_BLEND); // povolenie miešania farieb
glBindTexture(GL_TEXTURE_2D, number_texture); // Select Our Font Texture
glDisable(GL_DEPTH_TEST); // Disables Depth Testing
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
glOrtho(0,screen_x_font,0,screen_y_font,-1,1); // Set Up An Ortho Screen
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPushMatrix(); // Store The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
glTranslatef((float)x,(float)y,0); // Position The Text (0,0 - Bottom Left)
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDisable(GL_BLEND); //vypnutie miešania farieb
}
void Font::Begin()
{
glBlendFunc(GL_SRC_ALPHA , GL_ONE_MINUS_SRC_COLOR); // nastavenie miešania farieb
//farba bodu = (pôvodná farba * ALPHA) + (kreslená farba - pôvodná farba)
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, number_texture); // Select Our Font Texture
glDisable(GL_DEPTH_TEST); // Disables Depth Testing
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
glOrtho(0,screen_x_font,0,screen_y_font,-1,1); // Set Up An Ortho Screen
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPushMatrix(); // Store The Modelview Matrix
}
void Font::End()
{
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDisable(GL_BLEND); // vypnutie miešania farieb
}
void Font::Print(GLint x, GLint y, char * string, int set)
{
x = x*11; // vypocet x zo suradnice stlpca
y = screen_y_font - (y+1)*16; // vypocet y zo suradnice riadka
if (set>1)set=1;
glLoadIdentity(); // Reset The Modelview Matrix
glTranslatef((float)x,(float)y,0); // Position The Text (0,0 - Bottom Left)
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
}
void Font::Print_scale(GLint x, GLint y, char * string, int set,float scale_x,float scale_y)
{
x = x*11; // vypocet x zo suradnice stlpca
y = screen_y_font - (y+1)*16; // vypocet y zo suradnice riadka
if (set>1)set=1;
glLoadIdentity(); // Reset The Modelview Matrix
glTranslatef((float)x,(float)y,0); // Position The Text (0,0 - Bottom Left)
glScalef(scale_x,scale_y,1.0f);
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
}
void Font::Print_xy(GLint x, GLint y, char *string, int set)
{
if (set>1)set=1;
glLoadIdentity(); // Reset The Modelview Matrix
glTranslatef((float)x,(float)y,0); // Position The Text (0,0 - Bottom Left)
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
}
void Font::Print_xy_scale(GLint x, GLint y, char *string, int set,float scale_x,float scale_y)
{
if (set>1)set=1;
glLoadIdentity(); // Reset The Modelview Matrix
glTranslatef((float)x,(float)y,0); // Position The Text (0,0 - Bottom Left)
glScalef(scale_x,scale_y,1.0f);
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
}
void Font::Print_xy_rot(GLint x, GLint y, char *string, int set,float uhol,float scale)
{
if (set>1)set=1;
glLoadIdentity(); // Reset The Modelview Matrix
glTranslatef((float)x,(float)y,0); // Position The Text (0,0 - Bottom Left)
glRotatef(uhol,0,0,1);
glScalef(scale,1.0f,1.0f);
glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen
}
AUX_RGBImageRec* Font::LoadBMP(char *Filename) // Načítanie bitmapového obrázka
{
FILE *File=NULL; // smernik na subor
if (!Filename)return NULL; // skúška či meno súboru bolo zadané
File=fopen(Filename,"r"); // otvorenie súboru na čítanie
if (File) // existuje súbor ?
{
fclose(File); // Uzatvorenie súbora
return auxDIBImageLoad(Filename); // Načíta obrázok a vráti pointer
}
return NULL; // Ak sa obrázok nenačítal vráti NULL
}
int Font::LoadGLTextures(char *texture_name,GLuint *texture) // Načíta obrázok a uloži ako textury
{
int Status=TRUE; // indikator
AUX_RGBImageRec *TextureImage; // miesto pre štruktúru
TextureImage=NULL;
if (TextureImage=LoadBMP(texture_name))
{
glGenTextures(1, texture);
glBindTexture(GL_TEXTURE_2D, *texture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP ); // nastavuje za textury sa v smere u (vodorovnom) neopakuju
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP ); // nastavuje za textury sa v smere v (zvislom) neopakuju
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);
}
else
{ MessageBox(NULL,"Chyba načítania obrázka.",texture_name,MB_ICONERROR);Status=false;}
if (TextureImage) // Ak textura existuje
{
if (TextureImage->data)free(TextureImage->data);// ak existuju data uvoľni z pamäte
free(TextureImage); // uvoľni štruktúru
}
return Status;
}