Incremental Engine  1.0.6
A 2D Game Engine to create Idle Games
IncrementalEngine::TextureShader Class Reference

#include <TextureShader.h>

Classes

struct  TextureBufferType
 

Public Member Functions

 TextureShader ()
 
virtual ~TextureShader ()
 
HRESULT Init (ID3D11Device *device, HWND hwnd)
 
HRESULT Draw (ID3D11DeviceContext *deviceContext, int indexCount, ID3D11ShaderResourceView *texture)
 

Private Member Functions

HRESULT InitializeShader (ID3D11Device *device, HWND hwnd, WCHAR *vsFilename, WCHAR *psFilename)
 
HRESULT CompileShader (HWND hwnd, ID3D10Blob *&buffer, WCHAR *filename, LPCSTR functionName, LPCSTR profile)
 
void OutputShaderErrorMessage (ID3D10Blob *errorMessage, HWND hwnd, WCHAR *shaderFilename)
 
HRESULT SetShaderParameters (ID3D11DeviceContext *deviceContext, ID3D11ShaderResourceView *texture)
 
void RenderShader (ID3D11DeviceContext *deviceContext, int indexCount)
 

Private Attributes

ID3D11VertexShader * _vertexShader
 
ID3D11PixelShader * _pixelShader
 
ID3D11Buffer * _textureBuffer
 
ID3D11InputLayout * _layout
 
ID3D11SamplerState * _sampleState
 

Detailed Description

Definition at line 11 of file TextureShader.h.

Constructor & Destructor Documentation

◆ TextureShader()

IncrementalEngine::TextureShader::TextureShader ( )

Definition at line 6 of file TextureShader.cpp.

6  :
7  _vertexShader(NULL),
8  _pixelShader(NULL),
9  _textureBuffer(NULL),
10  _layout(NULL),
11  _sampleState(NULL)
12  {
13  }

◆ ~TextureShader()

IncrementalEngine::TextureShader::~TextureShader ( )
virtual

Definition at line 15 of file TextureShader.cpp.

16  {
17  CHECKED_RELEASE(_sampleState);
18  CHECKED_RELEASE(_layout);
19  CHECKED_RELEASE(_textureBuffer);
20  CHECKED_RELEASE(_pixelShader);
21  CHECKED_RELEASE(_vertexShader);
22  }

Member Function Documentation

◆ CompileShader()

HRESULT IncrementalEngine::TextureShader::CompileShader ( HWND  hwnd,
ID3D10Blob *&  buffer,
WCHAR *  filename,
LPCSTR  functionName,
LPCSTR  profile 
)
private

Definition at line 211 of file TextureShader.cpp.

218  {
219  ID3D10Blob* errorMessage = NULL;
220 
221  HRESULT result = D3DX11CompileFromFile(
222  filename,
223  NULL,
224  NULL,
225  functionName,
226  profile,
227  D3D10_SHADER_ENABLE_STRICTNESS,
228  0,
229  NULL,
230  &buffer,
231  &errorMessage,
232  NULL
233  );
234 
235  if (FAILED(result))
236  {
237  if (errorMessage)
238  {
239  OutputShaderErrorMessage(errorMessage, hwnd, filename);
240  }
241  else
242  {
243  MessageBox(hwnd, filename, L"Missing Shader File", MB_OK);
244  }
245 
246  return CO_E_ERRORINAPP;
247  }
248 
249  return S_OK;
250  }

◆ Draw()

HRESULT IncrementalEngine::TextureShader::Draw ( ID3D11DeviceContext *  deviceContext,
int  indexCount,
ID3D11ShaderResourceView *  texture 
)

Definition at line 43 of file TextureShader.cpp.

48  {
49  HRESULT result;
50 
51  result = SetShaderParameters(
52  deviceContext,
53  texture
54  );
55 
56  if (FAILED(result))
57  {
58  return CO_E_ERRORINAPP;
59  }
60 
61  RenderShader(deviceContext, indexCount);
62 
63  return S_OK;
64  }

◆ Init()

HRESULT IncrementalEngine::TextureShader::Init ( ID3D11Device *  device,
HWND  hwnd 
)

Definition at line 24 of file TextureShader.cpp.

25  {
26  HRESULT result;
27 
28  result = InitializeShader(
29  device,
30  hwnd,
31  (WCHAR*)VERTEX_SHADER_PATH,
32  (WCHAR*)PIXEL_SHADER_PATH
33  );
34 
35  if (FAILED(result))
36  {
37  return CO_E_ERRORINAPP;
38  }
39 
40  return S_OK;
41  }

◆ InitializeShader()

