diff --git a/enginecustom/Light.vs b/enginecustom/Light.vs
index 81923e6..8e32839 100644
--- a/enginecustom/Light.vs
+++ b/enginecustom/Light.vs
@@ -1,7 +1,3 @@
-////////////////////////////////////////////////////////////////////////////////
-// Filename: light.vs
-////////////////////////////////////////////////////////////////////////////////
-
 /////////////
 // DEFINES //
 /////////////
diff --git a/enginecustom/applicationclass.cpp b/enginecustom/applicationclass.cpp
index bc6974c..af4d091 100644
--- a/enginecustom/applicationclass.cpp
+++ b/enginecustom/applicationclass.cpp
@@ -3,12 +3,9 @@
 ApplicationClass::ApplicationClass()
 {
 	m_Direct3D = 0;
-	m_Camera = 0; 
-	m_MultiTextureShader = 0;
-	m_AlphaMapShader = 0;
+	m_Camera = 0;
 	m_Model = 0;
 	m_LightShader = 0;
-	m_LightMapShader = 0;
 	m_Light = 0;
 	m_TextureShader = 0;
 	m_Bitmap = 0;
@@ -22,8 +19,7 @@ ApplicationClass::ApplicationClass()
 	m_TextString3 = 0;
 	m_Fps = 0;
 	m_FpsString = 0;
-	m_NormalMapShader = 0;
-	m_SpecMapShader = 0;
+	m_ShaderManager = 0;
 	m_RenderCountString = 0;
 	m_ModelList = 0;
 	m_Position = 0;
@@ -47,7 +43,7 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
 {
 	char mouseString1[32], mouseString2[32], mouseString3[32];
 	char testString1[32], testString2[32], testString3[32];
-	char modelFilename[128], textureFilename1[128], textureFilename2[128], textureFilename3[128], renderString[32];
+	char modelFilename[128], textureFilename1[128], textureFilename2[128], textureFilename3[128], textureFilename4[128], textureFilename5[128], textureFilename6[128], renderString[32];
 	char bitmapFilename[128];
 	char spriteFilename[128];
 	char fpsString[32];
@@ -83,26 +79,6 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
 	m_Camera->Render();
 	m_Camera->GetViewMatrix(m_baseViewMatrix);
 
-	// Create and initialize the specular map shader object.
-	m_SpecMapShader = new SpecMapShaderClass;
-
-	result = m_SpecMapShader->Initialize(m_Direct3D->GetDevice(), hwnd);
-	if (!result)
-	{
-		MessageBox(hwnd, L"Could not initialize the specular map shader object.", L"Error", MB_OK);
-		return false;
-	}
-
-	// Create and initialize the normal map shader object.
-	m_NormalMapShader = new NormalMapShaderClass;
-
-	result = m_NormalMapShader->Initialize(m_Direct3D->GetDevice(), hwnd);
-	if (!result)
-	{
-		MessageBox(hwnd, L"Could not initialize the normal map shader object.", L"Error", MB_OK);
-		return false;
-	}
-
 	// Create and initialize the font shader object.
 	m_FontShader = new FontShaderClass;
 
@@ -233,15 +209,6 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
 		return false;
 	}
 
-	// Create and initialize the multitexture shader object.
-	m_MultiTextureShader = new MultiTextureShaderClass;
-
-	result = m_MultiTextureShader->Initialize(m_Direct3D->GetDevice(), hwnd);
-	if (!result)
-	{
-		MessageBox(hwnd, L"Could not initialize the multitexture shader object.", L"Error", MB_OK);
-		return false;
-	}
 
 	// Set the file name of the model.
 	strcpy_s(modelFilename, "cube.txt");
@@ -249,20 +216,23 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
 	// Set the file name of the textures.
 	strcpy_s(textureFilename1, "stone01.tga");
 	strcpy_s(textureFilename2, "normal01.tga");
-	strcpy_s(textureFilename3, "alpha01.tga");
+	strcpy_s(textureFilename3, "spec02.tga");
+	strcpy_s(textureFilename4, "alpha01.tga");
+	strcpy_s(textureFilename5, "light01.tga");
+	strcpy_s(textureFilename6, "moss01.tga");
 	// A FAIRE: Ajouter une nouvelle texture pour le multitexturing
 
 	// Create and initialize the model object.
 	m_Model = new ModelClass;
 
-	result = m_Model->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename1, textureFilename2, textureFilename3);
+	result = m_Model->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename1, textureFilename2, textureFilename3, textureFilename4,
+		textureFilename5, textureFilename6);
 	if (!result)
 	{
 		MessageBox(hwnd, L"Could not initialize the model object.", L"Error", MB_OK);
 		return false;
 	}
 
-
 	// Create and initialize the light shader object.
 	m_LightShader = new LightShaderClass;
 
@@ -287,38 +257,38 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
 	// Create and initialize the light objects array.
 	m_Lights = new LightClass[m_numLights];
 
