📄 glfont.cpp
字号:
/*
gltext.cpp - Font class
Copyright (c) HalfLucifer, 2001.6.15
*/
#include "glfont.h"
bool GLfont::Initialize(char *filename)
{
float cx = 0;
float cy = 0;
if (!FontTexture.LoadTGA(filename))
{
MessageBox(NULL, "Text Initialization Failed.", "ERROR",MB_OK|MB_ICONEXCLAMATION);
return false;
}
base = glGenLists(95); // Creating 256 display lists
glBindTexture(GL_TEXTURE_2D, FontTexture.ID());
for (int loop=0; loop<95; loop++) // Loop through all 256 lists
{
cx = float (loop%16) / 16.0f; // X position of current character
cy = float (loop/16) / 8.0f; // Y position of current character
glNewList(base+loop, GL_COMPILE);
glBegin(GL_TRIANGLE_STRIP); // Use triangle strip for each character
glTexCoord2f(cx+0.0625f, 1.0f-cy); // Top right
glVertex2i(16, 16);
glTexCoord2f(cx, 1.0f-cy); // Top left
glVertex2i(0, 16);
glTexCoord2f(cx+0.0625f, 1.0f-cy-0.12f); // Bottom right
glVertex2i(16, 0);
glTexCoord2f(cx, 1.0f-cy-0.12f); // Bottom left
glVertex2d(0, 0);
glEnd();
glTranslated(12, 0, 0); // Move to the right of the character
glEndList();
}
return true;
}
GLvoid GLfont::Print(GLint xpos, GLint ypos, const char *string, ...)
{
va_list va;
va_start(va, string); // Parses the string for variables
vsprintf(text, string, va); // Converts symbols to actual numbers
va_end(va); // Results are stored in text
GetStates(); // Get the current states
GetClientRect(hWnd, &Viewport); // Get the window's dimensions
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, Viewport.right, 0, Viewport.bottom, -1, 1); // Set up an orthogonal screen
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslated(xpos, ypos, 0);
glBindTexture(GL_TEXTURE_2D, FontTexture.ID());
glListBase(base-32); // Choose the font set
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // Draws the display list text
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
SetStates(); // Restore the previous states
}
void GLfont::GetStates()
{
glGetIntegerv(GL_MATRIX_MODE, &MatrixMode);
glGetIntegerv(GL_POLYGON_MODE, &PolygonMode);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
DepthOn = glIsEnabled(GL_DEPTH_TEST);
if (DepthOn)
glDisable(GL_DEPTH_TEST);
LightingOn = glIsEnabled(GL_LIGHTING);
if (LightingOn)
glDisable(GL_LIGHTING);
TextureOn = glIsEnabled(GL_TEXTURE_2D);
if (!TextureOn)
glEnable(GL_TEXTURE_2D);
ScissorOn = glIsEnabled(GL_SCISSOR_TEST);
if (!ScissorOn)
glEnable(GL_SCISSOR_TEST);
BlendOn = glIsEnabled(GL_BLEND);
glGetIntegerv(GL_BLEND_SRC, &BlendSrc);
glGetIntegerv(GL_BLEND_DST, &BlendDst);
if (!BlendOn)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void GLfont::SetStates()
{
glMatrixMode(MatrixMode);
glPolygonMode(GL_FRONT_AND_BACK, PolygonMode);
if (DepthOn)
glEnable(GL_DEPTH_TEST);
if (LightingOn)
glEnable(GL_LIGHTING);
if (!TextureOn)
glDisable(GL_TEXTURE_2D);
if (!ScissorOn)
glDisable(GL_SCISSOR_TEST);
if (!BlendOn)
glDisable(GL_BLEND);
glBlendFunc(BlendSrc, BlendDst);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -