diff --git a/include/Nazara/Renderer/Material.hpp b/include/Nazara/Renderer/Material.hpp index 1421a8371..7daa0ca53 100644 --- a/include/Nazara/Renderer/Material.hpp +++ b/include/Nazara/Renderer/Material.hpp @@ -40,6 +40,7 @@ using NzMaterialRef = NzResourceRef; class NAZARA_API NzMaterial : public NzResource { friend NzMaterialLoader; + friend class NzRenderer; public: NzMaterial(); @@ -120,6 +121,9 @@ class NAZARA_API NzMaterial : public NzResource private: void Copy(const NzMaterial& material); + static bool Initialize(); + static void Uninitialize(); + nzUInt32 m_shaderFlags; NzColor m_ambientColor; NzColor m_diffuseColor; @@ -137,6 +141,7 @@ class NAZARA_API NzMaterial : public NzResource bool m_lightingEnabled; float m_shininess; + static NzMaterial* s_defaultMaterial; static NzMaterialLoader::LoaderList s_loaders; }; diff --git a/src/Nazara/Renderer/Material.cpp b/src/Nazara/Renderer/Material.cpp index 995bad685..0055d2e6d 100644 --- a/src/Nazara/Renderer/Material.cpp +++ b/src/Nazara/Renderer/Material.cpp @@ -575,19 +575,7 @@ NzMaterial& NzMaterial::operator=(NzMaterial&& material) NzMaterial* NzMaterial::GetDefault() { - static NzMaterial defaultMaterial; - static bool initialized = false; - - if (!initialized) - { - defaultMaterial.EnableLighting(false); - defaultMaterial.SetDiffuseColor(NzColor::White); - defaultMaterial.SetFaceFilling(nzFaceFilling_Line); - - initialized = true; - } - - return &defaultMaterial; + return s_defaultMaterial; } void NzMaterial::Copy(const NzMaterial& material) @@ -619,4 +607,18 @@ void NzMaterial::Copy(const NzMaterial& material) m_specularMap = material.m_specularMap; } +bool NzMaterial::Initialize() +{ + s_defaultMaterial = new NzMaterial; + + return true; +} + +void NzMaterial::Uninitialize() +{ + delete s_defaultMaterial; + s_defaultMaterial = nullptr; +} + +NzMaterial* NzMaterial::s_defaultMaterial = nullptr; NzMaterialLoader::LoaderList NzMaterial::s_loaders; diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 2d5dfcfde..99434624a 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -755,6 +755,14 @@ bool NzRenderer::Initialize() s_quadBuffer = new NzVertexBuffer(declaration.get(), 4, nzBufferStorage_Hardware, nzBufferUsage_Dynamic); declaration.release(); + if (!NzMaterial::Initialize()) + { + NazaraError("Failed to initialize materials"); + Uninitialize(); + + return false; + } + if (!NzShaderBuilder::Initialize()) { NazaraError("Failed to initialize shader builder"); @@ -1293,6 +1301,7 @@ void NzRenderer::Uninitialize() NzLoaders_Texture_Unregister(); NzDebugDrawer::Uninitialize(); + NzMaterial::Uninitialize(); NzShaderBuilder::Uninitialize(); NzTextureSampler::Uninitialize(); @@ -1387,6 +1396,7 @@ bool NzRenderer::EnsureStateUpdate() { TextureUnit& unit = s_textureUnits[i]; + ///FIXME: Cet appel ne fait-il pas redondance avec le rebinding des textures avant le return ? if (!unit.textureUpdated) { NzOpenGL::SetTextureUnit(i);