+	m_Lights[0].SetDiffuseColor(1.0f, 1.0f, 1.0f, 1.0f);  // White
+	m_Lights[0].SetPosition(10.0f, -5.0f, -15.0f);
+	m_Lights[0].SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
+	m_Lights[0].SetSpecularPower(16.0f);
+
 	// Manually set the color and position of each light.
-	m_Lights[0].SetDiffuseColor(1.0f, 0.0f, 0.0f, 1.0f);  // Red
-	m_Lights[0].SetPosition(-3.0f, 1.0f, 3.0f);
+	m_Lights[1].SetDiffuseColor(1.0f, 0.0f, 0.0f, 1.0f);  // Red
+	m_Lights[1].SetPosition(-3.0f, 1.0f, 3.0f);
+	m_Lights[1].SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
+	m_Lights[1].SetSpecularPower(16.0f);
 
-	m_Lights[1].SetDiffuseColor(0.0f, 1.0f, 0.0f, 1.0f);  // Green
-	m_Lights[1].SetPosition(3.0f, 1.0f, 3.0f);
+	m_Lights[2].SetDiffuseColor(0.0f, 1.0f, 0.0f, 1.0f);  // Green
+	m_Lights[2].SetPosition(3.0f, 1.0f, 3.0f);
+	m_Lights[2].SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
+	m_Lights[2].SetSpecularPower(16.0f);
+	
+	m_Lights[3].SetDiffuseColor(0.0f, 0.0f, 1.0f, 1.0f);  // Blue
+	m_Lights[3].SetPosition(-3.0f, 1.0f, -3.0f);
+	m_Lights[3].SetSpecularColor(1.0f, 1.0f, 1.0f, 1.0f);
+	m_Lights[3].SetSpecularPower(16.0f);
 
-	m_Lights[2].SetDiffuseColor(0.0f, 0.0f, 1.0f, 1.0f);  // Blue
-	m_Lights[2].SetPosition(-3.0f, 1.0f, -3.0f);
+	
+	// Create and initialize the normal map shader object.
+	m_ShaderManager = new ShaderManagerClass;
 
-	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);
+	result = m_ShaderManager->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 alpha map shader object.
-	m_AlphaMapShader = new AlphaMapShaderClass;
-
-	result = m_AlphaMapShader->Initialize(m_Direct3D->GetDevice(), hwnd);
-	if (!result)
-	{
-		MessageBox(hwnd, L"Could not initialize the alpha map shader object.", L"Error", MB_OK);
-		return false;
-	}
+	
 
 	// Create and initialize the font shader object.
 	m_FontShader = new FontShaderClass;
@@ -394,6 +364,15 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd)
 
 void ApplicationClass::Shutdown()
 {
+
+	// Release the shader manager object.
+	if (m_ShaderManager)
+	{
+		m_ShaderManager->Shutdown();
+		delete m_ShaderManager;
+		m_ShaderManager = 0;
+	}
+
 	// Release the frustum class object.
 	if (m_Frustum)
 	{
@@ -511,12 +490,19 @@ void ApplicationClass::Shutdown()
 		m_Sprite = 0;
 	}
 
-	  // Release the light objects.
-    if(m_Lights)
-    {
-        delete [] m_Lights;
-        m_Lights = 0;
-    }
+	// Release the lights objects.
+	if (m_Lights)
+	{
+		delete[] m_Lights;
+		m_Lights = 0;
+	}
+
+	// Release the light object.
+	if (m_Light)
+	{
+		delete m_Light;
+		m_Light = 0;
+	}
 
 	// Release the light shader object.
 	if (m_LightShader)
@@ -526,91 +512,12 @@ void ApplicationClass::Shutdown()
 		m_LightShader = 0;
 	}
 
-	// Release the specular map shader object.
-	if (m_SpecMapShader)
+	// Release the model object.
+	if (m_Model)
 	{
-		m_SpecMapShader->Shutdown();
-		delete m_SpecMapShader;
-		m_SpecMapShader = 0;
-	}
-
-	// Release the normal map shader object.
-	if (m_NormalMapShader)
-	{
-		m_NormalMapShader->Shutdown();
-		delete m_NormalMapShader;
-		m_NormalMapShader = 0;
-	}
-
-	// Liberez la memoire pour chaque cube
-	for (auto cube : m_cubes)
-	{
-		cube->Shutdown();
-		delete cube;
-	}
-	m_cubes.clear();
-
-	// Liberez la memoire pour chaque cube du terrain
-	for (auto cube : m_terrainChunk)
-	{
-		cube->Shutdown();
-		delete cube;
-	}
-	m_terrainChunk.clear();
-
-	for (auto object : m_object)
-	{
-		object->Shutdown();
-		delete object;
-	}
-	m_object.clear();
-
-	// Release the multitexture shader object.
-	if (m_MultiTextureShader)
-	{
-		m_MultiTextureShader->Shutdown();
-		delete m_MultiTextureShader;
-		m_MultiTextureShader = 0;
-		// Release the bitmap object.
-		if (m_Bitmap)
-		{
-			m_Bitmap->Shutdown();
-			delete m_Bitmap;
-			m_Bitmap = 0;
-		}
-
-		// Release the texture shader object.
-		if (m_TextureShader)
-		{
-			m_TextureShader->Shutdown();
-			delete m_TextureShader;
-			m_TextureShader = 0;
-		}
-	
-		// Release the camera object.
-		if (m_Camera)
-		{
-			delete m_Camera;
-			m_Camera = 0;
-		}
-
-		// Release the D3D object.
-		if (m_Direct3D)
-		{
-			m_Direct3D->Shutdown();
-			delete m_Direct3D;
-			m_Direct3D = 0;
-		}
-
-		return;
-	}
-
-	// Release the alpha map shader object.
-	if (m_AlphaMapShader)
-	{
-		m_AlphaMapShader->Shutdown();
-		delete m_AlphaMapShader;
-		m_AlphaMapShader = 0;
+		m_Model->Shutdown();
+		delete m_Model;
+		m_Model = 0;
 	}
 }
 
