diff --git a/.idea/.idea.KhaoticEngineReborn/.idea/AndroidProjectSystem.xml b/.idea/.idea.KhaoticEngineReborn/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..e82600c --- /dev/null +++ b/.idea/.idea.KhaoticEngineReborn/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.KhaoticEngineReborn/.idea/projectSettingsUpdater.xml b/.idea/.idea.KhaoticEngineReborn/.idea/projectSettingsUpdater.xml index 64af657..ef20cb0 100644 --- a/.idea/.idea.KhaoticEngineReborn/.idea/projectSettingsUpdater.xml +++ b/.idea/.idea.KhaoticEngineReborn/.idea/projectSettingsUpdater.xml @@ -2,6 +2,7 @@ \ No newline at end of file diff --git a/.idea/.idea.KhaoticEngineReborn/.idea/workspace.xml b/.idea/.idea.KhaoticEngineReborn/.idea/workspace.xml index 4dc161d..1a8481b 100644 --- a/.idea/.idea.KhaoticEngineReborn/.idea/workspace.xml +++ b/.idea/.idea.KhaoticEngineReborn/.idea/workspace.xml @@ -5,10 +5,15 @@ + + - + + + + + + + + + + + + + + + + + + + @@ -38,25 +58,25 @@ - { - "keyToString": { - "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true", - "C++ Project.enginecustom.executor": "Run", - "C/C++ Project.enginecustom.executor": "Run", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.git.unshallow": "true", - "SHARE_PROJECT_CONFIGURATION_FILES": "true", - "git-widget-placeholder": "main", - "ignore.virus.scanning.warn.message": "true", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "settings.editor.selected.configurable": "preferences.pluginManager", - "vue.rearranger.settings.migration": "true" + +}]]> @@ -168,6 +188,8 @@ + + + + + + + + + + + + + + + diff --git a/enginecustom/assets/Texture/imgui.ini b/enginecustom/assets/Texture/imgui.ini index 596ef8a..1ef1a97 100644 --- a/enginecustom/assets/Texture/imgui.ini +++ b/enginecustom/assets/Texture/imgui.ini @@ -1,49 +1,89 @@ -[Window][DockSpace] -Pos=0,0 -Size=2048,1129 -Collapsed=0 - [Window][Debug##Default] Pos=60,60 Size=400,400 Collapsed=0 [Window][Khaotic Engine] -Pos=1687,27 -Size=353,1094 -Collapsed=0 -DockId=0x00000002,0 - -[Window][Objects] -Pos=8,27 -Size=345,896 +Pos=1233,27 +Size=343,826 Collapsed=0 DockId=0x00000005,0 -[Window][Engine Settings] -Pos=1687,27 -Size=353,1094 +[Window][Objects] +Pos=8,27 +Size=289,826 Collapsed=0 -DockId=0x00000002,1 +DockId=0x00000009,0 [Window][Terrain] -Pos=8,27 -Size=345,896 +Pos=299,27 +Size=250,826 Collapsed=0 -DockId=0x00000005,1 +DockId=0x00000007,0 [Window][Light] -Pos=8,925 -Size=345,196 +Pos=8,27 +Size=290,866 +Collapsed=0 +DockId=0x00000007,1 + +[Window][Shader Manager] +Pos=8,27 +Size=330,487 +Collapsed=0 +DockId=0x00000001,2 + +[Window][Engine Settings] +Pos=8,27 +Size=289,826 +Collapsed=0 +DockId=0x00000009,0 + +[Window][DockSpace Demo] +Size=1584,861 +Collapsed=0 + +[Window][Render Window] +Pos=8,27 +Size=1559,974 +Collapsed=0 +DockId=0x00000009,0 + +[Window][DockSpace] +Pos=0,0 +Size=1584,861 +Collapsed=0 + +[Window][Add Object] +Pos=1188,0 +Size=396,430 +Collapsed=0 + +[Window][Log] +Pos=8,518 +Size=1568,335 +Collapsed=0 +DockId=0x0000000C,0 + +[Window][Log Window] +Pos=8,627 +Size=1568,226 Collapsed=0 DockId=0x00000006,0 [Docking][Data] -DockSpace ID=0xCCBD8CF7 Window=0x3DA2F1DE Pos=8,27 Size=2032,1094 Split=X - DockNode ID=0x00000003 Parent=0xCCBD8CF7 SizeRef=345,826 Split=Y Selected=0x393905AB - DockNode ID=0x00000005 Parent=0x00000003 SizeRef=345,896 Selected=0x393905AB - DockNode ID=0x00000006 Parent=0x00000003 SizeRef=345,196 Selected=0x321620B2 - DockNode ID=0x00000004 Parent=0xCCBD8CF7 SizeRef=1221,826 Split=X - DockNode ID=0x00000001 Parent=0x00000004 SizeRef=866,826 CentralNode=1 - DockNode ID=0x00000002 Parent=0x00000004 SizeRef=353,826 Selected=0x9F035453 +DockSpace ID=0xC0DFADC4 Pos=8,27 Size=1568,826 Split=X + DockNode ID=0x00000001 Parent=0xC0DFADC4 SizeRef=330,1094 Selected=0x393905AB + DockNode ID=0x00000003 Parent=0xC0DFADC4 SizeRef=1700,1094 CentralNode=1 +DockSpace ID=0xCCBD8CF7 Window=0x3DA2F1DE Pos=8,27 Size=1568,826 Split=Y + DockNode ID=0x00000004 Parent=0xCCBD8CF7 SizeRef=1568,598 Split=X + DockNode ID=0x00000009 Parent=0x00000004 SizeRef=289,974 Selected=0x031DC75C + DockNode ID=0x0000000D Parent=0x00000004 SizeRef=1613,974 Split=X + DockNode ID=0x00000002 Parent=0x0000000D SizeRef=1268,826 Split=Y + DockNode ID=0x0000000B Parent=0x00000002 SizeRef=1568,637 Split=X + DockNode ID=0x00000007 Parent=0x0000000B SizeRef=250,826 Selected=0x393905AB + DockNode ID=0x00000008 Parent=0x0000000B SizeRef=971,826 CentralNode=1 Selected=0x031DC75C + DockNode ID=0x0000000C Parent=0x00000002 SizeRef=1568,335 Selected=0x139FDA3F + DockNode ID=0x00000005 Parent=0x0000000D SizeRef=343,826 Selected=0x9F035453 + DockNode ID=0x00000006 Parent=0xCCBD8CF7 SizeRef=1568,226 Selected=0xAB74BEE9 diff --git a/enginecustom/enginecustom.vcxproj b/enginecustom/enginecustom.vcxproj index 3a2a90b..2c395d2 100644 --- a/enginecustom/enginecustom.vcxproj +++ b/enginecustom/enginecustom.vcxproj @@ -310,6 +310,22 @@ + + $(OutDir)\assets\Texture + $(OutDir)\assets\Texture + + + $(OutDir)\assets\Texture + $(OutDir)\assets\Texture + + + $(OutDir)\assets\Texture + $(OutDir)\assets\Texture + + + $(OutDir)\assets\Skybox + $(OutDir)\assets\Skybox + diff --git a/enginecustom/enginecustom.vcxproj.filters b/enginecustom/enginecustom.vcxproj.filters index 3f57837..a71c638 100644 --- a/enginecustom/enginecustom.vcxproj.filters +++ b/enginecustom/enginecustom.vcxproj.filters @@ -480,5 +480,17 @@ Assets\Model\OBJ + + Texture + + + Texture + + + Texture + + + Assets\Skybox + \ No newline at end of file diff --git a/enginecustom/imgui.ini b/enginecustom/imgui.ini index b79fd41..cbe9131 100644 --- a/enginecustom/imgui.ini +++ b/enginecustom/imgui.ini @@ -13,7 +13,7 @@ DockId=0x00000005,0 Pos=8,27 Size=289,826 Collapsed=0 -DockId=0x00000009,1 +DockId=0x00000009,0 [Window][Terrain] Pos=8,27 diff --git a/enginecustom/src/inc/system/modelclass.h b/enginecustom/src/inc/system/modelclass.h index 69acb5b..457db5e 100644 --- a/enginecustom/src/inc/system/modelclass.h +++ b/enginecustom/src/inc/system/modelclass.h @@ -22,7 +22,78 @@ using namespace std; /////////////////////// #include "textureclass.h" +enum class TextureType +{ + Diffuse, + Normal, + Specular, + Alpha +}; +struct TextureContainer +{ + std::vector diffuse; + std::vector normal; + std::vector specular; + std::vector alpha; + + std::vector& Get(TextureType type) const { + switch (type) { + case TextureType::Diffuse: return const_cast&>(diffuse); + case TextureType::Normal: return const_cast&>(normal); + case TextureType::Specular: return const_cast&>(specular); + case TextureType::Alpha: return const_cast&>(alpha); + default: return const_cast&>(diffuse); + } + } + + ID3D11ShaderResourceView* GetTexture(TextureType type, int index) const { + auto& vec = Get(type); + if (index >= 0 && index < vec.size()) + return vec[index]; + return nullptr; + } + + void ReleaseAll() { + ReleaseVector(diffuse); + ReleaseVector(normal); + ReleaseVector(specular); + ReleaseVector(alpha); + } + + void AssignTexture(TextureContainer& textContainer, ID3D11ShaderResourceView* texture, int index) + { + switch (index) + { + case 0: + textContainer.diffuse.push_back(texture); + break; + case 1: + textContainer.normal.push_back(texture); + break; + case 2: + textContainer.specular.push_back(texture); + break; + case 3: + textContainer.alpha.push_back(texture); + break; + default: + textContainer.diffuse.push_back(texture); + break; + } + } + +private: + void ReleaseVector(std::vector& vec) { + for (auto& tex : vec) { + if (tex) { + tex->Release(); + tex = nullptr; + } + } + vec.clear(); + } +}; //////////////////////////////////////////////////////////////////////////////// // Class name: ModelClass //////////////////////////////////////////////////////////////////////////////// @@ -83,15 +154,25 @@ public: ModelClass(const ModelClass&); ~ModelClass(); - bool Initialize(ID3D11Device*, ID3D11DeviceContext*, char*, std::vector); - + //bool Initialize(ID3D11Device*, ID3D11DeviceContext*, char*, std::vector); + // Nouvelle surcharge avec TextureContainer + bool Initialize(ID3D11Device*, ID3D11DeviceContext*, char*, const TextureContainer&); + // Nouvelle méthode - initialisation sans textures + bool Initialize(ID3D11Device*, ID3D11DeviceContext*, char*); void Shutdown(); void Render(ID3D11DeviceContext*); int GetIndexCount(); - ID3D11ShaderResourceView* GetTexture(int index) const; - bool ChangeTexture(ID3D11Device*, ID3D11DeviceContext*, std::wstring filename, int index); + //ID3D11ShaderResourceView* GetTexture(int index) const; + ID3D11ShaderResourceView* GetTexture(TextureType type, int index) const; + //bool ChangeTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, std::wstring filename, int index); + bool ChangeTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext,std::wstring filename, TextureType type, int index); + + // Méthodes pour ajouter une nouvelle texture + bool AddTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext,std::wstring filename, TextureType type); + bool AddTexture(ID3D11ShaderResourceView* texture, TextureType type); + private: bool InitializeBuffers(ID3D11Device*); void ShutdownBuffers(); @@ -106,11 +187,10 @@ private: void CalculateModelVectors(); void CalculateTangentBinormal(TempVertexType, TempVertexType, TempVertexType, VectorType&, VectorType&); - -private: + ID3D11Buffer* m_vertexBuffer, * m_indexBuffer; int m_vertexCount, m_indexCount; - std::vector m_Textures; + TextureContainer m_Textures; ModelType* m_model; }; diff --git a/enginecustom/src/src/system/Skybox.cpp b/enginecustom/src/src/system/Skybox.cpp index 4ff090a..3e88ab5 100644 --- a/enginecustom/src/src/system/Skybox.cpp +++ b/enginecustom/src/src/system/Skybox.cpp @@ -29,12 +29,13 @@ Object* Skybox::ConstructSkybox() char modelFilename[128]; strcpy_s(modelFilename, "assets/Model/OBJ/skysphere.obj"); - - textures.clear(); + std::vector skyboxTextures = { L"assets/Skybox/skybox.png", }; + TextureContainer SkyboxTextures; + // Load the textures for (const auto& textureFilename : skyboxTextures) { @@ -45,12 +46,14 @@ Object* Skybox::ConstructSkybox() Logger::Get().Log("Failed to load texture: " + std::string(textureFilename.begin(), textureFilename.end()), __FILE__, __LINE__, Logger::LogLevel::Error); return nullptr; } - textures.push_back(texture); + SkyboxTextures.diffuse.push_back(texture); + + } // Create the model object m_Skybox = new Object(); - HRESULT result = m_Skybox->Initialize(m_d3dClassRef->GetDevice(), m_d3dClassRef->GetDeviceContext(), modelFilename, textures); + HRESULT result = m_Skybox->Initialize(m_d3dClassRef->GetDevice(), m_d3dClassRef->GetDeviceContext(), modelFilename, SkyboxTextures); if (!result) { Logger::Get().Log("Could not initialize the skybox model object", __FILE__, __LINE__, Logger::LogLevel::Error); diff --git a/enginecustom/src/src/system/applicationclass.cpp b/enginecustom/src/src/system/applicationclass.cpp index c87f20e..f0959c7 100644 --- a/enginecustom/src/src/system/applicationclass.cpp +++ b/enginecustom/src/src/system/applicationclass.cpp @@ -78,10 +78,10 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, bool result; HRESULT Hresult; + m_RenderQueues.push_back(std::ref(m_Skybox)); // Skybox doit être rendu en premier pour être derrière touts les autres objets m_RenderQueues.push_back(std::ref(m_object)); m_RenderQueues.push_back(std::ref(m_cubes)); m_RenderQueues.push_back(std::ref(m_terrainChunk)); - m_RenderQueues.push_back(std::ref(m_Skybox)); m_screenWidth = screenWidth; m_screenHeight = screenHeight; @@ -226,6 +226,8 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, L"assets/Texture/stone01.png" }; + TextureContainer CubeTextures; + for (const auto& textureFilename : textureFilenames) { ID3D11ShaderResourceView* texture = nullptr; @@ -235,13 +237,14 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, Logger::Get().Log("Failed to load texture: " + std::string(textureFilename.begin(), textureFilename.end()), __FILE__, __LINE__, Logger::LogLevel::Error); return false; } - textures.push_back(texture); + CubeTextures.diffuse.push_back(texture); } // Create and initialize the model object. m_Model = new ModelClass; + - result = m_Model->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textures); + result = m_Model->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, CubeTextures); if (!result) { Logger::Get().Log("Could not initialize the model object", __FILE__, __LINE__, Logger::LogLevel::Error); @@ -337,6 +340,8 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, L"assets/Texture/marble01.png" }; + TextureContainer BathTextures; + textures.clear(); for (const auto& textureFilename : bathTextures) { @@ -347,7 +352,7 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, Logger::Get().Log("Failed to load texture: " + std::string(textureFilename.begin(), textureFilename.end()), __FILE__, __LINE__, Logger::LogLevel::Error); return false; } - textures.push_back(texture); + BathTextures.diffuse.push_back(texture); } // Set the file name of the bath model. @@ -356,7 +361,7 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, // Create and initialize the bath model object. m_BathModel = new ModelClass; - result = m_BathModel->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textures); + result = m_BathModel->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, BathTextures); if (!result) { MessageBox(hwnd, L"Could not initialize the bath model object.", L"Error", MB_OK); @@ -370,6 +375,8 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, L"assets/Texture/water01.png" }; + TextureContainer WaterTextures; + textures.clear(); for (const auto& textureFilename : waterTextures) { @@ -380,13 +387,13 @@ bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd, Logger::Get().Log("Failed to load texture: " + std::string(textureFilename.begin(), textureFilename.end()), __FILE__, __LINE__, Logger::LogLevel::Error); return false; } - textures.push_back(texture); + WaterTextures.diffuse.push_back(texture); } // Create and initialize the water model object. m_WaterModel = new ModelClass; - result = m_WaterModel->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textures); + result = m_WaterModel->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, WaterTextures); if (!result) { MessageBox(hwnd, L"Could not initialize the water model object.", L"Error", MB_OK); @@ -890,7 +897,7 @@ bool ApplicationClass::RenderRefractionToTexture() m_BathModel->Render(m_Direct3D->GetDeviceContext()); result = m_ShaderManager->RenderRefractionShader(m_Direct3D->GetDeviceContext(), m_BathModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, - m_BathModel->GetTexture(0), m_Lights[0]->GetDirection(), ambientColor, diffuseColor, lightPosition, clipPlane); + m_BathModel->GetTexture(TextureType::Diffuse,0), m_Lights[0]->GetDirection(), ambientColor, diffuseColor, lightPosition, clipPlane); if (!result) { return false; @@ -946,7 +953,7 @@ bool ApplicationClass::RenderSceneToTexture(float rotation) m_Model->Render(m_Direct3D->GetDeviceContext()); result = m_ShaderManager->RenderTextureShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, - m_Model->GetTexture(0)); + m_Model->GetTexture(TextureType::Diffuse,0)); if (!result) { return false; @@ -1026,7 +1033,7 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z, float t m_Model->Render(m_Direct3D->GetDeviceContext()); // Render the model using the light shader. - result = m_ShaderManager->RenderlightShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0), + result = m_ShaderManager->RenderlightShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(TextureType::Diffuse,0), diffuseColor, lightPosition, ambientColor); UpdateSkyboxPosition(); // Update the position of the skybox to match the camera position. @@ -1061,7 +1068,7 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z, float t // Render the bath model using the light shader. result = m_ShaderManager->RenderlightShader(m_Direct3D->GetDeviceContext(), m_BathModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, - m_BathModel->GetTexture(0), diffuseColor, lightPosition, ambientColor); + m_BathModel->GetTexture(TextureType::Diffuse,0), diffuseColor, lightPosition, ambientColor); if (!result) { return false; @@ -1081,7 +1088,7 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z, float t // Render the water model using the water shader. result = m_ShaderManager->RenderWaterShader(m_Direct3D->GetDeviceContext(), m_WaterModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, reflectionMatrix, - m_ReflectionTexture->GetShaderResourceView(), m_RefractionTexture->GetShaderResourceView(), m_WaterModel->GetTexture(0), + m_ReflectionTexture->GetShaderResourceView(), m_RefractionTexture->GetShaderResourceView(), m_WaterModel->GetTexture(TextureType::Diffuse,0), m_waterTranslation, 0.01f); if (!result) { @@ -1152,178 +1159,19 @@ bool ApplicationClass::Render(float rotation, float x, float y, float z, float t // turn on the Z buffer m_Direct3D->TurnZBufferOn(); - - // Render the model using the multitexture shader. - m_Model->Render(m_Direct3D->GetDeviceContext()); - - 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. - - // Multiply the scale, rotation, and translation matrices together to create the final world transformation matrix. - srMatrix = XMMatrixMultiply(scaleMatrix, rotateMatrix); - worldMatrix = XMMatrixMultiply(srMatrix, translateMatrix); - + // 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(); } - - // 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) - { - Logger::Get().Log("Could not render the model using the alpha map shader", __FILE__, __LINE__, Logger::LogLevel::Error); - 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) - { - Logger::Get().Log("Could not render the model using the texture shader", __FILE__, __LINE__, Logger::LogLevel::Error); - 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[0]->GetDirection(), m_Lights[0]->GetDiffuseColor()); - if (!result) - { - Logger::Get().Log("Could not render the model using the normal map shader", __FILE__, __LINE__, Logger::LogLevel::Error); - 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) - { - Logger::Get().Log("Could not render the model using the multitexture shader", __FILE__, __LINE__, Logger::LogLevel::Error); - 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) - { - Logger::Get().Log("Could not render the model using the translate shader", __FILE__, __LINE__, Logger::LogLevel::Error); - 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[0]->GetDirection(), m_Lights[0]->GetDiffuseColor(), - m_Camera->GetPosition(), m_Lights[0]->GetSpecularColor(), m_Lights[0]->GetSpecularPower()); - if (!result) - { - Logger::Get().Log("Could not render the model using the specular map shader", __FILE__, __LINE__, Logger::LogLevel::Error); - return false; - } - - // Setup matrices. - rotateMatrix = XMMatrixRotationY(rotation); - translateMatrix = XMMatrixTranslation(-10.0f, -5.0f, -20.0f); - worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix); - - // Render the model using the transparent shader. - m_Model->Render(m_Direct3D->GetDeviceContext()); - - result = m_ShaderManager->RenderTransparentShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0), blendAmount); - if (!result) - { - Logger::Get().Log("Could not render the model using the transparent shader", __FILE__, __LINE__, Logger::LogLevel::Error); - return false; - } - - // Setup matrices. - rotateMatrix = XMMatrixRotationY(rotation); - translateMatrix = XMMatrixTranslation(-10.0f, -2.0f, -20.0f); - worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix); - - // Render the model using the transparent shader. - m_Model->Render(m_Direct3D->GetDeviceContext()); - - result = m_ShaderManager->RenderlightShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0), diffuseColor, lightPosition, ambientColor); - if (!result) - { - return false; - } - - // Setup matrices. - rotateMatrix = XMMatrixRotationY(rotation); - translateMatrix = XMMatrixTranslation(-10.0f, 1.0f, -20.0f); - worldMatrix = XMMatrixMultiply(rotateMatrix, translateMatrix); - - // Render the model using the transparent shader. - m_Model->Render(m_Direct3D->GetDeviceContext()); - - result = m_ShaderManager->RenderlightMapShader(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0), m_Model->GetTexture(4)); - if (!result) - { - return false; - } - - // Enable the Z buffer and disable alpha blending now that 2D rendering is complete. // Réinitialiser la cible de rendu au back buffer. m_Direct3D->SetBackBufferRenderTarget(); - m_Direct3D->TurnZBufferOn(); - m_Direct3D->DisableAlphaBlending(); - - return true; } @@ -1368,11 +1216,10 @@ void ApplicationClass::GenerateTerrain() L"assets/Texture/BricksGLOSS2K.png" }; - - textures.clear(); + TextureContainer TerrainTextures; + int i = 0; for (const auto& textureFilename : terrainTexture) { - ID3D11ShaderResourceView* texture = nullptr; HRESULT result = DirectX::CreateWICTextureFromFile(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), textureFilename.c_str(), nullptr, &texture); if (FAILED(result)) @@ -1391,7 +1238,9 @@ void ApplicationClass::GenerateTerrain() __FILE__, __LINE__, Logger::LogLevel::Error); return ; // Assurez-vous de retourner false ou de gérer l'erreur de manière appropriée } - textures.push_back(texture); + TerrainTextures.AssignTexture(TerrainTextures, texture, i); + i++; + // log success message Logger::Get().Log("Texture loaded: " + std::string(textureFilename.begin(), textureFilename.end()), __FILE__, __LINE__, Logger::LogLevel::Initialize); @@ -1408,7 +1257,7 @@ void ApplicationClass::GenerateTerrain() for (int j = 0; j < 20; j++) { Object* newTerrain = new Object(); - newTerrain->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textures); + newTerrain->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, TerrainTextures); newTerrain->SetScaleMatrix(scaleMatrix); newTerrain->SetTranslateMatrix(XMMatrixTranslation(i / 2 * scaleX , -12.0f, j * scaleZ)); newTerrain->SetName(filenameWithoutExtension); @@ -1437,14 +1286,16 @@ void ApplicationClass::AddKobject(std::wstring& filepath) filesystem::current_path(m_WFolder); + TextureContainer KobjectsTextures; + // Liste des fichiers de texture std::vector kobjTexture = { L"assets/Texture/Bricks2K.png", L"assets/Texture/BricksNRM2K.png", - L"assets/Texture/EmptyTexture.png" + L"assets/Texture/BricksGLOSS2K.png" }; - textures.clear(); + int i = 0; for (const auto& textureFilename : kobjTexture) { ID3D11ShaderResourceView* texture = nullptr; @@ -1453,11 +1304,13 @@ void ApplicationClass::AddKobject(std::wstring& filepath) { // Handle error } - textures.push_back(texture); + KobjectsTextures.AssignTexture(KobjectsTextures, texture, i); + i++; + } Object* newObject = new Object(); - newObject->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textures); + newObject->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, KobjectsTextures); newObject->SetMass(1.0f); newObject->SetTranslateMatrix(XMMatrixTranslation(0.0f, 50.0f, 0.0f)); newObject->SetName(filename); @@ -1469,7 +1322,7 @@ void ApplicationClass::AddKobject(std::wstring& filepath) m_object.push_back(newObject); // Vérifiez que l'objet a bien reçu les textures - if (newObject->GetTexture(0) == nullptr) + if (newObject->GetTexture(TextureType::Diffuse,0) == nullptr) { Logger::Get().Log("Object texture is null after initialization", __FILE__, __LINE__, Logger::LogLevel::Error); } @@ -1491,8 +1344,9 @@ void ApplicationClass::AddCube() L"assets/Texture/Bricks2K.png" }; - - textures.clear(); + TextureContainer CubeTexture; + int i = 0; + for (const auto& textureFilename : cubeTexture) { ID3D11ShaderResourceView* texture = nullptr; @@ -1502,13 +1356,14 @@ void ApplicationClass::AddCube() Logger::Get().Log("Failed to load texture: " + std::string(textureFilename.begin(), textureFilename.end()), __FILE__, __LINE__, Logger::LogLevel::Error); return; } - textures.push_back(texture); + CubeTexture.AssignTexture(CubeTexture, texture, i); + i++; } static int cubeCount = 0; float position = cubeCount * 2.0f; Object* newCube = new Object(); - newCube->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textures); + newCube->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, CubeTexture); newCube->SetTranslateMatrix(XMMatrixTranslation(position, 0.0f, 0.0f)); @@ -1789,7 +1644,8 @@ bool ApplicationClass::RenderPass(const std::vectorTurnZBufferOff(); } @@ -1846,9 +1702,9 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), - object->GetTexture(5), - object->GetTexture(3) + object->GetTexture(TextureType::Diffuse,0), + object->GetTexture(TextureType::Diffuse,1), + object->GetTexture(TextureType::Alpha,0) ); if (!result) { @@ -1866,7 +1722,7 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), + object->GetTexture(TextureType::Diffuse,0), m_SunLight->GetDiffuseColor(), m_SunLight->GetAmbientColor(), m_SunLight->GetDirection(), @@ -1886,8 +1742,8 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), - object->GetTexture(1), + object->GetTexture(TextureType::Diffuse,0), + object->GetTexture(TextureType::Normal,0), m_Lights[0]->GetDirection(), m_Lights[0]->GetDiffuseColor() ); @@ -1905,9 +1761,9 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), - object->GetTexture(1), - object->GetTexture(2), + object->GetTexture(TextureType::Diffuse,0), + object->GetTexture(TextureType::Normal,0), + object->GetTexture(TextureType::Specular,0), m_Lights[0]->GetDirection(), m_Lights[0]->GetDiffuseColor(), m_Camera->GetPosition(), @@ -1928,7 +1784,7 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0) + object->GetTexture(TextureType::Diffuse,0) ); if (!result) { @@ -1944,7 +1800,7 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), + object->GetTexture(TextureType::Diffuse,0), diffuse, position, ambient @@ -1963,7 +1819,7 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), + object->GetTexture(TextureType::Diffuse,0), m_SunLight->GetDiffuseColor(), m_SunLight->GetAmbientColor(), m_SunLight->GetDirection(), @@ -1983,7 +1839,7 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), + object->GetTexture(TextureType::Diffuse,0), m_SunLight->GetDiffuseColor(), m_SunLight->GetAmbientColor(), m_SunLight->GetDirection(), @@ -2002,7 +1858,7 @@ bool ApplicationClass::RenderPass(const std::vectorGetTexture(0), + object->GetTexture(TextureType::Diffuse,0), diffuse, position, ambient @@ -2015,7 +1871,13 @@ bool ApplicationClass::RenderPass(const std::vectorTurnZBufferOn(); + } } + SetRenderCount(renderCount); diff --git a/enginecustom/src/src/system/imguiManager.cpp b/enginecustom/src/src/system/imguiManager.cpp index 43be80d..31535eb 100644 --- a/enginecustom/src/src/system/imguiManager.cpp +++ b/enginecustom/src/src/system/imguiManager.cpp @@ -272,69 +272,116 @@ void imguiManager::WidgetObjectWindow(ApplicationClass* app) object->SetScale(XMVectorSet(scl[0], scl[1], scl[2], 0.0f)); } - ImGui::Separator(); + ImGui::Separator(); - // Texture - // add all texture category names to a vector - std::vector textureCategories = { - "Diffuse", - "Normal", - "Specular", - "Reflection", - "Refraction" - }; + // Définir les types de textures + std::vector textureCategories = { + "Diffuse", "Normal", "Specular", "Alpha" + }; - // Display all images - ImGui::BeginChild("TextureChild", ImVec2(0, 100), false, ImGuiWindowFlags_HorizontalScrollbar); - for (int count = 0; count < textureCategories.size(); count++) - { - std::string textureLabel = "Texture##" + std::to_string(index) + "##" + std::to_string(count); - ID3D11ShaderResourceView* texture = object->GetTexture(count); - if (texture != nullptr) - { - ImGui::Text(textureCategories[count].c_str()); - ImGui::SameLine(); + std::vector textureTypes = { + TextureType::Diffuse, TextureType::Normal, + TextureType::Specular, TextureType::Alpha + }; - std::string buttonLabel = "button " + std::to_string(count); - if (ImGui::ImageButton(buttonLabel.c_str(), (ImTextureID)texture, ImVec2(64, 64))) - { - // Open file dialog - OPENFILENAME ofn; - WCHAR szFile[260]; - ZeroMemory(&ofn, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = NULL; - ofn.lpstrFile = szFile; - szFile[0] = '\0'; - ofn.nMaxFile = sizeof(szFile); - ofn.lpstrFilter = L"Texture\0*.png\0"; - ofn.nFilterIndex = 1; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.lpstrInitialDir = NULL; - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + // Créer un espace pour afficher les textures avec défilement + ImGui::BeginChild("TextureChild", ImVec2(0, 200), true, ImGuiWindowFlags_HorizontalScrollbar); + + // Pour chaque type de texture + for (int typeIndex = 0; typeIndex < textureCategories.size(); typeIndex++) + { + TextureType type = textureTypes[typeIndex]; + std::string typeName = textureCategories[typeIndex]; + + // Afficher le titre de la catégorie + ImGui::Text("%s:", typeName.c_str()); + ImGui::SameLine(); - if (GetOpenFileName(&ofn)) - { - // Load the selected texture - object->ChangeTexture(m_device, m_deviceContext, ofn.lpstrFile, count); - } - } + // Compter combien de textures de ce type existent + int textureCount = 0; + while (object->GetTexture(type, textureCount) != nullptr) + { + textureCount++; + } - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Image((ImTextureID)texture, ImVec2(256, 256)); - ImGui::EndTooltip(); - } + // Afficher toutes les textures existantes + ImGui::BeginGroup(); + for (int texIndex = 0; texIndex < textureCount; texIndex++) + { + ID3D11ShaderResourceView* texture = object->GetTexture(type, texIndex); + if (texture) + { + // ID unique pour chaque bouton de texture + std::string buttonId = "tex##" + std::to_string(index) + "_" + + std::to_string(typeIndex) + "_" + + std::to_string(texIndex); + + if (ImGui::ImageButton(buttonId.c_str(), (ImTextureID)texture, ImVec2(48, 48))) + { + // Ouvrir une boîte de dialogue pour changer la texture + OPENFILENAME ofn; + WCHAR szFile[260]; + ZeroMemory(&ofn, sizeof(ofn)); + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = NULL; + ofn.lpstrFile = szFile; + szFile[0] = '\0'; + ofn.nMaxFile = sizeof(szFile); + ofn.lpstrFilter = L"Texture\0*.png;*.jpg;*.dds\0"; + ofn.nFilterIndex = 1; + ofn.lpstrInitialDir = NULL; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - if (count < textureCategories.size() - 1) - { - ImGui::SameLine(); - } - } - } - ImGui::EndChild(); + if (GetOpenFileName(&ofn)) + { + // Changer la texture existante + object->ChangeTexture(m_device, m_deviceContext, ofn.lpstrFile, type, texIndex); + } + } + + // Afficher l'indice de texture et prévisualisation au survol + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::Text("%s %d", typeName.c_str(), texIndex); + ImGui::Image((ImTextureID)texture, ImVec2(192, 192)); + ImGui::EndTooltip(); + } + + ImGui::SameLine(); + } + } + + // Bouton pour ajouter une nouvelle texture + std::string addButtonLabel = "+##" + std::to_string(index) + "_" + std::to_string(typeIndex); + if (ImGui::Button(addButtonLabel.c_str(), ImVec2(48, 48))) + { + // Ouvrir une boîte de dialogue pour ajouter une texture + OPENFILENAME ofn; + WCHAR szFile[260]; + ZeroMemory(&ofn, sizeof(ofn)); + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = NULL; + ofn.lpstrFile = szFile; + szFile[0] = '\0'; + ofn.nMaxFile = sizeof(szFile); + ofn.lpstrFilter = L"Texture\0*.png;*.jpg;*.dds\0"; + ofn.nFilterIndex = 1; + ofn.lpstrInitialDir = NULL; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + + if (GetOpenFileName(&ofn)) + { + // Ajouter une nouvelle texture + object->AddTexture(m_device, m_deviceContext, ofn.lpstrFile, type); + } + } + + ImGui::EndGroup(); + ImGui::Separator(); + } + + ImGui::EndChild(); ImGui::Separator(); diff --git a/enginecustom/src/src/system/modelclass.cpp b/enginecustom/src/src/system/modelclass.cpp index 7b53b56..38c231a 100644 --- a/enginecustom/src/src/system/modelclass.cpp +++ b/enginecustom/src/src/system/modelclass.cpp @@ -18,8 +18,41 @@ ModelClass::~ModelClass() { } -bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* modelFilename, std::vector textures) { - Logger::Get().Log("Initializing model class with preloaded textures", __FILE__, __LINE__, Logger::LogLevel::Initialize); +// bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* modelFilename, std::vector textures) { +// Logger::Get().Log("Initializing model class with preloaded textures (vector)", __FILE__, __LINE__, Logger::LogLevel::Initialize); +// +// bool result = Initialize(device, deviceContext, modelFilename); +// if (!result) { +// return false; +// } +// +// // Ajouter toutes les textures au container comme textures diffuses +// for (auto& tex : textures) { +// m_Textures.diffuse.push_back(tex); +// } +// +// return true; +// } + +bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* modelFilename, const TextureContainer& textures) { + Logger::Get().Log("Initializing model class with preloaded texture container", __FILE__, __LINE__, Logger::LogLevel::Initialize); + + bool result = Initialize(device, deviceContext, modelFilename); + if (!result) { + return false; + } + + // Copie de toutes les textures de la structure + for (auto& tex : textures.diffuse) m_Textures.diffuse.push_back(tex); + for (auto& tex : textures.normal) m_Textures.normal.push_back(tex); + for (auto& tex : textures.specular) m_Textures.specular.push_back(tex); + for (auto& tex : textures.alpha) m_Textures.alpha.push_back(tex); + + return true; +} + +bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* modelFilename) { + Logger::Get().Log("Initializing model class without textures", __FILE__, __LINE__, Logger::LogLevel::Initialize); bool result; @@ -40,14 +73,11 @@ bool ModelClass::Initialize(ID3D11Device* device, ID3D11DeviceContext* deviceCon return false; } - m_Textures = textures; - - Logger::Get().Log("Model class initialized with preloaded textures", __FILE__, __LINE__, Logger::LogLevel::Initialize); + Logger::Get().Log("Model class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize); return true; } - void ModelClass::Shutdown() { // Release the model textures. @@ -77,11 +107,13 @@ int ModelClass::GetIndexCount() return m_indexCount; } -ID3D11ShaderResourceView* ModelClass::GetTexture(int index) const { - if (index >= 0 && index < m_Textures.size()) { - return m_Textures[index]; - } - return nullptr; // Retourne nullptr si l'index est hors limites +// ID3D11ShaderResourceView* ModelClass::GetTexture(int index) const { +// // Pour compatibilité, utilise la texture diffuse par défaut +// return m_Textures.GetTexture(TextureType::Diffuse, index); +// } + +ID3D11ShaderResourceView* ModelClass::GetTexture(TextureType type, int index) const { + return m_Textures.GetTexture(type, index); } bool ModelClass::InitializeBuffers(ID3D11Device* device) @@ -216,19 +248,10 @@ void ModelClass::RenderBuffers(ID3D11DeviceContext* deviceContext) void ModelClass::ReleaseTextures() { Logger::Get().Log("Releasing textures", __FILE__, __LINE__); - - // Release the texture object array. - for (auto& texture : m_Textures) - { - if (texture) - { - texture->Release(); - texture = nullptr; - } - } - - m_Textures.clear(); - + + // Utilise la méthode ReleaseAll de TextureContainer + m_Textures.ReleaseAll(); + Logger::Get().Log("Textures released", __FILE__, __LINE__); } @@ -551,41 +574,71 @@ void ModelClass::ReleaseModel() return; } -bool ModelClass::ChangeTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, std::wstring filename, int index) -{ +// bool ModelClass::ChangeTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, std::wstring filename, int index) { +// // Pour compatibilité, utilise la texture diffuse par défaut +// return ChangeTexture(device, deviceContext, filename, TextureType::Diffuse, index); +// } + +bool ModelClass::ChangeTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, std::wstring filename, TextureType type, int index) { Logger::Get().Log("Changing texture", __FILE__, __LINE__, Logger::LogLevel::Initialize); HRESULT result; ID3D11ShaderResourceView* newTexture = nullptr; - // Load the new texture using WICTextureLoader. + // Charger la nouvelle texture result = DirectX::CreateWICTextureFromFile(device, deviceContext, filename.c_str(), nullptr, &newTexture); - if (FAILED(result)) - { - Logger::Get().Log("Failed to load new texture", __FILE__, __LINE__, Logger::LogLevel::Error); + if (FAILED(result)) { + Logger::Get().Log("Failed to load texture: " + std::string(filename.begin(), filename.end()), __FILE__, __LINE__, Logger::LogLevel::Error); return false; } - // Release the old texture if it exists. - if (index >= 0 && index < m_Textures.size() && m_Textures[index]) - { - m_Textures[index]->Release(); - m_Textures[index] = nullptr; + // Récupérer le vecteur correspondant au type de texture + auto& textureVector = m_Textures.Get(type); + + // Si l'index est hors limites, redimensionner le vecteur + if (index >= textureVector.size()) { + textureVector.resize(index + 1, nullptr); } - // Assign the new texture to the specified index. - if (index >= 0 && index < m_Textures.size()) - { - m_Textures[index] = newTexture; - } - else - { - // If the index is out of range, log an error and release the new texture. - Logger::Get().Log("Texture index out of range", __FILE__, __LINE__, Logger::LogLevel::Error); - newTexture->Release(); - return false; + // Libérer l'ancienne texture si elle existe + if (textureVector[index]) { + textureVector[index]->Release(); } + // Assigner la nouvelle texture + textureVector[index] = newTexture; + Logger::Get().Log("Texture changed successfully", __FILE__, __LINE__, Logger::LogLevel::Initialize); return true; +} + +bool ModelClass::AddTexture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, std::wstring filename, TextureType type) { + Logger::Get().Log("Adding texture", __FILE__, __LINE__, Logger::LogLevel::Initialize); + + HRESULT result; + ID3D11ShaderResourceView* newTexture = nullptr; + + // Charger la nouvelle texture + result = DirectX::CreateWICTextureFromFile(device, deviceContext, filename.c_str(), nullptr, &newTexture); + if (FAILED(result)) { + Logger::Get().Log("Failed to load texture: " + std::string(filename.begin(), filename.end()), __FILE__, __LINE__, Logger::LogLevel::Error); + return false; + } + + // Ajouter la texture au vecteur correspondant + m_Textures.Get(type).push_back(newTexture); + + Logger::Get().Log("Texture added successfully", __FILE__, __LINE__, Logger::LogLevel::Initialize); + return true; +} + +bool ModelClass::AddTexture(ID3D11ShaderResourceView* texture, TextureType type) { + if (!texture) { + Logger::Get().Log("Cannot add null texture", __FILE__, __LINE__, Logger::LogLevel::Error); + return false; + } + + // Ajouter la texture au vecteur correspondant + m_Textures.Get(type).push_back(texture); + return true; } \ No newline at end of file