269 lines
6.5 KiB
C++
269 lines
6.5 KiB
C++
#include "fontclass.h"
|
|
|
|
FontClass::FontClass()
|
|
{
|
|
m_Font = 0;
|
|
m_Texture = 0;
|
|
}
|
|
|
|
|
|
FontClass::FontClass(const FontClass& other)
|
|
{
|
|
}
|
|
|
|
|
|
FontClass::~FontClass()
|
|
{
|
|
}
|
|
|
|
bool FontClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, int fontChoice)
|
|
{
|
|
Logger::Get().Log("Initializing font class", __FILE__, __LINE__, Logger::LogLevel::Initialize);
|
|
|
|
char fontFilename[128];
|
|
char fontTextureFilename[128];
|
|
bool result;
|
|
|
|
// Choose one of the available fonts, and default to the first font otherwise.
|
|
switch (fontChoice)
|
|
{
|
|
case 0:
|
|
{
|
|
strcpy_s(fontFilename, "font01.txt");
|
|
strcpy_s(fontTextureFilename, "font01.tga");
|
|
m_fontHeight = 32.0f;
|
|
m_spaceSize = 3;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
strcpy_s(fontFilename, "font01.txt");
|
|
strcpy_s(fontTextureFilename, "font01.tga");
|
|
m_fontHeight = 32.0f;
|
|
m_spaceSize = 3;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Load in the text file containing the font data.
|
|
result = LoadFontData(fontFilename);
|
|
if (!result)
|
|
{
|
|
Logger::Get().Log("Failed to load font data", __FILE__, __LINE__, Logger::LogLevel::Error);
|
|
return false;
|
|
}
|
|
|
|
// Load the texture that has the font characters on it.
|
|
result = LoadTexture(device, deviceContext, fontTextureFilename);
|
|
if (!result)
|
|
{
|
|
Logger::Get().Log("Failed to load font texture", __FILE__, __LINE__, Logger::LogLevel::Error);
|
|
return false;
|
|
}
|
|
|
|
Logger::Get().Log("Font class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
|
|
|
|
return true;
|
|
}
|
|
|
|
void FontClass::Shutdown()
|
|
{
|
|
// Release the font texture.
|
|
ReleaseTexture();
|
|
|
|
// Release the font data.
|
|
ReleaseFontData();
|
|
|
|
return;
|
|
}
|
|
|
|
bool FontClass::LoadFontData(char* filename)
|
|
{
|
|
Logger::Get().Log(("Loading font data from %s", filename), __FILE__, __LINE__);
|
|
|
|
std::ifstream fin;
|
|
int i;
|
|
char temp;
|
|
|
|
// Create the font spacing buffer.
|
|
m_Font = new FontType[95];
|
|
|
|
// Read in the font size and spacing between chars.
|
|
fin.open(filename);
|
|
if (fin.fail())
|
|
{
|
|
Logger::Get().Log("Failed to open font file", __FILE__, __LINE__, Logger::LogLevel::Error);
|
|
return false;
|
|
}
|
|
|
|
// Read in the 95 used ascii characters for text.
|
|
for (i = 0; i < 95; i++)
|
|
{
|
|
fin.get(temp);
|
|
while (temp != ' ')
|
|
{
|
|
fin.get(temp);
|
|
}
|
|
fin.get(temp);
|
|
while (temp != ' ')
|
|
{
|
|
fin.get(temp);
|
|
}
|
|
|
|
fin >> m_Font[i].left;
|
|
fin >> m_Font[i].right;
|
|
fin >> m_Font[i].size;
|
|
}
|
|
|
|
// Close the file.
|
|
fin.close();
|
|
|
|
Logger::Get().Log("Font data loaded", __FILE__, __LINE__);
|
|
|
|
return true;
|
|
}
|
|
|
|
void FontClass::ReleaseFontData()
|
|
{
|
|
// Release the font data array.
|
|
if (m_Font)
|
|
{
|
|
delete[] m_Font;
|
|
m_Font = 0;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
bool FontClass::LoadTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* filename)
|
|
{
|
|
Logger::Get().Log(("Loading font texture from %s", filename), __FILE__, __LINE__);
|
|
|
|
bool result;
|
|
|
|
|
|
// Create and initialize the font texture object.
|
|
m_Texture = new TextureClass;
|
|
|
|
result = m_Texture->Initialize(device, deviceContext, filename);
|
|
if (!result)
|
|
{
|
|
Logger::Get().Log("Failed to initialize font texture", __FILE__, __LINE__, Logger::LogLevel::Error);
|
|
return false;
|
|
}
|
|
|
|
Logger::Get().Log("Font texture loaded", __FILE__, __LINE__);
|
|
|
|
return true;
|
|
}
|
|
|
|
void FontClass::ReleaseTexture()
|
|
{
|
|
// Release the texture object.
|
|
if (m_Texture)
|
|
{
|
|
m_Texture->Shutdown();
|
|
delete m_Texture;
|
|
m_Texture = 0;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
ID3D11ShaderResourceView* FontClass::GetTexture()
|
|
{
|
|
return m_Texture->GetTexture();
|
|
}
|
|
|
|
void FontClass::BuildVertexArray(void* vertices, char* sentence, float drawX, float drawY)
|
|
{
|
|
VertexType* vertexPtr;
|
|
int numLetters, index, i, letter;
|
|
|
|
|
|
// Coerce the input vertices into a VertexType structure.
|
|
vertexPtr = (VertexType*)vertices;
|
|
|
|
// Get the number of letters in the sentence.
|
|
numLetters = (int)strlen(sentence);
|
|
|
|
// Initialize the index to the vertex array.
|
|
index = 0;
|
|
|
|
// Draw each letter onto a quad.
|
|
for (i = 0; i < numLetters; i++)
|
|
{
|
|
letter = ((int)sentence[i]) - 32;
|
|
|
|
// If the letter is a space then just move over three pixels.
|
|
if (letter == 0)
|
|
{
|
|
drawX = drawX + m_spaceSize;
|
|
}
|
|
else
|
|
{
|
|
// First triangle in quad.
|
|
vertexPtr[index].position = XMFLOAT3(drawX, drawY, 0.0f); // Top left.
|
|
vertexPtr[index].texture = XMFLOAT2(m_Font[letter].left, 0.0f);
|
|
index++;
|
|
|
|
vertexPtr[index].position = XMFLOAT3((drawX + m_Font[letter].size), (drawY - m_fontHeight), 0.0f); // Bottom right.
|
|
vertexPtr[index].texture = XMFLOAT2(m_Font[letter].right, 1.0f);
|
|
index++;
|
|
|
|
vertexPtr[index].position = XMFLOAT3(drawX, (drawY - m_fontHeight), 0.0f); // Bottom left.
|
|
vertexPtr[index].texture = XMFLOAT2(m_Font[letter].left, 1.0f);
|
|
index++;
|
|
|
|
// Second triangle in quad.
|
|
vertexPtr[index].position = XMFLOAT3(drawX, drawY, 0.0f); // Top left.
|
|
vertexPtr[index].texture = XMFLOAT2(m_Font[letter].left, 0.0f);
|
|
index++;
|
|
|
|
vertexPtr[index].position = XMFLOAT3(drawX + m_Font[letter].size, drawY, 0.0f); // Top right.
|
|
vertexPtr[index].texture = XMFLOAT2(m_Font[letter].right, 0.0f);
|
|
index++;
|
|
|
|
vertexPtr[index].position = XMFLOAT3((drawX + m_Font[letter].size), (drawY - m_fontHeight), 0.0f); // Bottom right.
|
|
vertexPtr[index].texture = XMFLOAT2(m_Font[letter].right, 1.0f);
|
|
index++;
|
|
|
|
// Update the x location for drawing by the size of the letter and one pixel.
|
|
drawX = drawX + m_Font[letter].size + 1.0f;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
int FontClass::GetSentencePixelLength(char* sentence)
|
|
{
|
|
int pixelLength, numLetters, i, letter;
|
|
|
|
|
|
pixelLength = 0;
|
|
numLetters = (int)strlen(sentence);
|
|
|
|
for (i = 0; i < numLetters; i++)
|
|
{
|
|
letter = ((int)sentence[i]) - 32;
|
|
|
|
// If the letter is a space then count it as three pixels.
|
|
if (letter == 0)
|
|
{
|
|
pixelLength += m_spaceSize;
|
|
}
|
|
else
|
|
{
|
|
pixelLength += (m_Font[letter].size + 1);
|
|
}
|
|
}
|
|
|
|
return pixelLength;
|
|
}
|
|
|
|
int FontClass::GetFontHeight()
|
|
{
|
|
return (int)m_fontHeight;
|
|
}
|