@@ -620,15 +527,16 @@ bool ApplicationClass::Frame(InputClass* Input)
 	int mouseX, mouseY, currentMouseX, currentMouseY;
 	bool result, leftMouseDown, rightMouseDown, keyDown, buttonQ, buttonD, buttonZ, buttonS, buttonA, buttonE;
 	float rotationY, rotationX, positionX, positionY, positionZ;
+	static float textureTranslation = 0.0f;
 
 	float frameTime;
 
 	static int lastMouseX = 0, lastMouseY = 0;
 
 	static float rotation = 360.0f;
-	static float x = 6.f;
-	static float y = 3.f;
-	static float z = 0.f;
+	static float x = 0.f;
+	static float y = 0.f;
+	static float z = -8.f;
 
 	// Update the system stats.
 	m_Timer->Frame();
@@ -690,7 +598,7 @@ bool ApplicationClass::Frame(InputClass* Input)
 	m_Camera->Render();
 
 	// Render the graphics scene.
-	result = Render(rotation, x, y, z);
+	result = Render(rotation, x, y, z, textureTranslation);
 	if (!result)
 	{
 		return false;
@@ -710,13 +618,13 @@ bool ApplicationClass::Frame(InputClass* Input)
 		rotation += 360.0f;
 	}
 
-	// Update the x position variable each frame.
-	x -= 0.0174532925f * 0.6f;
+	//// Update the x position variable each frame.
+	//x -= 0.0174532925f * 0.6f;
 
-	y -= 0.0174532925f * 0.2f;
+	//y -= 0.0174532925f * 0.2f;
 
-	// Update the z position variable each frame.
-	z -= 0.0174532925f * 0.2f;
+	//// Update the z position variable each frame.
+	//z -= 0.0174532925f * 0.2f;
 
 	// Render the scene to a render texture.
 	result = RenderSceneToTexture(rotation);
@@ -725,6 +633,10 @@ bool ApplicationClass::Frame(InputClass* Input)
 		return false;
 	}
 
+
+	// Check if the mouse has been pressed.
+	mouseDown = Input->IsMousePressed();
+
 	// Update the mouse strings each frame.
 	result = UpdateMouseStrings(mouseX, mouseY, leftMouseDown);
 	if (!result)
@@ -735,6 +647,20 @@ bool ApplicationClass::Frame(InputClass* Input)
 	// Update the sprite object using the frame time.
 	m_Sprite->Update(frameTime);
 
+	// Increment the texture translation.
+	textureTranslation += 0.01f;
+	if (textureTranslation > 1.0f)
+	{
+		textureTranslation -= 1.0f;
+	}
+
+	// Render the graphics scene.
+	result = Render(rotation, x, y, z, textureTranslation);
+	if (!result)
+	{
+		return false;
+	}
+
 	return true;
 }
 
@@ -774,7 +700,7 @@ bool ApplicationClass::RenderSceneToTexture(float rotation)
 	return true;
 }
 
-bool ApplicationClass::Render(float rotation, float x, float y, float z)
+bool ApplicationClass::Render(float rotation, float x, float y, float z, float textureTranslation)
 {
 	XMMATRIX worldMatrix, viewMatrix, orthoMatrix, projectionMatrix, rotateMatrix, translateMatrix, scaleMatrix, srMatrix;
 	float positionX, positionY, positionZ, radius;
@@ -1076,6 +1002,16 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z)
 		return false;
 	}
 
+	//// Get the light properties.
+	//for (i = 0; i < m_numLights; i++)
+	//{
+	//	// Create the diffuse color array from the four light colors.
+	//	diffuseColor[i] = m_Lights[i].GetDiffuseColor();
+
+	//	// Create the light position array from the four light positions.
+	//	lightPosition[i] = m_Lights[i].GetPosition();
+	//}
+
 	//scaleMatrix = XMMatrixScaling(0.75f, 0.75f, 0.75f);  // Build the scaling matrix.
 	//rotateMatrix = XMMatrixRotationY(rotation);  // Build the rotation matrix.
 	//translateMatrix = XMMatrixTranslation(x, y, z);  // Build the translation matrix.
