⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glfont.cpp

📁 实战粒子系统例程
💻 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 + -