1#include "texture_shader_class.h"
4texture_shader_class::texture_shader_class()
19texture_shader_class::~texture_shader_class()
24bool texture_shader_class::initialize(ID3D11Device* device, HWND hwnd)
26 Logger::Get().
Log(
"Initializing texture shader", __FILE__, __LINE__, Logger::LogLevel::Initialize);
29 wchar_t vsFilename[128];
30 wchar_t psFilename[128];
33 error = wcscpy_s(vsFilename, 128, L
"src/hlsl/texture.vs");
36 Logger::Get().
Log(
"Error copying stirng", __FILE__, __LINE__, Logger::LogLevel::Error);
41 error = wcscpy_s(psFilename, 128, L
"src/hlsl/texture.ps");
44 Logger::Get().
Log(
"Error copying stirng", __FILE__, __LINE__, Logger::LogLevel::Error);
49 result = initialize_shader(device, hwnd, vsFilename, psFilename);
52 Logger::Get().
Log(
"Error initializing shader", __FILE__, __LINE__, Logger::LogLevel::Error);
56 Logger::Get().
Log(
"Texture shader initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
61void texture_shader_class::shutdown()
69bool texture_shader_class::render(ID3D11DeviceContext* deviceContext,
int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
70 XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture)
76 result = set_shader_parameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture);
79 Logger::Get().
Log(
"Error setting shader parameters", __FILE__, __LINE__, Logger::LogLevel::Error);
84 render_shader(deviceContext, indexCount);
89bool texture_shader_class::initialize_shader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename)
91 Logger::Get().
Log(
"Initializing shader", __FILE__, __LINE__, Logger::LogLevel::Initialize);
94 ID3D10Blob* errorMessage;
95 ID3D10Blob* vertexShaderBuffer;
96 ID3D10Blob* pixelShaderBuffer;
97 D3D11_INPUT_ELEMENT_DESC polygonLayout[2];
98 unsigned int numElements;
99 D3D11_BUFFER_DESC matrixBufferDesc;
100 D3D11_SAMPLER_DESC samplerDesc;
105 vertexShaderBuffer = 0;
106 pixelShaderBuffer = 0;
108 result = D3DCompileFromFile(vsFilename, NULL, NULL,
"TextureVertexShader",
"vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
109 &vertexShaderBuffer, &errorMessage);
115 output_shader_error_message(errorMessage, hwnd, vsFilename);
120 Logger::Get().
Log(
"Error compiling shader", __FILE__, __LINE__, Logger::LogLevel::Error);
127 result = D3DCompileFromFile(psFilename, NULL, NULL,
"TexturePixelShader",
"ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
128 &pixelShaderBuffer, &errorMessage);
134 output_shader_error_message(errorMessage, hwnd, psFilename);
139 Logger::Get().
Log(
"Error compiling shader", __FILE__, __LINE__, Logger::LogLevel::Error);
146 result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &vertex_shader_);
149 Logger::Get().
Log(
"Error creating vertex shader", __FILE__, __LINE__, Logger::LogLevel::Error);
154 result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &pixel_shader_);
157 Logger::Get().
Log(
"Error creating pixel shader", __FILE__, __LINE__, Logger::LogLevel::Error);
162 polygonLayout[0].SemanticName =
"POSITION";
163 polygonLayout[0].SemanticIndex = 0;
164 polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
165 polygonLayout[0].InputSlot = 0;
166 polygonLayout[0].AlignedByteOffset = 0;
167 polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
168 polygonLayout[0].InstanceDataStepRate = 0;
170 polygonLayout[1].SemanticName =
"TEXCOORD";
171 polygonLayout[1].SemanticIndex = 0;
172 polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
173 polygonLayout[1].InputSlot = 0;
174 polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
175 polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
176 polygonLayout[1].InstanceDataStepRate = 0;
179 numElements =
sizeof(polygonLayout) /
sizeof(polygonLayout[0]);
182 result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(),
183 vertexShaderBuffer->GetBufferSize(), &layout_);
186 Logger::Get().
Log(
"Error creating input layout", __FILE__, __LINE__, Logger::LogLevel::Error);
191 vertexShaderBuffer->Release();
192 vertexShaderBuffer = 0;
194 pixelShaderBuffer->Release();
195 pixelShaderBuffer = 0;
198 matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
199 matrixBufferDesc.ByteWidth =
sizeof(matrix_buffer_type);
200 matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
201 matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
202 matrixBufferDesc.MiscFlags = 0;
203 matrixBufferDesc.StructureByteStride = 0;
206 result = device->CreateBuffer(&matrixBufferDesc, NULL, &matrix_buffer_);
209 Logger::Get().
Log(
"Error creating constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
213 samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
214 samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
215 samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
216 samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
217 samplerDesc.MipLODBias = 0.0f;
218 samplerDesc.MaxAnisotropy = 1;
219 samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
220 samplerDesc.BorderColor[0] = 0;
221 samplerDesc.BorderColor[1] = 0;
222 samplerDesc.BorderColor[2] = 0;
223 samplerDesc.BorderColor[3] = 0;
224 samplerDesc.MinLOD = 0;
225 samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
228 result = device->CreateSamplerState(&samplerDesc, &sample_state_);
231 Logger::Get().
Log(
"Error creating sampler state", __FILE__, __LINE__, Logger::LogLevel::Error);
235 Logger::Get().
Log(
"Shader initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
240void texture_shader_class::shutdown_shader()
242 Logger::Get().
Log(
"Shutting down shader", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
247 sample_state_->Release();
254 matrix_buffer_->Release();
268 pixel_shader_->Release();
275 vertex_shader_->Release();
279 Logger::Get().
Log(
"Shader shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
284void texture_shader_class::output_shader_error_message(ID3D10Blob* errorMessage, HWND hwnd, WCHAR* shaderFilename)
287 unsigned long long bufferSize, i;
292 compileErrors = (
char*)(errorMessage->GetBufferPointer());
295 bufferSize = errorMessage->GetBufferSize();
298 fout.open(
"shader-error.txt");
301 for (i = 0; i < bufferSize; i++)
303 fout << compileErrors[i];
310 errorMessage->Release();
314 MessageBox(hwnd, L
"Error compiling shader. Check shader-error.txt for message.", shaderFilename, MB_OK);
319bool texture_shader_class::set_shader_parameters(ID3D11DeviceContext* deviceContext, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
320 XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture)
323 D3D11_MAPPED_SUBRESOURCE mappedResource;
324 matrix_buffer_type* dataPtr;
325 unsigned int bufferNumber;
329 worldMatrix = XMMatrixTranspose(worldMatrix);
330 viewMatrix = XMMatrixTranspose(viewMatrix);
331 projectionMatrix = XMMatrixTranspose(projectionMatrix);
334 result = deviceContext->Map(matrix_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
337 Logger::Get().
Log(
"Error mapping constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
342 dataPtr = (matrix_buffer_type*)mappedResource.pData;
345 dataPtr->world = worldMatrix;
346 dataPtr->view = viewMatrix;
347 dataPtr->projection = projectionMatrix;
350 deviceContext->Unmap(matrix_buffer_, 0);
356 deviceContext->VSSetConstantBuffers(bufferNumber, 1, &matrix_buffer_);
358 deviceContext->PSSetShaderResources(0, 1, &texture);
363void texture_shader_class::render_shader(ID3D11DeviceContext* deviceContext,
int indexCount)
366 deviceContext->IASetInputLayout(layout_);
369 deviceContext->VSSetShader(vertex_shader_, NULL, 0);
370 deviceContext->PSSetShader(pixel_shader_, NULL, 0);
372 deviceContext->PSSetSamplers(0, 1, &sample_state_);
375 deviceContext->DrawIndexed(indexCount, 0, 0);
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)