@@ -1114,6 +1050,100 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z)
 	//// Render the model using the multitexture shader.
 	//m_Model->Render(m_Direct3D->GetDeviceContext());
 
+	// Setup matrices.
+	rotateMatrix = XMMatrixRotationY(rotation);
+	translateMatrix = XMMatrixTranslation(-5.0f, 1.0f, -20.0f);
+	worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix);
+
+	// Render the model using the alpha map shader.
+	m_Model->Render(m_Direct3D->GetDeviceContext());
+
+	result = m_ShaderManager->RenderAlphaMapShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
+		m_Model->GetTexture(0), m_Model->GetTexture(5), m_Model->GetTexture(3));
+	if (!result)
+	{
+		return false;
+	}
+
+	// Setup matrices.
+	rotateMatrix = XMMatrixRotationY(rotation);
+	translateMatrix = XMMatrixTranslation(-5.0f, -5.0f, -20.0f);
+	worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix);
+
+	// Render the model using the texture shader.
+	m_Model->Render(m_Direct3D->GetDeviceContext());
+
+	result = m_ShaderManager->RenderTextureShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
+		m_Model->GetTexture(0));
+	if (!result)
+	{
+		return false;
+	}
+
+	// Setup matrices.
+	rotateMatrix = XMMatrixRotationY(rotation);
+	translateMatrix = XMMatrixTranslation(0.0f, 1.0f, -20.0f);
+	worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix);
+
+	// Render the model using the render map shader.
+	m_Model->Render(m_Direct3D->GetDeviceContext());
+
+	result = m_ShaderManager->RenderNormalMapShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
+		m_Model->GetTexture(0), m_Model->GetTexture(1), m_Lights->GetDirection(), m_Lights->GetDiffuseColor());
+	if (!result)
+	{
+		return false;
+	}
+	
+
+	// Setup matrices.
+	rotateMatrix = XMMatrixRotationY(rotation);
+	translateMatrix = XMMatrixTranslation(0.0f, -2.0f, -20.0f);
+	worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix);
+
+	// Render the model using the multitexture shader.
+	m_Model->Render(m_Direct3D->GetDeviceContext());
+
+	result = m_ShaderManager->RenderMultitextureShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
+		m_Model->GetTexture(0), m_Model->GetTexture(5));
+	if (!result)
+	{
+		return false;
+	}
+	
+
+	// Setup matrices.
+	rotateMatrix = XMMatrixRotationY(rotation);
+	translateMatrix = XMMatrixTranslation(0.0f, -5.0f, -20.0f);
+	worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix);
+
+	// Render the model using the translate shader.
+	m_Model->Render(m_Direct3D->GetDeviceContext());
+
+	result = m_ShaderManager->RenderTranslateShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
+		m_Model->GetTexture(0), textureTranslation);
+	if (!result)
+	{
+		return false;
+	}
+
+	// Setup matrices.
+	rotateMatrix = XMMatrixRotationY(rotation);
+	translateMatrix = XMMatrixTranslation(-5.0f, -2.0f, -20.0f);
+	worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix);
+
+	// Render the model using the specular map shader.
+	m_Model->Render(m_Direct3D->GetDeviceContext());
+
+	result = m_ShaderManager->RenderSpecMapShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
+		m_Model->GetTexture(0), m_Model->GetTexture(1), m_Model->GetTexture(2), m_Lights->GetDirection(), m_Lights->GetDiffuseColor(),
+		m_Camera->GetPosition(), m_Lights->GetSpecularColor(), m_Lights->GetSpecularPower());
+	if (!result)
+	{
+		return false;
+	}
+	
+
 	// Lighting, utilise plusieurs lights donc Multiple Points Lighting
 	//result = m_LightShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0),
 	//	diffuseColor, lightPosition);
@@ -1130,21 +1160,6 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z)
 	//	return false;
 	//}
 
-	// MultiTexturing
-	//result = m_MultiTextureShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
-	//	m_Model->GetTexture(0), m_Model->GetTexture(1));
-	//if (!result)
-	//{
-	//	return false;
-	//}
-
-	// Alphamapping
-	/*result = m_AlphaMapShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
-		m_Model->GetTexture(0), m_Model->GetTexture(1), m_Model->GetTexture(2));
-	if (!result)
-	{
-		return false;
-	}*/
 
 	// Enable the Z buffer and disable alpha blending now that 2D rendering is complete.
 	m_Direct3D->TurnZBufferOn();
diff --git a/enginecustom/applicationclass.h b/enginecustom/applicationclass.h
index 820f2d7..8068974 100644
--- a/enginecustom/applicationclass.h
+++ b/enginecustom/applicationclass.h
@@ -14,26 +14,22 @@
 #include <filesystem>
 
 #include "lightmapshaderclass.h"
-#include "multitextureshaderclass.h"
-#include "alphamapshaderclass.h"
 #include "bitmapclass.h"
-#include "textureshaderclass.h"
 #include "spriteclass.h"
