1#include "transparent_shader_class.h"
4transparent_shader_class::transparent_shader_class()
11 transparent_buffer_ = 0;
20transparent_shader_class::~transparent_shader_class()
25bool transparent_shader_class::initialize(ID3D11Device* device, HWND hwnd)
27 Logger::Get().
Log(
"Initializing transparent_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/transparent.vs");
38 Logger::Get().
Log(
"Failed to copy vertex shader filename", __FILE__, __LINE__, Logger::LogLevel::Error);
43 error = wcscpy_s(psFilename, 128, L
"src/hlsl/transparent.ps");
46 Logger::Get().
Log(
"Failed to copy pixel shader filename", __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(
"transparent_shader_class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
64void transparent_shader_class::shutdown()
72bool transparent_shader_class::render(ID3D11DeviceContext* deviceContext,
int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
73 XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture,
float blend)
79 result = set_shader_parameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture, blend);
82 Logger::Get().
Log(
"Failed to set shader parameters", __FILE__, __LINE__, Logger::LogLevel::Error);
87 render_shader(deviceContext, indexCount);
93bool transparent_shader_class::initialize_shader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename)
95 Logger::Get().
Log(
"Initializing transparent 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 transparentBufferDesc;
110 vertexShaderBuffer = 0;
111 pixelShaderBuffer = 0;
114 result = D3DCompileFromFile(vsFilename, NULL, NULL,
"TransparentVertexShader",
"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 vertex shader", __FILE__, __LINE__, Logger::LogLevel::Error);
133 result = D3DCompileFromFile(psFilename, NULL, NULL,
"TransparentPixelShader",
"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 pixel 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 transparentBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
244 transparentBufferDesc.ByteWidth =
sizeof(transparent_buffer_type);
245 transparentBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
246 transparentBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
247 transparentBufferDesc.MiscFlags = 0;
248 transparentBufferDesc.StructureByteStride = 0;
251 result = device->CreateBuffer(&transparentBufferDesc, NULL, &transparent_buffer_);
254 Logger::Get().
Log(
"Failed to create transparent buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
258 Logger::Get().
Log(
"Transparent shader initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
264void transparent_shader_class::shutdown_shader()
266 Logger::Get().
Log(
"Shutting down transparent shader", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
269 if (transparent_buffer_)
271 transparent_buffer_->Release();
272 transparent_buffer_ = 0;
278 sample_state_->Release();
285 matrix_buffer_->Release();
299 pixel_shader_->Release();
306 vertex_shader_->Release();
310 Logger::Get().
Log(
"Transparent shader shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
316void transparent_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);
351bool transparent_shader_class::set_shader_parameters(ID3D11DeviceContext* deviceContext, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
352 XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture,
float blend)
355 D3D11_MAPPED_SUBRESOURCE mappedResource;
356 matrix_buffer_type* dataPtr;
357 unsigned int bufferNumber;
358 transparent_buffer_type* dataPtr2;
362 worldMatrix = XMMatrixTranspose(worldMatrix);
363 viewMatrix = XMMatrixTranspose(viewMatrix);
364 projectionMatrix = XMMatrixTranspose(projectionMatrix);
367 result = deviceContext->Map(matrix_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
370 Logger::Get().
Log(
"Failed to map matrix buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
375 dataPtr = (matrix_buffer_type*)mappedResource.pData;
378 dataPtr->world = worldMatrix;
379 dataPtr->view = viewMatrix;
380 dataPtr->projection = projectionMatrix;
383 deviceContext->Unmap(matrix_buffer_, 0);
389 deviceContext->VSSetConstantBuffers(bufferNumber, 1, &matrix_buffer_);
392 deviceContext->PSSetShaderResources(0, 1, &texture);
395 result = deviceContext->Map(transparent_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
398 Logger::Get().
Log(
"Failed to map transparent buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
403 dataPtr2 = (transparent_buffer_type*)mappedResource.pData;
406 dataPtr2->blend_amount = blend;
409 deviceContext->Unmap(transparent_buffer_, 0);
415 deviceContext->PSSetConstantBuffers(bufferNumber, 1, &transparent_buffer_);
421void transparent_shader_class::render_shader(ID3D11DeviceContext* deviceContext,
int indexCount)
424 deviceContext->IASetInputLayout(layout_);
427 deviceContext->VSSetShader(vertex_shader_, NULL, 0);
428 deviceContext->PSSetShader(pixel_shader_, NULL, 0);
431 deviceContext->PSSetSamplers(0, 1, &sample_state_);
434 deviceContext->DrawIndexed(indexCount, 0, 0);
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)