1#include "font_shader_class.h"
4font_shader_class::font_shader_class()
20font_shader_class::~font_shader_class()
25bool font_shader_class::initialize(ID3D11Device* device, HWND hwnd)
27 Logger::Get().
Log(
"Initializing font_shader_class", __FILE__, __LINE__, Logger::LogLevel::Initialize);
30 wchar_t vsFilename[128];
31 wchar_t psFilename[128];
35 error = wcscpy_s(vsFilename, 128, L
"src/hlsl/font.vs");
38 Logger::Get().
Log(
"Error copying string", __FILE__, __LINE__, Logger::LogLevel::Error);
43 error = wcscpy_s(psFilename, 128, L
"src/hlsl/font.ps");
46 Logger::Get().
Log(
"Error copying string", __FILE__, __LINE__, Logger::LogLevel::Error);
51 result = initialize_shader(device, hwnd, vsFilename, psFilename);
54 Logger::Get().
Log(
"Error initializing shader", __FILE__, __LINE__, Logger::LogLevel::Error);
58 Logger::Get().
Log(
"font_shader_class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
63void font_shader_class::shutdown()
71bool font_shader_class::render(ID3D11DeviceContext* deviceContext,
int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
72 XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture, XMFLOAT4 pixelColor)
78 result = set_shader_parameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture, pixelColor);
81 Logger::Get().
Log(
"Error setting shader parameters", __FILE__, __LINE__, Logger::LogLevel::Error);
86 render_shader(deviceContext, indexCount);
91bool font_shader_class::initialize_shader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename)
93 Logger::Get().
Log(
"Initializing shader", __FILE__, __LINE__, Logger::LogLevel::Initialize);
96 ID3D10Blob* errorMessage;
97 ID3D10Blob* vertexShaderBuffer;
98 ID3D10Blob* pixelShaderBuffer;
99 D3D11_INPUT_ELEMENT_DESC polygonLayout[2];
100 unsigned int numElements;
101 D3D11_BUFFER_DESC matrixBufferDesc;
102 D3D11_SAMPLER_DESC samplerDesc;
103 D3D11_BUFFER_DESC pixelBufferDesc;
108 vertexShaderBuffer = 0;
109 pixelShaderBuffer = 0;
112 result = D3DCompileFromFile(vsFilename, NULL, NULL,
"FontVertexShader",
"vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
113 &vertexShaderBuffer, &errorMessage);
119 output_shader_error_message(errorMessage, hwnd, vsFilename);
124 Logger::Get().
Log(
"Error compiling shader", __FILE__, __LINE__, Logger::LogLevel::Error);
131 result = D3DCompileFromFile(psFilename, NULL, NULL,
"FontPixelShader",
"ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
132 &pixelShaderBuffer, &errorMessage);
138 output_shader_error_message(errorMessage, hwnd, psFilename);
143 Logger::Get().
Log(
"Error compiling shader", __FILE__, __LINE__, Logger::LogLevel::Error);
150 result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &vertex_shader_);
153 Logger::Get().
Log(
"Error creating vertex shader", __FILE__, __LINE__, Logger::LogLevel::Error);
158 result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &pixel_shader_);
161 Logger::Get().
Log(
"Error creating pixel shader", __FILE__, __LINE__, Logger::LogLevel::Error);
166 polygonLayout[0].SemanticName =
"POSITION";
167 polygonLayout[0].SemanticIndex = 0;
168 polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
169 polygonLayout[0].InputSlot = 0;
170 polygonLayout[0].AlignedByteOffset = 0;
171 polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
172 polygonLayout[0].InstanceDataStepRate = 0;
174 polygonLayout[1].SemanticName =
"TEXCOORD";
175 polygonLayout[1].SemanticIndex = 0;
176 polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
177 polygonLayout[1].InputSlot = 0;
178 polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
179 polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
180 polygonLayout[1].InstanceDataStepRate = 0;
184 numElements =
sizeof(polygonLayout) /
sizeof(polygonLayout[0]);
187 result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(),
188 vertexShaderBuffer->GetBufferSize(), &layout_);
191 Logger::Get().
Log(
"Error creating input layout", __FILE__, __LINE__, Logger::LogLevel::Error);
196 vertexShaderBuffer->Release();
197 vertexShaderBuffer = 0;
199 pixelShaderBuffer->Release();
200 pixelShaderBuffer = 0;
203 matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
204 matrixBufferDesc.ByteWidth =
sizeof(matrix_buffer_type);
205 matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
206 matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
207 matrixBufferDesc.MiscFlags = 0;
208 matrixBufferDesc.StructureByteStride = 0;
211 result = device->CreateBuffer(&matrixBufferDesc, NULL, &matrix_buffer_);
214 Logger::Get().
Log(
"Error creating constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
219 samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
220 samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
221 samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
222 samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
223 samplerDesc.MipLODBias = 0.0f;
224 samplerDesc.MaxAnisotropy = 1;
225 samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
226 samplerDesc.BorderColor[0] = 0;
227 samplerDesc.BorderColor[1] = 0;
228 samplerDesc.BorderColor[2] = 0;
229 samplerDesc.BorderColor[3] = 0;
230 samplerDesc.MinLOD = 0;
231 samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
234 result = device->CreateSamplerState(&samplerDesc, &sample_state_);
237 Logger::Get().
Log(
"Error creating sampler state", __FILE__, __LINE__, Logger::LogLevel::Error);
242 pixelBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
243 pixelBufferDesc.ByteWidth =
sizeof(pixel_buffer_type);
244 pixelBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
245 pixelBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
246 pixelBufferDesc.MiscFlags = 0;
247 pixelBufferDesc.StructureByteStride = 0;
250 result = device->CreateBuffer(&pixelBufferDesc, NULL, &pixel_buffer_);
253 Logger::Get().
Log(
"Error creating constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
257 Logger::Get().
Log(
"Shader initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
262void font_shader_class::shutdown_shader()
264 Logger::Get().
Log(
"Shutting down shader", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
269 pixel_buffer_->Release();
276 sample_state_->Release();
283 matrix_buffer_->Release();
297 pixel_shader_->Release();
304 vertex_shader_->Release();
308 Logger::Get().
Log(
"Shader shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
313void font_shader_class::output_shader_error_message(ID3D10Blob* errorMessage, HWND hwnd, WCHAR* shaderFilename)
316 unsigned long long bufferSize, i;
321 compileErrors = (
char*)(errorMessage->GetBufferPointer());
324 bufferSize = errorMessage->GetBufferSize();
327 fout.open(
"shader-error.txt");
330 for (i = 0; i < bufferSize; i++)
332 fout << compileErrors[i];
339 errorMessage->Release();
343 MessageBox(hwnd, L
"Error compiling shader. Check shader-error.txt for message.", shaderFilename, MB_OK);
348bool font_shader_class::set_shader_parameters(ID3D11DeviceContext* deviceContext, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
349 XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture, XMFLOAT4 pixelColor)
353 D3D11_MAPPED_SUBRESOURCE mappedResource;
354 matrix_buffer_type* dataPtr;
355 unsigned int bufferNumber;
356 pixel_buffer_type* dataPtr2;
360 worldMatrix = XMMatrixTranspose(worldMatrix);
361 viewMatrix = XMMatrixTranspose(viewMatrix);
362 projectionMatrix = XMMatrixTranspose(projectionMatrix);
365 result = deviceContext->Map(matrix_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
368 Logger::Get().
Log(
"Error mapping constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
373 dataPtr = (matrix_buffer_type*)mappedResource.pData;
376 dataPtr->world = worldMatrix;
377 dataPtr->view = viewMatrix;
378 dataPtr->projection = projectionMatrix;
381 deviceContext->Unmap(matrix_buffer_, 0);
387 deviceContext->VSSetConstantBuffers(bufferNumber, 1, &matrix_buffer_);
390 deviceContext->PSSetShaderResources(0, 1, &texture);
393 result = deviceContext->Map(pixel_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
396 Logger::Get().
Log(
"Error mapping constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
401 dataPtr2 = (pixel_buffer_type*)mappedResource.pData;
404 dataPtr2->pixelColor = pixelColor;
407 deviceContext->Unmap(pixel_buffer_, 0);
413 deviceContext->PSSetConstantBuffers(bufferNumber, 1, &pixel_buffer_);
418void font_shader_class::render_shader(ID3D11DeviceContext* deviceContext,
int indexCount)
421 deviceContext->IASetInputLayout(layout_);
424 deviceContext->VSSetShader(vertex_shader_, NULL, 0);
425 deviceContext->PSSetShader(pixel_shader_, NULL, 0);
428 deviceContext->PSSetSamplers(0, 1, &sample_state_);
431 deviceContext->DrawIndexed(indexCount, 0, 0);
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)