+#include "textureshaderclass.h"
 #include "timerclass.h"
 #include "fontshaderclass.h"
 #include "fontclass.h"
 #include "textclass.h"
 #include "fpsclass.h"
 #include "inputclass.h"
-#include "normalmapshaderclass.h"
-#include "specmapshaderclass.h"
+#include "shadermanagerclass.h"
 #include "modellistclass.h"
 #include "positionclass.h"
 #include "frustumclass.h"
 #include "rendertextureclass.h"
 #include "displayplaneclass.h"
-#include "translateshaderclass.h"
-#include "reflectionshaderclass.h"
+
 
 
 /////////////
@@ -79,7 +75,7 @@ public:
 	void DeleteTerrain();
 
 private:
-	bool Render(float, float, float, float);
+	bool Render(float, float, float, float, float);
 	bool UpdateMouseStrings(int, int, bool);
 	bool UpdateFps();
 	bool UpdateRenderCountString(int);
@@ -94,6 +90,8 @@ private :
 	D3DClass* m_Direct3D;
 	IDXGISwapChain* m_swapChain;
 	ModelClass* m_Model;
+	TextureShaderClass* m_TextureShader;
+	ShaderManagerClass* m_ShaderManager;
 	ModelListClass* m_ModelList;
 
 	// ------------------------------------- //
@@ -132,13 +130,7 @@ private :
 
 	LightShaderClass* m_LightShader;
 	LightMapShaderClass* m_LightMapShader;
-	MultiTextureShaderClass* m_MultiTextureShader;
-	AlphaMapShaderClass* m_AlphaMapShader;
-	TextureShaderClass* m_TextureShader;
 	FontShaderClass* m_FontShader;
-	NormalMapShaderClass* m_NormalMapShader;
-	SpecMapShaderClass* m_SpecMapShader;
-	TranslateShaderClass* m_TranslateShader;
 	ReflectionShaderClass* m_ReflectionShader;
 
 	BitmapClass* m_Bitmap;
@@ -157,6 +149,7 @@ private :
 	TextClass* m_FpsString;
 	int m_previousFps;
 
+r-Manager
 };
 
 #endif
\ No newline at end of file
diff --git a/enginecustom/enginecustom.vcxproj b/enginecustom/enginecustom.vcxproj
index 81c17e5..68ebf0c 100644
--- a/enginecustom/enginecustom.vcxproj
+++ b/enginecustom/enginecustom.vcxproj
@@ -48,6 +48,7 @@
     <ClCompile Include="modellistclass.cpp" />
     <ClCompile Include="Multitextureshaderclass.cpp" />
     <ClCompile Include="normalmapshaderclass.cpp" />
+    <ClCompile Include="shadermanagerclass.cpp" />
     <ClCompile Include="positionclass.cpp" />
     <ClCompile Include="reflectionshaderclass.cpp" />
     <ClCompile Include="rendertextureclass.cpp" />
@@ -90,6 +91,7 @@
     <ClInclude Include="modellistclass.h" />
     <ClInclude Include="Multitextureshaderclass.h" />
     <ClInclude Include="normalmapshaderclass.h" />
+    <ClInclude Include="shadermanagerclass.h" />
     <ClInclude Include="positionclass.h" />
     <ClInclude Include="reflectionshaderclass.h" />
     <ClInclude Include="rendertextureclass.h" />
@@ -129,7 +131,6 @@
       <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Pixel</ShaderType>
       <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Pixel</ShaderType>
       <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Pixel</ShaderType>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
       <FileType>Document</FileType>
     </None>
     <None Include="Color.vs">
@@ -137,7 +138,6 @@
       <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Vertex</ShaderType>
       <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Vertex</ShaderType>
       <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Vertex</ShaderType>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
       <FileType>Document</FileType>
     </None>
   </ItemGroup>
@@ -150,6 +150,7 @@
     <Image Include="moss01.tga" />
     <Image Include="normal01.tga" />
     <Image Include="papier.tga" />
+    <Image Include="spec02.tga" />
     <Image Include="stone01.tga" />
     <Image Include="wall.tga" />
   </ItemGroup>
@@ -175,7 +176,6 @@
     <VCProjectVersion>17.0</VCProjectVersion>
     <Keyword>Win32Proj</Keyword>
     <ProjectGuid>{92cf56c4-76bb-40d4-8fe5-36c15f5f127a}</ProjectGuid>
-    <RootNamespace>enginecustom</RootNamespace>
     <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
diff --git a/enginecustom/enginecustom.vcxproj.filters b/enginecustom/enginecustom.vcxproj.filters
index 07bef64..44441ea 100644
--- a/enginecustom/enginecustom.vcxproj.filters
+++ b/enginecustom/enginecustom.vcxproj.filters
@@ -398,5 +398,8 @@
     <Text Include="square.txt">
       <Filter>assets</Filter>
     </Text>
