Khaotic Engine Reborn
Loading...
Searching...
No Matches
font_class.cpp
1#include "font_class.h"
2
3font_class::font_class()
4{
5 m_Font = 0;
6 m_Texture = 0;
7}
8
9
10font_class::font_class(const font_class& other)
11{
12}
13
14
15font_class::~font_class()
16{
17}
18
19bool font_class::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, int fontChoice)
20{
21 Logger::Get().Log("Initializing font class", __FILE__, __LINE__, Logger::LogLevel::Initialize);
22
23 char fontFilename[128];
24 char fontTextureFilename[128];
25 bool result;
26
27 // Choose one of the available fonts, and default to the first font otherwise.
28 switch (fontChoice)
29 {
30 case 0:
31 {
32 strcpy_s(fontFilename, "font01.txt");
33 strcpy_s(fontTextureFilename, "font01.tga");
34 m_fontHeight = 32.0f;
35 m_spaceSize = 3;
36 break;
37 }
38 default:
39 {
40 strcpy_s(fontFilename, "font01.txt");
41 strcpy_s(fontTextureFilename, "font01.tga");
42 m_fontHeight = 32.0f;
43 m_spaceSize = 3;
44 break;
45 }
46 }
47
48 // Load in the text file containing the font data.
49 result = LoadFontData(fontFilename);
50 if (!result)
51 {
52 Logger::Get().Log("Failed to load font data", __FILE__, __LINE__, Logger::LogLevel::Error);
53 return false;
54 }
55
56 // Load the texture that has the font characters on it.
57 result = LoadTexture(device, deviceContext, fontTextureFilename);
58 if (!result)
59 {
60 Logger::Get().Log("Failed to load font texture", __FILE__, __LINE__, Logger::LogLevel::Error);
61 return false;
62 }
63
64 Logger::Get().Log("Font class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
65
66 return true;
67}
68
69void font_class::Shutdown()
70{
71 // Release the font texture.
72 ReleaseTexture();
73
74 // Release the font data.
75 ReleaseFontData();
76
77 return;
78}
79
80bool font_class::LoadFontData(char* filename)
81{
82 Logger::Get().Log(("Loading font data from %s", filename), __FILE__, __LINE__);
83
84 std::ifstream fin;
85 int i;
86 char temp;
87
88 // Create the font spacing buffer.
89 m_Font = new FontType[95];
90
91 // Read in the font size and spacing between chars.
92 fin.open(filename);
93 if (fin.fail())
94 {
95 Logger::Get().Log("Failed to open font file", __FILE__, __LINE__, Logger::LogLevel::Error);
96 return false;
97 }
98
99 // Read in the 95 used ascii characters for text.
100 for (i = 0; i < 95; i++)
101 {
102 fin.get(temp);
103 while (temp != ' ')
104 {
105 fin.get(temp);
106 }
107 fin.get(temp);
108 while (temp != ' ')
109 {
110 fin.get(temp);
111 }
112
113 fin >> m_Font[i].left;
114 fin >> m_Font[i].right;
115 fin >> m_Font[i].size;
116 }
117
118 // Close the file.
119 fin.close();
120
121 Logger::Get().Log("Font data loaded", __FILE__, __LINE__);
122
123 return true;
124}
125
126void font_class::ReleaseFontData()
127{
128 // Release the font data array.
129 if (m_Font)
130 {
131 delete[] m_Font;
132 m_Font = 0;
133 }
134
135 return;
136}
137
138bool font_class::LoadTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* filename)
139{
140 Logger::Get().Log(("Loading font texture from %s", filename), __FILE__, __LINE__);
141
142 bool result;
143
144
145 // Create and initialize the font texture object.
146 m_Texture = new texture_class;
147
148 result = m_Texture->Initialize(device, deviceContext, filename);
149 if (!result)
150 {
151 Logger::Get().Log("Failed to initialize font texture", __FILE__, __LINE__, Logger::LogLevel::Error);
152 return false;
153 }
154
155 Logger::Get().Log("Font texture loaded", __FILE__, __LINE__);
156
157 return true;
158}
159
160void font_class::ReleaseTexture()
161{
162 // Release the texture object.
163 if (m_Texture)
164 {
165 m_Texture->Shutdown();
166 delete m_Texture;
167 m_Texture = 0;
168 }
169
170 return;
171}
172
173ID3D11ShaderResourceView* font_class::GetTexture()
174{
175 return m_Texture->GetTexture();
176}
177
178void font_class::BuildVertexArray(void* vertices, char* sentence, float drawX, float drawY)
179{
180 VertexType* vertexPtr;
181 int numLetters, index, i, letter;
182
183
184 // Coerce the input vertices into a VertexType structure.
185 vertexPtr = (VertexType*)vertices;
186
187 // Get the number of letters in the sentence.
188 numLetters = (int)strlen(sentence);
189
190 // Initialize the index to the vertex array.
191 index = 0;
192
193 // Draw each letter onto a quad.
194 for (i = 0; i < numLetters; i++)
195 {
196 letter = ((int)sentence[i]) - 32;
197
198 // If the letter is a space then just move over three pixels.
199 if (letter == 0)
200 {
201 drawX = drawX + m_spaceSize;
202 }
203 else
204 {
205 // First triangle in quad.
206 vertexPtr[index].position = XMFLOAT3(drawX, drawY, 0.0f); // Top left.
207 vertexPtr[index].texture = XMFLOAT2(m_Font[letter].left, 0.0f);
208 index++;
209
210 vertexPtr[index].position = XMFLOAT3((drawX + m_Font[letter].size), (drawY - m_fontHeight), 0.0f); // Bottom right.
211 vertexPtr[index].texture = XMFLOAT2(m_Font[letter].right, 1.0f);
212 index++;
213
214 vertexPtr[index].position = XMFLOAT3(drawX, (drawY - m_fontHeight), 0.0f); // Bottom left.
215 vertexPtr[index].texture = XMFLOAT2(m_Font[letter].left, 1.0f);
216 index++;
217
218 // Second triangle in quad.
219 vertexPtr[index].position = XMFLOAT3(drawX, drawY, 0.0f); // Top left.
220 vertexPtr[index].texture = XMFLOAT2(m_Font[letter].left, 0.0f);
221 index++;
222
223 vertexPtr[index].position = XMFLOAT3(drawX + m_Font[letter].size, drawY, 0.0f); // Top right.
224 vertexPtr[index].texture = XMFLOAT2(m_Font[letter].right, 0.0f);
225 index++;
226
227 vertexPtr[index].position = XMFLOAT3((drawX + m_Font[letter].size), (drawY - m_fontHeight), 0.0f); // Bottom right.
228 vertexPtr[index].texture = XMFLOAT2(m_Font[letter].right, 1.0f);
229 index++;
230
231 // Update the x location for drawing by the size of the letter and one pixel.
232 drawX = drawX + m_Font[letter].size + 1.0f;
233 }
234 }
235
236 return;
237}
238
239int font_class::GetSentencePixelLength(char* sentence)
240{
241 int pixelLength, numLetters, i, letter;
242
243
244 pixelLength = 0;
245 numLetters = (int)strlen(sentence);
246
247 for (i = 0; i < numLetters; i++)
248 {
249 letter = ((int)sentence[i]) - 32;
250
251 // If the letter is a space then count it as three pixels.
252 if (letter == 0)
253 {
254 pixelLength += m_spaceSize;
255 }
256 else
257 {
258 pixelLength += (m_Font[letter].size + 1);
259 }
260 }
261
262 return pixelLength;
263}
264
265int font_class::GetFontHeight()
266{
267 return (int)m_fontHeight;
268}
static Logger & Get()
Definition Logger.h:20
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)
Definition Logger.h:158