1#include "reflection_shader_class.h"
3reflection_shader_class::reflection_shader_class()
10 reflection_buffer_ = 0;
18reflection_shader_class::~reflection_shader_class()
22bool reflection_shader_class::initialize(ID3D11Device* device, HWND hwnd)
24 Logger::Get().
Log(
"Initializing reflection shader", __FILE__, __LINE__, Logger::LogLevel::Initialize);
27 wchar_t vsFilename[128];
28 wchar_t psFilename[128];
32 error = wcscpy_s(vsFilename, 128, L
"src/hlsl/reflection.vs");
35 Logger::Get().
Log(
"Error copying string", __FILE__, __LINE__, Logger::LogLevel::Error);
40 error = wcscpy_s(psFilename, 128, L
"src/hlsl/reflection.ps");
43 Logger::Get().
Log(
"Error copying string", __FILE__, __LINE__, Logger::LogLevel::Error);
48 result = initialize_shader(device, hwnd, vsFilename, psFilename);
51 Logger::Get().
Log(
"Error initializing shader", __FILE__, __LINE__, Logger::LogLevel::Error);
55 Logger::Get().
Log(
"Reflection shader initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
60void reflection_shader_class::shutdown()
68bool reflection_shader_class::render(ID3D11DeviceContext* deviceContext,
int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
69 ID3D11ShaderResourceView* texture, ID3D11ShaderResourceView* reflectionTexture, XMMATRIX reflectionMatrix)
75 result = set_shader_parameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture, reflectionTexture, reflectionMatrix);
78 Logger::Get().
Log(
"Error setting shader parameters", __FILE__, __LINE__, Logger::LogLevel::Error);
83 render_shader(deviceContext, indexCount);
88bool reflection_shader_class::initialize_shader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename)
90 Logger::Get().
Log(
"Initializing reflection shader", __FILE__, __LINE__, Logger::LogLevel::Initialize);
93 ID3D10Blob* errorMessage;
94 ID3D10Blob* vertexShaderBuffer;
95 ID3D10Blob* pixelShaderBuffer;
96 D3D11_INPUT_ELEMENT_DESC polygonLayout[2];
97 unsigned int numElements;
98 D3D11_BUFFER_DESC matrixBufferDesc;
99 D3D11_SAMPLER_DESC samplerDesc;
100 D3D11_BUFFER_DESC reflectionBufferDesc;
105 vertexShaderBuffer = 0;
106 pixelShaderBuffer = 0;
109 result = D3DCompileFromFile(vsFilename, NULL, NULL,
"ReflectionVertexShader",
"vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
110 &vertexShaderBuffer, &errorMessage);
116 output_shader_error_message(errorMessage, hwnd, vsFilename);
121 Logger::Get().
Log(
"Error compiling shader", __FILE__, __LINE__, Logger::LogLevel::Error);
127 result = D3DCompileFromFile(psFilename, NULL, NULL,
"ReflectionPixelShader",
"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_CLAMP;
215 samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
216 samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
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 reflectionBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
236 reflectionBufferDesc.ByteWidth =
sizeof(reflection_buffer_type);
237 reflectionBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
238 reflectionBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
239 reflectionBufferDesc.MiscFlags = 0;
240 reflectionBufferDesc.StructureByteStride = 0;
243 result = device->CreateBuffer(&reflectionBufferDesc, NULL, &reflection_buffer_);
246 Logger::Get().
Log(
"Error creating constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
250 Logger::Get().
Log(
"Reflection shader initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
255void reflection_shader_class::shutdown_shader()
257 Logger::Get().
Log(
"Shutting down reflection shader", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
260 if (reflection_buffer_)
262 reflection_buffer_->Release();
263 reflection_buffer_ = 0;
269 sample_state_->Release();
276 matrix_buffer_->Release();
290 pixel_shader_->Release();
297 vertex_shader_->Release();
301 Logger::Get().
Log(
"Reflection shader shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
307void reflection_shader_class::output_shader_error_message(ID3D10Blob* errorMessage, HWND hwnd, WCHAR* shaderFilename)
310 unsigned long long bufferSize, i;
315 compileErrors = (
char*)(errorMessage->GetBufferPointer());
318 bufferSize = errorMessage->GetBufferSize();
321 fout.open(
"shader-error.txt");
324 for (i = 0; i < bufferSize; i++)
326 fout << compileErrors[i];
333 errorMessage->Release();
337 MessageBox(hwnd, L
"Error compiling shader. Check shader-error.txt for message.", shaderFilename, MB_OK);
342bool reflection_shader_class::set_shader_parameters(ID3D11DeviceContext* deviceContext, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
343 ID3D11ShaderResourceView* texture, ID3D11ShaderResourceView* reflectionTexture, XMMATRIX reflectionMatrix)
346 D3D11_MAPPED_SUBRESOURCE mappedResource;
347 matrix_buffer_type* dataPtr;
348 unsigned int bufferNumber;
349 reflection_buffer_type* dataPtr2;
353 worldMatrix = XMMatrixTranspose(worldMatrix);
354 viewMatrix = XMMatrixTranspose(viewMatrix);
355 projectionMatrix = XMMatrixTranspose(projectionMatrix);
358 reflectionMatrix = XMMatrixTranspose(reflectionMatrix);
361 result = deviceContext->Map(matrix_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
364 Logger::Get().
Log(
"Error mapping constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
369 dataPtr = (matrix_buffer_type*)mappedResource.pData;
372 dataPtr->world = worldMatrix;
373 dataPtr->view = viewMatrix;
374 dataPtr->projection = projectionMatrix;
377 deviceContext->Unmap(matrix_buffer_, 0);
383 deviceContext->VSSetConstantBuffers(bufferNumber, 1, &matrix_buffer_);
386 result = deviceContext->Map(reflection_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
389 Logger::Get().
Log(
"Error mapping constant buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
394 dataPtr2 = (reflection_buffer_type*)mappedResource.pData;
397 dataPtr2->reflection_matrix = reflectionMatrix;
400 deviceContext->Unmap(reflection_buffer_, 0);
406 deviceContext->VSSetConstantBuffers(bufferNumber, 1, &reflection_buffer_);
409 deviceContext->PSSetShaderResources(0, 1, &texture);
412 deviceContext->PSSetShaderResources(1, 1, &reflectionTexture);
418void reflection_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)