+    <ClCompile Include="shadermanagerclass.cpp" />
+    <ClInclude Include="shadermanagerclass.h" />
+    <Image Include="spec02.tga" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/enginecustom/light.vs b/enginecustom/light.vs
index 81923e6..8e32839 100644
--- a/enginecustom/light.vs
+++ b/enginecustom/light.vs
@@ -1,7 +1,3 @@
-////////////////////////////////////////////////////////////////////////////////
-// Filename: light.vs
-////////////////////////////////////////////////////////////////////////////////
-
 /////////////
 // DEFINES //
 /////////////
diff --git a/enginecustom/modelclass.cpp b/enginecustom/modelclass.cpp
index 38dcfa7..c47f3b1 100644
--- a/enginecustom/modelclass.cpp
+++ b/enginecustom/modelclass.cpp
@@ -19,7 +19,8 @@ ModelClass::~ModelClass()
 {
 }
 
-bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* modelFilename, char* textureFilename1, char* textureFilename2, char* textureFilename3)
+bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* modelFilename, char* textureFilename1, char* textureFilename2, char* textureFilename3, 
+	char* textureFilename4, char* textureFilename5, char* textureFilename6)
 {
 	bool result;
 
@@ -40,7 +41,7 @@ bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceCon
 		return false;
 	}
 	// Load the textures for this model.
-	result = LoadTextures(device, deviceContext, textureFilename1, textureFilename2, textureFilename3);
+	result = LoadTextures(device, deviceContext, textureFilename1, textureFilename2, textureFilename3, textureFilename4, textureFilename5, textureFilename6);
 	if (!result)
 	{
 		return false;
@@ -206,13 +207,14 @@ void ModelClass::RenderBuffers(ID3D11DeviceContext* deviceContext)
 }
 
 
-bool ModelClass::LoadTextures(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* filename1, char* filename2, char* filename3)
+bool ModelClass::LoadTextures(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* filename1, char* filename2, char* filename3, char* filename4, char* filename5, 
+	char* filename6)
 {
 	bool result;
 
 
 	// Create and initialize the texture object array.
-	m_Textures = new TextureClass[3];
+	m_Textures = new TextureClass[6];
 
 	result = m_Textures[0].Initialize(device, deviceContext, filename1);
 	if (!result)
@@ -232,6 +234,24 @@ bool ModelClass::LoadTextures(ID3D11Device* device, ID3D11DeviceContext* deviceC
 		return false;
 	}
 
+	result = m_Textures[3].Initialize(device, deviceContext, filename4);
+	if (!result)
+	{
+		return false;
+	}
+
+	result = m_Textures[4].Initialize(device, deviceContext, filename5);
+	if (!result)
+	{
+		return false;
+	}
+
+	result = m_Textures[5].Initialize(device, deviceContext, filename6);
+	if (!result)
+	{
+		return false;
+	}
+
 
 	return true;
 }
@@ -244,6 +264,9 @@ void ModelClass::ReleaseTextures()
 		m_Textures[0].Shutdown();
 		m_Textures[1].Shutdown();
 		m_Textures[2].Shutdown();
+		m_Textures[3].Shutdown();
+		m_Textures[4].Shutdown();
+		m_Textures[5].Shutdown();
 
 		delete[] m_Textures;
 		m_Textures = 0;
diff --git a/enginecustom/modelclass.h b/enginecustom/modelclass.h
index 70eed55..3db14c8 100644
--- a/enginecustom/modelclass.h
+++ b/enginecustom/modelclass.h
@@ -80,7 +80,7 @@ public:
 	ModelClass(const ModelClass&);
 	~ModelClass();
 
-	bool Initialize(ID3D11Device*, ID3D11DeviceContext*, char*, char*, char*, char*);
+	bool Initialize(ID3D11Device*, ID3D11DeviceContext*, char*, char*, char*, char*, char*, char*, char*);
 	void Shutdown();
 	void Render(ID3D11DeviceContext*);
 
@@ -91,7 +91,7 @@ private:
 	bool InitializeBuffers(ID3D11Device*);
 	void ShutdownBuffers();
 	void RenderBuffers(ID3D11DeviceContext*);
-	bool LoadTextures(ID3D11Device*, ID3D11DeviceContext*, char*, char*, char*);
+	bool LoadTextures(ID3D11Device*, ID3D11DeviceContext*, char*, char*, char*, char*, char*, char*);
 	void ReleaseTextures();
 
 	bool LoadModel(char*);
