diff --git a/enginecustom/applicationclass.cpp b/enginecustom/applicationclass.cpp
index b608c7d..aafc99f 100644
--- a/enginecustom/applicationclass.cpp
+++ b/enginecustom/applicationclass.cpp
@@ -7,6 +7,7 @@ ApplicationClass::ApplicationClass()
m_MultiTextureShader = 0;
m_Model = 0;
m_LightShader = 0;
+ m_LightMapShader = 0;
m_Light = 0;
m_TextureShader = 0;
m_Bitmap = 0;
@@ -179,7 +180,7 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
// Set the file name of the textures.
strcpy_s(textureFilename1, "stone01.tga");
- strcpy_s(textureFilename2, "moss01.tga");
+ strcpy_s(textureFilename2, "light01.tga");
// Create and initialize the model object.
m_Model = new ModelClass;
@@ -221,6 +222,16 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
m_Lights[3].SetDiffuseColor(1.0f, 1.0f, 1.0f, 1.0f); // White
m_Lights[3].SetPosition(3.0f, 1.0f, -3.0f);
+ // Create and initialize the light map shader object.
+ m_LightMapShader = new LightMapShaderClass;
+
+ result = m_LightMapShader->Initialize(m_Direct3D->GetDevice(), hwnd);
+ if (!result)
+ {
+ MessageBox(hwnd, L"Could not initialize the light map shader object.", L"Error", MB_OK);
+ return false;
+ }
+
// Create and initialize the fps object.
m_Fps = new FpsClass();
@@ -261,7 +272,6 @@ void ApplicationClass::Shutdown()
m_Fps = 0;
}
-
// Release the text string objects.
if (m_TextString3)
{
@@ -338,6 +348,14 @@ void ApplicationClass::Shutdown()
m_LightShader = 0;
}
+ // Release the light map shader object.
+ if (m_LightMapShader)
+ {
+ m_LightMapShader->Shutdown();
+ delete m_LightMapShader;
+ m_LightMapShader = 0;
+ }
+
// Release the model object.
if (m_Model)
{
@@ -543,7 +561,11 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z)
lightPosition[i] = m_Lights[i].GetPosition();
}
+ ///////////////////
+ // DISCLAIMER //
+ ///////////////////
+ // Les shaders suivants ne s'appliquent a l'objet uniquement s'il sont les derniers appliques
scaleMatrix = XMMatrixScaling(0.5f, 0.5f, 0.5f); // Build the scaling matrix.
rotateMatrix = XMMatrixRotationY(rotation); // Build the rotation matrix.
@@ -556,6 +578,14 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z)
// Render the model using the multitexture shader.
m_Model->Render(m_Direct3D->GetDeviceContext());
+ // Render the model using the light shader.
+ result = m_LightShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0),
+ diffuseColor, lightPosition);
+ if (!result)
+ {
+ return false;
+ }
+
scaleMatrix = XMMatrixScaling(2.0f, 2.0f, 2.0f); // Build the scaling matrix.
rotateMatrix = XMMatrixRotationY(-rotation); // Build the rotation matrix.
translateMatrix = XMMatrixTranslation(-x, -y, -z); // Build the translation matrix.
@@ -567,14 +597,25 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z)
// Put the model vertex and index buffers on the graphics pipeline to prepare them for drawing.
m_Model->Render(m_Direct3D->GetDeviceContext());
- // Render the model using the light shader.
- result = m_LightShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0),
- diffuseColor, lightPosition);
+ result = m_LightMapShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
+ m_Model->GetTexture(0), m_Model->GetTexture(1));
if (!result)
{
return false;
}
+
+ scaleMatrix = XMMatrixScaling(0.75f, 0.2f, 0.5f); // Build the scaling matrix.
+ rotateMatrix = XMMatrixRotationY(rotation); // Build the rotation matrix.
+ translateMatrix = XMMatrixTranslation(x + 1, y - 1, z + 2); // Build the translation matrix.
+
+ // Multiply the scale, rotation, and translation matrices together to create the final world transformation matrix.
+ srMatrix = XMMatrixMultiply(scaleMatrix, rotateMatrix);
+ worldMatrix = XMMatrixMultiply(srMatrix, translateMatrix);
+
+ // Render the model using the multitexture shader.
+ m_Model->Render(m_Direct3D->GetDeviceContext());
+
// Render the model using the multitexture shader.
result = m_MultiTextureShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
m_Model->GetTexture(0), m_Model->GetTexture(1));
diff --git a/enginecustom/applicationclass.h b/enginecustom/applicationclass.h
index 2ee3d4c..bc59f20 100644
--- a/enginecustom/applicationclass.h
+++ b/enginecustom/applicationclass.h
@@ -10,6 +10,7 @@
#include "modelclass.h"
#include "lightshaderclass.h"
#include "lightclass.h"
+#include "lightmapshaderclass.h"
#include "multitextureshaderclass.h"
#include "bitmapclass.h"
#include "textureshaderclass.h"
@@ -51,6 +52,7 @@ private:
CameraClass* m_Camera;
LightShaderClass* m_LightShader;
LightClass* m_Light;
+ LightMapShaderClass* m_LightMapShader;
MultiTextureShaderClass* m_MultiTextureShader;
ModelClass* m_Model;
TextureShaderClass* m_TextureShader;
diff --git a/enginecustom/enginecustom.vcxproj b/enginecustom/enginecustom.vcxproj
index a072ed4..6b230cb 100644
--- a/enginecustom/enginecustom.vcxproj
+++ b/enginecustom/enginecustom.vcxproj
@@ -30,6 +30,7 @@
+
@@ -52,6 +53,7 @@
+
@@ -67,6 +69,8 @@
+
+
@@ -93,6 +97,7 @@
+
@@ -103,6 +108,7 @@
+
17.0
diff --git a/enginecustom/enginecustom.vcxproj.filters b/enginecustom/enginecustom.vcxproj.filters
index f6d3cc8..1cb32f9 100644
--- a/enginecustom/enginecustom.vcxproj.filters
+++ b/enginecustom/enginecustom.vcxproj.filters
@@ -87,6 +87,9 @@
Fichiers sources
+
+ Fichiers sources
+
@@ -146,6 +149,9 @@
Fichiers d%27en-tĂȘte
+
+ Fichiers d%27en-tĂȘte
+
@@ -163,6 +169,9 @@
assets
+
+ assets
+
@@ -196,6 +205,10 @@
shader
+
+ shader
+
+
@@ -210,5 +223,8 @@
assets
+
+ assets
+
\ No newline at end of file
diff --git a/enginecustom/light01.tga b/enginecustom/light01.tga
new file mode 100644
index 0000000..7aa0f52
Binary files /dev/null and b/enginecustom/light01.tga differ
diff --git a/enginecustom/lightmap.ps b/enginecustom/lightmap.ps
new file mode 100644
index 0000000..3984d43
--- /dev/null
+++ b/enginecustom/lightmap.ps
@@ -0,0 +1,38 @@
+/////////////
+// GLOBALS //
+/////////////
+Texture2D shaderTexture1 : register(t0);
+Texture2D shaderTexture2 : register(t1);
+SamplerState SampleType : register(s0);
+
+
+//////////////
+// TYPEDEFS //
+//////////////
+struct PixelInputType
+{
+ float4 position : SV_POSITION;
+ float2 tex : TEXCOORD0;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// Pixel Shader
+////////////////////////////////////////////////////////////////////////////////
+float4 LightMapPixelShader(PixelInputType input) : SV_TARGET
+{
+ float4 color;
+ float4 lightColor;
+ float4 finalColor;
+
+
+ // Get the pixel color from the color texture.
+ color = shaderTexture1.Sample(SampleType, input.tex);
+
+ // Get the pixel color from the light map.
+ lightColor = shaderTexture2.Sample(SampleType, input.tex);
+
+ // Blend the two pixels together.
+ finalColor = color * lightColor;
+
+ return finalColor;
+}
diff --git a/enginecustom/lightmap.vs b/enginecustom/lightmap.vs
new file mode 100644
index 0000000..4a6190b
--- /dev/null
+++ b/enginecustom/lightmap.vs
@@ -0,0 +1,49 @@
+/////////////
+// GLOBALS //
+/////////////
+cbuffer MatrixBuffer
+{
+ matrix worldMatrix;
+ matrix viewMatrix;
+ matrix projectionMatrix;
+};
+
+
+//////////////
+// TYPEDEFS //
+//////////////
+struct VertexInputType
+{
+ float4 position : POSITION;
+ float2 tex : TEXCOORD0;
+ float3 normal : NORMAL;
+};
+
+struct PixelInputType
+{
+ float4 position : SV_POSITION;
+ float2 tex : TEXCOORD0;
+};
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Vertex Shader
+////////////////////////////////////////////////////////////////////////////////
+PixelInputType LightMapVertexShader(VertexInputType input)
+{
+ PixelInputType output;
+
+
+ // Change the position vector to be 4 units for proper matrix calculations.
+ input.position.w = 1.0f;
+
+ // Calculate the position of the vertex against the world, view, and projection matrices.
+ output.position = mul(input.position, worldMatrix);
+ output.position = mul(output.position, viewMatrix);
+ output.position = mul(output.position, projectionMatrix);
+
+ // Store the texture coordinates for the pixel shader.
+ output.tex = input.tex;
+
+ return output;
+}
\ No newline at end of file
diff --git a/enginecustom/lightmapshaderclass.cpp b/enginecustom/lightmapshaderclass.cpp
new file mode 100644
index 0000000..82d6ed8
--- /dev/null
+++ b/enginecustom/lightmapshaderclass.cpp
@@ -0,0 +1,377 @@
+#include "lightmapshaderclass.h"
+
+
+LightMapShaderClass::LightMapShaderClass()
+{
+ m_vertexShader = 0;
+ m_pixelShader = 0;
+ m_layout = 0;
+ m_matrixBuffer = 0;
+ m_sampleState = 0;
+}
+
+
+LightMapShaderClass::LightMapShaderClass(const LightMapShaderClass& other)
+{
+}
+
+
+LightMapShaderClass::~LightMapShaderClass()
+{
+}
+
+
+bool LightMapShaderClass::Initialize(ID3D11Device* device, HWND hwnd)
+{
+ bool result;
+ wchar_t vsFilename[128];
+ wchar_t psFilename[128];
+ int error;
+
+ // Set the filename of the vertex shader.
+ error = wcscpy_s(vsFilename, 128, L"lightmap.vs");
+ if (error != 0)
+ {
+ return false;
+ }
+
+ // Set the filename of the pixel shader.
+ error = wcscpy_s(psFilename, 128, L"lightmap.ps");
+ if (error != 0)
+ {
+ return false;
+ }
+
+ // Initialize the vertex and pixel shaders.
+ result = InitializeShader(device, hwnd, vsFilename, psFilename);
+ if (!result)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+
+void LightMapShaderClass::Shutdown()
+{
+ // Shutdown the vertex and pixel shaders as well as the related objects.
+ ShutdownShader();
+
+ return;
+}
+
+
+bool LightMapShaderClass::Render(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
+ XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture1, ID3D11ShaderResourceView* texture2)
+{
+ bool result;
+
+
+ // Set the shader parameters that it will use for rendering.
+ result = SetShaderParameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture1, texture2);
+ if (!result)
+ {
+ return false;
+ }
+
+ // Now render the prepared buffers with the shader.
+ RenderShader(deviceContext, indexCount);
+
+ return true;
+}
+
+
+bool LightMapShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename)
+{
+ HRESULT result;
+ ID3D10Blob* errorMessage;
+ ID3D10Blob* vertexShaderBuffer;
+ ID3D10Blob* pixelShaderBuffer;
+ D3D11_INPUT_ELEMENT_DESC polygonLayout[3];
+ unsigned int numElements;
+ D3D11_BUFFER_DESC matrixBufferDesc;
+ D3D11_SAMPLER_DESC samplerDesc;
+
+
+ // Initialize the pointers this function will use to null.
+ errorMessage = 0;
+ vertexShaderBuffer = 0;
+ pixelShaderBuffer = 0;
+
+ // Compile the vertex shader code.
+ result = D3DCompileFromFile(vsFilename, NULL, NULL, "LightMapVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
+ &vertexShaderBuffer, &errorMessage);
+ if (FAILED(result))
+ {
+ // If the shader failed to compile it should have writen something to the error message.
+ if (errorMessage)
+ {
+ OutputShaderErrorMessage(errorMessage, hwnd, vsFilename);
+ }
+ // If there was nothing in the error message then it simply could not find the shader file itself.
+ else
+ {
+ MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK);
+ }
+
+ return false;
+ }
+
+ // Compile the pixel shader code.
+ result = D3DCompileFromFile(psFilename, NULL, NULL, "LightMapPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
+ &pixelShaderBuffer, &errorMessage);
+ if (FAILED(result))
+ {
+ // If the shader failed to compile it should have writen something to the error message.
+ if (errorMessage)
+ {
+ OutputShaderErrorMessage(errorMessage, hwnd, psFilename);
+ }
+ // If there was nothing in the error message then it simply could not find the file itself.
+ else
+ {
+ MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK);
+ }
+
+ return false;
+ }
+
+ // Create the vertex shader from the buffer.
+ result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader);
+ if (FAILED(result))
+ {
+ return false;
+ }
+
+ // Create the pixel shader from the buffer.
+ result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader);
+ if (FAILED(result))
+ {
+ return false;
+ }
+
+ // Create the vertex input layout description.
+ polygonLayout[0].SemanticName = "POSITION";
+ polygonLayout[0].SemanticIndex = 0;
+ polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
+ polygonLayout[0].InputSlot = 0;
+ polygonLayout[0].AlignedByteOffset = 0;
+ polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ polygonLayout[0].InstanceDataStepRate = 0;
+
+ polygonLayout[1].SemanticName = "TEXCOORD";
+ polygonLayout[1].SemanticIndex = 0;
+ polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
+ polygonLayout[1].InputSlot = 0;
+ polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
+ polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ polygonLayout[1].InstanceDataStepRate = 0;
+
+ polygonLayout[2].SemanticName = "NORMAL";
+ polygonLayout[2].SemanticIndex = 0;
+ polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT;
+ polygonLayout[2].InputSlot = 0;
+ polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
+ polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+ polygonLayout[2].InstanceDataStepRate = 0;
+
+ // Get a count of the elements in the layout.
+ numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]);
+
+ // Create the vertex input layout.
+ result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(),
+ vertexShaderBuffer->GetBufferSize(), &m_layout);
+ if (FAILED(result))
+ {
+ return false;
+ }
+
+ // Release the vertex shader buffer and pixel shader buffer since they are no longer needed.
+ vertexShaderBuffer->Release();
+ vertexShaderBuffer = 0;
+
+ pixelShaderBuffer->Release();
+ pixelShaderBuffer = 0;
+
+ // Setup the description of the dynamic matrix constant buffer that is in the vertex shader.
+ matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
+ matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType);
+ matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+ matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ matrixBufferDesc.MiscFlags = 0;
+ matrixBufferDesc.StructureByteStride = 0;
+
+ // Create the constant buffer pointer so we can access the vertex shader constant buffer from within this class.
+ result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer);
+ if (FAILED(result))
+ {
+ return false;
+ }
+
+ // Create a texture sampler state description.
+ samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
+ samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
+ samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
+ samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
+ samplerDesc.MipLODBias = 0.0f;
+ samplerDesc.MaxAnisotropy = 1;
+ samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
+ samplerDesc.BorderColor[0] = 0;
+ samplerDesc.BorderColor[1] = 0;
+ samplerDesc.BorderColor[2] = 0;
+ samplerDesc.BorderColor[3] = 0;
+ samplerDesc.MinLOD = 0;
+ samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
+
+ // Create the texture sampler state.
+ result = device->CreateSamplerState(&samplerDesc, &m_sampleState);
+ if (FAILED(result))
+ {
+ return false;
+ }
+
+ return true;
+}
+
+
+void LightMapShaderClass::ShutdownShader()
+{
+ // Release the sampler state.
+ if (m_sampleState)
+ {
+ m_sampleState->Release();
+ m_sampleState = 0;
+ }
+
+ // Release the matrix constant buffer.
+ if (m_matrixBuffer)
+ {
+ m_matrixBuffer->Release();
+ m_matrixBuffer = 0;
+ }
+
+ // Release the layout.
+ if (m_layout)
+ {
+ m_layout->Release();
+ m_layout = 0;
+ }
+
+ // Release the pixel shader.
+ if (m_pixelShader)
+ {
+ m_pixelShader->Release();
+ m_pixelShader = 0;
+ }
+
+ // Release the vertex shader.
+ if (m_vertexShader)
+ {
+ m_vertexShader->Release();
+ m_vertexShader = 0;
+ }
+
+ return;
+}
+
+
+void LightMapShaderClass::OutputShaderErrorMessage(ID3D10Blob* errorMessage, HWND hwnd, WCHAR* shaderFilename)
+{
+ char* compileErrors;
+ unsigned long long bufferSize, i;
+ ofstream fout;
+
+
+ // Get a pointer to the error message text buffer.
+ compileErrors = (char*)(errorMessage->GetBufferPointer());
+
+ // Get the length of the message.
+ bufferSize = errorMessage->GetBufferSize();
+
+ // Open a file to write the error message to.
+ fout.open("shader-error.txt");
+
+ // Write out the error message.
+ for (i = 0; i < bufferSize; i++)
+ {
+ fout << compileErrors[i];
+ }
+
+ // Close the file.
+ fout.close();
+
+ // Release the error message.
+ errorMessage->Release();
+ errorMessage = 0;
+
+ // Pop a message up on the screen to notify the user to check the text file for compile errors.
+ MessageBox(hwnd, L"Error compiling shader. Check shader-error.txt for message.", shaderFilename, MB_OK);
+
+ return;
+}
+
+
+bool LightMapShaderClass::SetShaderParameters(ID3D11DeviceContext* deviceContext, XMMATRIX worldMatrix, XMMATRIX viewMatrix,
+ XMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture1, ID3D11ShaderResourceView* texture2)
+{
+ HRESULT result;
+ D3D11_MAPPED_SUBRESOURCE mappedResource;
+ MatrixBufferType* dataPtr;
+ unsigned int bufferNumber;
+
+
+ // Transpose the matrices to prepare them for the shader.
+ worldMatrix = XMMatrixTranspose(worldMatrix);
+ viewMatrix = XMMatrixTranspose(viewMatrix);
+ projectionMatrix = XMMatrixTranspose(projectionMatrix);
+
+ // Lock the constant buffer so it can be written to.
+ result = deviceContext->Map(m_matrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ if (FAILED(result))
+ {
+ return false;
+ }
+
+ // Get a pointer to the data in the constant buffer.
+ dataPtr = (MatrixBufferType*)mappedResource.pData;
+
+ // Copy the matrices into the constant buffer.
+ dataPtr->world = worldMatrix;
+ dataPtr->view = viewMatrix;
+ dataPtr->projection = projectionMatrix;
+
+ // Unlock the constant buffer.
+ deviceContext->Unmap(m_matrixBuffer, 0);
+
+ // Set the position of the constant buffer in the vertex shader.
+ bufferNumber = 0;
+
+ // Finally set the constant buffer in the vertex shader with the updated values.
+ deviceContext->VSSetConstantBuffers(bufferNumber, 1, &m_matrixBuffer);
+
+ // Set shader texture resources in the pixel shader.
+ deviceContext->PSSetShaderResources(0, 1, &texture1);
+ deviceContext->PSSetShaderResources(1, 1, &texture2);
+
+ return true;
+}
+
+
+void LightMapShaderClass::RenderShader(ID3D11DeviceContext* deviceContext, int indexCount)
+{
+ // Set the vertex input layout.
+ deviceContext->IASetInputLayout(m_layout);
+
+ // Set the vertex and pixel shaders that will be used to render this triangle.
+ deviceContext->VSSetShader(m_vertexShader, NULL, 0);
+ deviceContext->PSSetShader(m_pixelShader, NULL, 0);
+
+ // Set the sampler state in the pixel shader.
+ deviceContext->PSSetSamplers(0, 1, &m_sampleState);
+
+ // Render the triangle.
+ deviceContext->DrawIndexed(indexCount, 0, 0);
+
+ return;
+}
diff --git a/enginecustom/lightmapshaderclass.h b/enginecustom/lightmapshaderclass.h
new file mode 100644
index 0000000..0e3d32b
--- /dev/null
+++ b/enginecustom/lightmapshaderclass.h
@@ -0,0 +1,55 @@
+////////////////////////////////////////////////////////////////////////////////
+#ifndef _LIGHTMAPSHADERCLASS_H_
+#define _LIGHTMAPSHADERCLASS_H_
+
+
+//////////////
+// INCLUDES //
+//////////////
+#include
+#include
+#include
+#include
+using namespace DirectX;
+using namespace std;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Class name: LightMapShaderClass
+////////////////////////////////////////////////////////////////////////////////
+class LightMapShaderClass
+{
+private:
+ struct MatrixBufferType
+ {
+ XMMATRIX world;
+ XMMATRIX view;
+ XMMATRIX projection;
+ };
+
+public:
+ LightMapShaderClass();
+ LightMapShaderClass(const LightMapShaderClass&);
+ ~LightMapShaderClass();
+
+ bool Initialize(ID3D11Device*, HWND);
+ void Shutdown();
+ bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*);
+
+private:
+ bool InitializeShader(ID3D11Device*, HWND, WCHAR*, WCHAR*);
+ void ShutdownShader();
+ void OutputShaderErrorMessage(ID3D10Blob*, HWND, WCHAR*);
+
+ bool SetShaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*);
+ void RenderShader(ID3D11DeviceContext*, int);
+
+private:
+ ID3D11VertexShader* m_vertexShader;
+ ID3D11PixelShader* m_pixelShader;
+ ID3D11InputLayout* m_layout;
+ ID3D11Buffer* m_matrixBuffer;
+ ID3D11SamplerState* m_sampleState;
+};
+
+#endif
\ No newline at end of file
diff --git a/enginecustom/square.txt b/enginecustom/square.txt
new file mode 100644
index 0000000..ab9a113
--- /dev/null
+++ b/enginecustom/square.txt
@@ -0,0 +1,10 @@
+Vertex Count: 6
+
+Data:
+
+-1.0 1.0 0.0 0.0 0.0 0.0 0.0 -1.0
+ 1.0 1.0 0.0 1.0 0.0 0.0 0.0 -1.0
+-1.0 -1.0 0.0 0.0 1.0 0.0 0.0 -1.0
+-1.0 -1.0 0.0 0.0 1.0 0.0 0.0 -1.0
+ 1.0 1.0 0.0 1.0 0.0 0.0 0.0 -1.0
+ 1.0 -1.0 0.0 1.0 1.0 0.0 0.0 -1.0