1#include "translate_shader_class.h"
4translate_shader_class::translate_shader_class()
11 translate_buffer_ = 0;
20translate_shader_class::~translate_shader_class()
25bool translate_shader_class::initialize(ID3D11Device* device, HWND hwnd)
27 Logger::Get().
Log(
"Initilaizing translate_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/translate.vs");
38 Logger::Get().
Log(
"Failed to copy vsFilename", __FILE__, __LINE__, Logger::LogLevel::Error);
43 error = wcscpy_s(psFilename, 128, L
"src/hlsl/translate.ps");
46 Logger::Get().
Log(
"Failed to copy psFilename", __FILE__, __LINE__, Logger::LogLevel::Error);
51 result = initialize_shader(device, hwnd, vsFilename, psFilename);
54 Logger::Get().
Log(
"Failed to initialize shader", __FILE__, __LINE__, Logger::LogLevel::Error);
58 Logger::Get().
Log(
"translate_shader_class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
64void translate_shader_class::shutdown()
72bool translate_shader_class::render(ID3D11DeviceContext * deviceContext,
int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
73 XMMATRIX projectionMatrix, ID3D11ShaderResourceView * texture,
float translation)
79 result = set_shader_parameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture, translation);
82 Logger::Get().
Log(
"Failed to set shader parameters", __FILE__, __LINE__, Logger::LogLevel::Error);
87 render_shader(deviceContext, indexCount);
93bool translate_shader_class::initialize_shader(ID3D11Device * device, HWND hwnd, WCHAR * vsFilename, WCHAR * psFilename)
95 Logger::Get().
Log(
"Initializing translate shader", __FILE__, __LINE__, Logger::LogLevel::Initialize);
98 ID3D10Blob* errorMessage;
99 ID3D10Blob* vertexShaderBuffer;
100 ID3D10Blob* pixelShaderBuffer;
101 D3D11_INPUT_ELEMENT_DESC polygonLayout[2];
102 unsigned int numElements;
103 D3D11_BUFFER_DESC matrixBufferDesc;
104 D3D11_SAMPLER_DESC samplerDesc;
105 D3D11_BUFFER_DESC translateBufferDesc;
110 vertexShaderBuffer = 0;
111 pixelShaderBuffer = 0;
114 result = D3DCompileFromFile(vsFilename, NULL, NULL,
"TranslateVertexShader",
"vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
115 &vertexShaderBuffer, &errorMessage);
121 output_shader_error_message(errorMessage, hwnd, vsFilename);
126 Logger::Get().
Log(
"Failed to compile shader", __FILE__, __LINE__, Logger::LogLevel::Error);
133 result = D3DCompileFromFile(psFilename, NULL, NULL,
"TranslatePixelShader",
"ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
134 &pixelShaderBuffer, &errorMessage);
140 output_shader_error_message(errorMessage, hwnd, psFilename);
145 Logger::Get().
Log(
"Failed to compile shader", __FILE__, __LINE__, Logger::LogLevel::Error);
152 result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &vertex_shader_);
155 Logger::Get().
Log(
"Failed to create vertex shader", __FILE__, __LINE__, Logger::LogLevel::Error);
160 result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &pixel_shader_);
163 Logger::Get().
Log(
"Failed to create pixel shader", __FILE__, __LINE__, Logger::LogLevel::Error);
168 polygonLayout[0].SemanticName =
"POSITION";
169 polygonLayout[0].SemanticIndex = 0;
170 polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
171 polygonLayout[0].InputSlot = 0;
172 polygonLayout[0].AlignedByteOffset = 0;
173 polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
174 polygonLayout[0].InstanceDataStepRate = 0;
176 polygonLayout[1].SemanticName =
"TEXCOORD";
177 polygonLayout[1].SemanticIndex = 0;
178 polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
179 polygonLayout[1].InputSlot = 0;
180 polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
181 polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
182 polygonLayout[1].InstanceDataStepRate = 0;
185 numElements =
sizeof(polygonLayout) /
sizeof(polygonLayout[0]);
188 result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(),
189 vertexShaderBuffer->GetBufferSize(), &layout_);
192 Logger::Get().
Log(
"Failed to create input layout", __FILE__, __LINE__, Logger::LogLevel::Error);
197 vertexShaderBuffer->Release();
198 vertexShaderBuffer = 0;
200 pixelShaderBuffer->Release();
201 pixelShaderBuffer = 0;
204 matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
205 matrixBufferDesc.ByteWidth =
sizeof(matrix_buffer_type);
206 matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
207 matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
208 matrixBufferDesc.MiscFlags = 0;
209 matrixBufferDesc.StructureByteStride = 0;
212 result = device->CreateBuffer(&matrixBufferDesc, NULL, &matrix_buffer_);
215 Logger::Get().
Log(
"Failed to create matrix buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
220 samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
221 samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
222 samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
223 samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
224 samplerDesc.MipLODBias = 0.0f;
225 samplerDesc.MaxAnisotropy = 1;
226 samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
227 samplerDesc.BorderColor[0] = 0;
228 samplerDesc.BorderColor[1] = 0;
229 samplerDesc.BorderColor[2] = 0;
230 samplerDesc.BorderColor[3] = 0;
231 samplerDesc.MinLOD = 0;
232 samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
235 result = device->CreateSamplerState(&samplerDesc, &sample_state_);
238 Logger::Get().
Log(
"Failed to create sampler state", __FILE__, __LINE__, Logger::LogLevel::Error);
243 translateBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
244 translateBufferDesc.ByteWidth =
sizeof(translate_buffer_type);
245 translateBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
246 translateBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
247 translateBufferDesc.MiscFlags = 0;
248 translateBufferDesc.StructureByteStride = 0;
251 result = device->CreateBuffer(&translateBufferDesc, NULL, &translate_buffer_);
254 Logger::Get().
Log(
"Failed to create translate buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
258 Logger::Get().
Log(
"Translate shader initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
264void translate_shader_class::shutdown_shader()
266 Logger::Get().
Log(
"Shutting down translate shader", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
269 if (translate_buffer_)
271 translate_buffer_->Release();
272 translate_buffer_ = 0;
278 sample_state_->Release();
285 matrix_buffer_->Release();
299 pixel_shader_->Release();
306 vertex_shader_->Release();
310 Logger::Get().
Log(
"Translate shader shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
316void translate_shader_class::output_shader_error_message(ID3D10Blob * errorMessage, HWND hwnd, WCHAR * shaderFilename)
319 unsigned long long bufferSize, i;
324 compileErrors = (
char*)(errorMessage->GetBufferPointer());
327 bufferSize = errorMessage->GetBufferSize();
330 fout.open(
"shader-error.txt");
333 for (i = 0; i < bufferSize; i++)
335 fout << compileErrors[i];
342 errorMessage->Release();
346 MessageBox(hwnd, L
"Error compiling shader. Check shader-error.txt for message.", shaderFilename, MB_OK);
352bool translate_shader_class::set_shader_parameters(ID3D11DeviceContext * deviceContext, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
353 XMMATRIX projectionMatrix, ID3D11ShaderResourceView * texture,
float translation)
356 D3D11_MAPPED_SUBRESOURCE mappedResource;
357 matrix_buffer_type* dataPtr;
358 unsigned int bufferNumber;
359 translate_buffer_type* dataPtr2;
363 worldMatrix = XMMatrixTranspose(worldMatrix);
364 viewMatrix = XMMatrixTranspose(viewMatrix);
365 projectionMatrix = XMMatrixTranspose(projectionMatrix);
368 result = deviceContext->Map(matrix_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
371 Logger::Get().
Log(
"Failed to map matrix buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
376 dataPtr = (matrix_buffer_type*)mappedResource.pData;
379 dataPtr->world = worldMatrix;
380 dataPtr->view = viewMatrix;
381 dataPtr->projection = projectionMatrix;
384 deviceContext->Unmap(matrix_buffer_, 0);
390 deviceContext->VSSetConstantBuffers(bufferNumber, 1, &matrix_buffer_);
393 deviceContext->PSSetShaderResources(0, 1, &texture);
396 result = deviceContext->Map(translate_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
399 Logger::Get().
Log(
"Failed to map translate buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
404 dataPtr2 = (translate_buffer_type*)mappedResource.pData;
407 dataPtr2->translation = translation;
410 deviceContext->Unmap(translate_buffer_, 0);
416 deviceContext->PSSetConstantBuffers(bufferNumber, 1, &translate_buffer_);
422void translate_shader_class::render_shader(ID3D11DeviceContext * deviceContext,
int indexCount)
425 deviceContext->IASetInputLayout(layout_);
428 deviceContext->VSSetShader(vertex_shader_, NULL, 0);
429 deviceContext->PSSetShader(pixel_shader_, NULL, 0);
432 deviceContext->PSSetSamplers(0, 1, &sample_state_);
435 deviceContext->DrawIndexed(indexCount, 0, 0);
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)