HRESULT IncrementalEngine::TextureShader::InitializeShader ( ID3D11Device *  device,
HWND  hwnd,
WCHAR *  vsFilename,
WCHAR *  psFilename 
)
private

Definition at line 66 of file TextureShader.cpp.

72  {
73  HRESULT result;
74  ID3D10Blob* vertexShaderBuffer = NULL;
75  ID3D10Blob* pixelShaderBuffer = NULL;
76 
77  D3D11_INPUT_ELEMENT_DESC polygonLayout[2];
78  D3D11_BUFFER_DESC textureBufferDesc;
79  unsigned int numElements;
80  D3D11_SAMPLER_DESC samplerDesc;
81 
82  result = CompileShader(
83  hwnd,
84  vertexShaderBuffer,
85  vsFilename,
86  "TextureVertexShader",
87  "vs_5_0"
88  );
89 
90  if (FAILED(result))
91  {
92  return CO_E_ERRORINAPP;
93  }
94 
95  result = CompileShader(
96  hwnd,
97  pixelShaderBuffer,
98  psFilename,
99  "TexturePixelShader",
100  "ps_5_0"
101  );
102 
103  if (FAILED(result))
104  {
105  return CO_E_ERRORINAPP;
106  }
107 
108  result = device->CreateVertexShader(
109  vertexShaderBuffer->GetBufferPointer(),
110  vertexShaderBuffer->GetBufferSize(),
111  NULL,
113  );
114 
115  if (FAILED(result))
116  {
117  return CO_E_ERRORINAPP;
118  }
119 
120  result = device->CreatePixelShader(
121  pixelShaderBuffer->GetBufferPointer(),
122  pixelShaderBuffer->GetBufferSize(),
123  NULL,
124  &_pixelShader
125  );
126 
127  if (FAILED(result))
128  {
129  return CO_E_ERRORINAPP;
130  }
131 
132  polygonLayout[0].SemanticName = "POSITION";
133  polygonLayout[0].SemanticIndex = 0;
134  polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
135  polygonLayout[0].InputSlot = 0;
136  polygonLayout[0].AlignedByteOffset = 0;
137  polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
138  polygonLayout[0].InstanceDataStepRate = 0;
139 
140  polygonLayout[1].SemanticName = "TEXCOORD";
141  polygonLayout[1].SemanticIndex = 0;
142  polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
143  polygonLayout[1].InputSlot = 0;
144  polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
145  polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
146  polygonLayout[1].InstanceDataStepRate = 0;
147 
148  numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]);
149 
150  result = device->CreateInputLayout(
151  polygonLayout,
152  numElements,
153  vertexShaderBuffer->GetBufferPointer(),
154  vertexShaderBuffer->GetBufferSize(),
155  &_layout
156  );
157 
158  if (FAILED(result))
159  {
160  return CO_E_ERRORINAPP;
161  }
162 
163  CHECKED_RELEASE(vertexShaderBuffer);
164  CHECKED_RELEASE(pixelShaderBuffer);
165 
166 
167  textureBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
168  textureBufferDesc.ByteWidth = sizeof(TextureBufferType);
169  textureBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
170  textureBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
171  textureBufferDesc.MiscFlags = 0;
172  textureBufferDesc.StructureByteStride = 0;
173 
174  result = device->CreateBuffer(
175  &textureBufferDesc,
176  NULL,
178  );
179 
180  if (FAILED(result))
181  {
182  return CO_E_ERRORINAPP;
183  }
184  samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
185  samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
186  samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
187  samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
188  samplerDesc.MipLODBias = 0.0f;
189  samplerDesc.MaxAnisotropy = 1;
190  samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
191  samplerDesc.BorderColor[0] = 0;
192  samplerDesc.BorderColor[1] = 0;
193  samplerDesc.BorderColor[2] = 0;
194  samplerDesc.BorderColor[3] = 0;
195  samplerDesc.MinLOD = 0;
196  samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
197 
198  result = device->CreateSamplerState(
199  &samplerDesc,
200  &_sampleState
201  );
202 
203  if (FAILED(result))
204  {
205  return CO_E_ERRORINAPP;
206  }
207 
208  return S_OK;
209  }

◆ OutputShaderErrorMessage()

void IncrementalEngine::TextureShader::OutputShaderErrorMessage ( ID3D10Blob *  errorMessage,
HWND  hwnd,
WCHAR *  shaderFilename 
)
private

Definition at line 252 of file TextureShader.cpp.