diff --git a/enginecustom/packages.config b/enginecustom/packages.config
deleted file mode 100644
index cbf6205..0000000
--- a/enginecustom/packages.config
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="Microsoft.Windows.CppWinRT" version="2.0.220531.1" targetFramework="native" />
-</packages>
\ No newline at end of file
diff --git a/enginecustom/papier.tga b/enginecustom/papier.tga
deleted file mode 100644
index 4f0b9b9..0000000
Binary files a/enginecustom/papier.tga and /dev/null differ
diff --git a/enginecustom/shadermanagerclass.cpp b/enginecustom/shadermanagerclass.cpp
new file mode 100644
index 0000000..4a7a99c
--- /dev/null
+++ b/enginecustom/shadermanagerclass.cpp
@@ -0,0 +1,229 @@
+#include "shadermanagerclass.h"
+
+ShaderManagerClass::ShaderManagerClass()
+{
+    m_TextureShader = 0;
+    m_NormalMapShader = 0;
+    m_MultitextureShader = 0;
+    m_TranslateShader = 0;
+    m_AlphaMapShader = 0;
+    m_SpecMapShader = 0;
+}
+
+
+ShaderManagerClass::ShaderManagerClass(const ShaderManagerClass& other)
+{
+}
+
+
+ShaderManagerClass::~ShaderManagerClass()
+{
+}
+
+
+bool ShaderManagerClass::Initialize(ID3D11Device* device, HWND hwnd)
+{
+    bool result;
+
+    // Create and initialize the texture shader object.
+    m_TextureShader = new TextureShaderClass;
+
+    result = m_TextureShader->Initialize(device, hwnd);
+    if (!result)
+    {
+        return false;
+    }
+
+    // Create and initialize the normal map shader object.
+    m_NormalMapShader = new NormalMapShaderClass;
+
+    result = m_NormalMapShader->Initialize(device, hwnd);
+    if (!result)
+    {
+        return false;
+    }
+
+    // Create and initialize the multitexture shader object.
+    m_MultitextureShader = new MultiTextureShaderClass;
+
+    result = m_MultitextureShader->Initialize(device, hwnd);
+    if (!result)
+    {
+        return false;
+    }
+
+    // Create and initialize the translate shader object.
+    m_TranslateShader = new TranslateShaderClass;
+
+    result = m_TranslateShader->Initialize(device, hwnd);
+    if (!result)
+    {
+        return false;
+    }
+
+    // Create and initialize the alpha map shader object.
+    m_AlphaMapShader = new AlphaMapShaderClass;
+
+    result = m_AlphaMapShader->Initialize(device, hwnd);
+    if (!result)
+    {
+        return false;
+    }
+
+    // Create and initialize the specular map shader object.
+    m_SpecMapShader = new SpecMapShaderClass;
+
+    result = m_SpecMapShader->Initialize(device, hwnd);
+    if (!result)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+void ShaderManagerClass::Shutdown()
+{
+    // Release the normal map shader object.
+    if (m_NormalMapShader)
+    {
+        m_NormalMapShader->Shutdown();
+        delete m_NormalMapShader;
+        m_NormalMapShader = 0;
+    }
+
+    // Release the texture shader object.
+    if (m_TextureShader)
+    {
+        m_TextureShader->Shutdown();
+        delete m_TextureShader;
+        m_TextureShader = 0;
+    }
+
+    // Release the multitexture shader object.
+    if (m_MultitextureShader)
+    {
+        m_MultitextureShader->Shutdown();
+        delete m_MultitextureShader;
+        m_MultitextureShader = 0;
+    }
+
+    // Release the multitexture shader object.
+    if (m_TranslateShader)
+    {
+        m_TranslateShader->Shutdown();
+        delete m_TranslateShader;
+        m_TranslateShader = 0;
+    }
+
+    // Release the alpha map shader object.
+    if (m_AlphaMapShader)
+    {
+        m_AlphaMapShader->Shutdown();
+        delete m_AlphaMapShader;
+        m_AlphaMapShader = 0;
+    }
+
+    // Release the specular map shader object.
+    if (m_SpecMapShader)
+    {
+        m_SpecMapShader->Shutdown();
+        delete m_SpecMapShader;
+        m_SpecMapShader = 0;
+    }
+
+    return;
+      
+}
+
+bool ShaderManagerClass::RenderTextureShader(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
+    ID3D11ShaderResourceView* texture)
+{
+    bool result;
+
+
+    result = m_TextureShader->Render(deviceContext, indexCount, worldMatrix, viewMatrix, projectionMatrix, texture);
+    if (!result)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool ShaderManagerClass::RenderNormalMapShader(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
+    ID3D11ShaderResourceView* colorTexture, ID3D11ShaderResourceView* normalTexture, XMFLOAT3 lightDirection, XMFLOAT4 diffuseColor)
+{
+    bool result;
+
+
+    result = m_NormalMapShader->Render(deviceContext, indexCount, worldMatrix, viewMatrix, projectionMatrix, colorTexture, normalTexture, lightDirection, diffuseColor);
+    if (!result)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool ShaderManagerClass::RenderMultitextureShader(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
+    ID3D11ShaderResourceView* texture1, ID3D11ShaderResourceView* texture2)
+{
+    bool result;
+
+
+    result = m_MultitextureShader->Render(deviceContext, indexCount, worldMatrix, viewMatrix, projectionMatrix, texture1, texture2);
+    if (!result)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool ShaderManagerClass::RenderTranslateShader(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
+    ID3D11ShaderResourceView* texture1, float valeur)
+{
+    bool result;
+
+
+    result = m_TranslateShader->Render(deviceContext, indexCount, worldMatrix, viewMatrix, projectionMatrix, texture1, valeur);
+    if (!result)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool ShaderManagerClass::RenderAlphaMapShader(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
+    ID3D11ShaderResourceView* texture1, ID3D11ShaderResourceView* texture2, ID3D11ShaderResourceView* texture3)
+{
+    bool result;
+
+
+    result = m_AlphaMapShader->Render(deviceContext, indexCount, worldMatrix, viewMatrix, projectionMatrix, texture1, texture2, texture3);
+    if (!result)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool ShaderManagerClass::RenderSpecMapShader(ID3D11DeviceContext* deviceContext, int indexCount, XMMATRIX worldMatrix, XMMATRIX viewMatrix, XMMATRIX projectionMatrix,
+    ID3D11ShaderResourceView* texture1, ID3D11ShaderResourceView* texture2, ID3D11ShaderResourceView* texture3,
+    XMFLOAT3 lightDirection, XMFLOAT4 diffuseColor, XMFLOAT3 cameraPosition, XMFLOAT4 specularColor, float specularPower)
+{
+    bool result;
+
+
+    result = m_SpecMapShader->Render(deviceContext, indexCount, worldMatrix, viewMatrix, projectionMatrix, texture1, texture2, texture3, lightDirection, 
+        diffuseColor, cameraPosition, specularColor, specularPower);
+    if (!result)
+    {
+        return false;
+    }
+
+    return true;
+}
\ No newline at end of file
diff --git a/enginecustom/shadermanagerclass.h b/enginecustom/shadermanagerclass.h
new file mode 100644
index 0000000..23a3a50
--- /dev/null
+++ b/enginecustom/shadermanagerclass.h
@@ -0,0 +1,45 @@
+#ifndef _SHADERMANAGERCLASS_H_
+#define _SHADERMANAGERCLASS_H_
+
+///////////////////////
+// MY CLASS INCLUDES //
+///////////////////////
+#include "textureshaderclass.h"
+#include "lightshaderclass.h"
+#include "normalmapshaderclass.h"
+#include "Multitextureshaderclass.h"
+#include "translateshaderclass.h"
+#include "alphamapshaderclass.h"
+#include "specmapshaderclass.h"
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Class name: ShaderManagerClass
+////////////////////////////////////////////////////////////////////////////////
+class ShaderManagerClass
+{
+public:
+    ShaderManagerClass();
+    ShaderManagerClass(const ShaderManagerClass&);
+    ~ShaderManagerClass();
+
+    bool Initialize(ID3D11Device*, HWND);
+    void Shutdown();
+    bool RenderTextureShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*);
+    bool RenderNormalMapShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*, XMFLOAT3, XMFLOAT4);
+    bool RenderMultitextureShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*);
+    bool RenderTranslateShader(ID3D11DeviceContext*,int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, float);
+    bool RenderAlphaMapShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*);
+    bool RenderSpecMapShader(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*, ID3D11ShaderResourceView*,
+        XMFLOAT3, XMFLOAT4, XMFLOAT3, XMFLOAT4, float);
+
+private:
+    TextureShaderClass* m_TextureShader;
+    NormalMapShaderClass* m_NormalMapShader;
+    MultiTextureShaderClass* m_MultitextureShader;
+    TranslateShaderClass* m_TranslateShader;
+    AlphaMapShaderClass* m_AlphaMapShader;
+    SpecMapShaderClass* m_SpecMapShader;
+};
+
+#endif
diff --git a/enginecustom/spec02.tga b/enginecustom/spec02.tga
new file mode 100644
index 0000000..b5085a7
Binary files /dev/null and b/enginecustom/spec02.tga differ
diff --git a/enginecustom/translateshaderclass.cpp b/enginecustom/translateshaderclass.cpp
index 47692f3..6eca67c 100644
--- a/enginecustom/translateshaderclass.cpp
+++ b/enginecustom/translateshaderclass.cpp
@@ -8,7 +8,6 @@ TranslateShaderClass::TranslateShaderClass()
     m_layout = 0;
     m_matrixBuffer = 0;
     m_sampleState = 0;
-
     m_translateBuffer = 0;
 }
 
@@ -31,14 +30,14 @@ bool TranslateShaderClass::Initialize(ID3D11Device* device, HWND hwnd)
     int error;
 
     // Set the filename of the vertex shader.
-    error = wcscpy_s(vsFilename, 128, L"../Engine/translate.vs");
+    error = wcscpy_s(vsFilename, 128, L"translate.vs");
     if (error != 0)
     {
         return false;
     }
 
     // Set the filename of the pixel shader.
-    error = wcscpy_s(psFilename, 128, L"../Engine/translate.ps");
+    error = wcscpy_s(psFilename, 128, L"translate.ps");
     if (error != 0)
     {
         return false;
diff --git a/enginecustom/translateshaderclass.h b/enginecustom/translateshaderclass.h
index a51f1ab..779c535 100644
--- a/enginecustom/translateshaderclass.h
+++ b/enginecustom/translateshaderclass.h
@@ -55,7 +55,6 @@ private:
     ID3D11InputLayout* m_layout;
     ID3D11Buffer* m_matrixBuffer;
     ID3D11SamplerState* m_sampleState;
-
     ID3D11Buffer* m_translateBuffer;
 };