257  {
258  std::ofstream fout;
259 
260  char* compileErrors = (char*)(errorMessage->GetBufferPointer());
261  unsigned long bufferSize = errorMessage->GetBufferSize();
262 
263  fout.open("shader-error.txt");
264 
265  for (int i = 0; i < bufferSize; i++)
266  {
267  fout << compileErrors[i];
268  }
269 
270  fout.close();
271 
272  CHECKED_RELEASE(errorMessage);
273  MessageBox(hwnd, L"Error compiling shader. Check shader-error.txt for message.", shaderFilename, MB_OK);
274  }

◆ RenderShader()

void IncrementalEngine::TextureShader::RenderShader ( ID3D11DeviceContext *  deviceContext,
int  indexCount 
)
private

Definition at line 307 of file TextureShader.cpp.

308  {
309  deviceContext->IASetInputLayout(_layout);
310 
311  deviceContext->VSSetShader(_vertexShader, NULL, 0);
312  deviceContext->PSSetShader(_pixelShader, NULL, 0);
313 
314  deviceContext->PSSetSamplers(0, 1, &_sampleState);
315 
316  deviceContext->DrawIndexed(indexCount, 0, 0);
317  }

◆ SetShaderParameters()

HRESULT IncrementalEngine::TextureShader::SetShaderParameters ( ID3D11DeviceContext *  deviceContext,
ID3D11ShaderResourceView *  texture 
)
private

Definition at line 276 of file TextureShader.cpp.

280  {
281  HRESULT result;
282  D3D11_MAPPED_SUBRESOURCE mappedResource;
283  TextureBufferType* dataPtr;
284 
285  result = deviceContext->Map(
287  0,
288  D3D11_MAP_WRITE_DISCARD,
289  0,
290  &mappedResource
291  );
292 
293  if (FAILED(result))
294  {
295  return CO_E_ERRORINAPP;
296  }
297 
298  dataPtr = (TextureBufferType*)mappedResource.pData;
299  dataPtr->cutoff = D3DXVECTOR4(.0f, .0f, .0f, ALPHA_CUTOFF);
300 
301  deviceContext->Unmap(_textureBuffer, 1);
302 
303  deviceContext->PSSetConstantBuffers(1, 1, &_textureBuffer);
304  deviceContext->PSSetShaderResources(0, 1, &texture);
305  }

Member Data Documentation

◆ _layout

ID3D11InputLayout* IncrementalEngine::TextureShader::_layout
private

Definition at line 38 of file TextureShader.h.

◆ _pixelShader

ID3D11PixelShader* IncrementalEngine::TextureShader::_pixelShader
private

Definition at line 36 of file TextureShader.h.

◆ _sampleState

ID3D11SamplerState* IncrementalEngine::TextureShader::_sampleState
private

Definition at line 39 of file TextureShader.h.

◆ _textureBuffer

ID3D11Buffer* IncrementalEngine::TextureShader::_textureBuffer
private

Definition at line 37 of file TextureShader.h.

◆ _vertexShader

ID3D11VertexShader* IncrementalEngine::TextureShader::_vertexShader
private

Definition at line 35 of file TextureShader.h.

IncrementalEngine::TextureShader::_layout
ID3D11InputLayout * _layout
Definition: TextureShader.h:38
IncrementalEngine::TextureShader::_sampleState
ID3D11SamplerState * _sampleState
Definition: TextureShader.h:39
IncrementalEngine::TextureShader::OutputShaderErrorMessage
void OutputShaderErrorMessage(ID3D10Blob *errorMessage, HWND hwnd, WCHAR *shaderFilename)
Definition: TextureShader.cpp:252
IncrementalEngine::TextureShader::_pixelShader
ID3D11PixelShader * _pixelShader
Definition: TextureShader.h:36
IncrementalEngine::TextureShader::CompileShader
HRESULT CompileShader(HWND hwnd, ID3D10Blob *&buffer, WCHAR *filename, LPCSTR functionName, LPCSTR profile)
Definition: TextureShader.cpp:211
IncrementalEngine::TextureShader::InitializeShader
HRESULT InitializeShader(ID3D11Device *device, HWND hwnd, WCHAR *vsFilename, WCHAR *psFilename)
Definition: TextureShader.cpp:66
IncrementalEngine::TextureShader::RenderShader
void RenderShader(ID3D11DeviceContext *deviceContext, int indexCount)
Definition: TextureShader.cpp:307
IncrementalEngine::TextureShader::SetShaderParameters
HRESULT SetShaderParameters(ID3D11DeviceContext *deviceContext, ID3D11ShaderResourceView *texture)
Definition: TextureShader.cpp:276
IncrementalEngine::TextureShader::_textureBuffer
ID3D11Buffer * _textureBuffer
Definition: TextureShader.h:37
IncrementalEngine::TextureShader::_vertexShader
ID3D11VertexShader * _vertexShader
Definition: TextureShader.h:35