diff --git a/include/Nazara/Core/ObjectLibrary.hpp b/include/Nazara/Core/ObjectLibrary.hpp new file mode 100644 index 000000000..be9834560 --- /dev/null +++ b/include/Nazara/Core/ObjectLibrary.hpp @@ -0,0 +1,39 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_OBJECTLIBRARY_HPP +#define NAZARA_OBJECTLIBRARY_HPP + +#include +#include +#include +#include + +template +class NzObjectLibrary +{ + friend Type; + + public: + NzObjectLibrary() = delete; + ~NzObjectLibrary() = delete; + + static NzObjectRef Get(const NzString& name); + static bool Has(const NzString& name); + + static void Register(const NzString& name, NzObjectRef object); + static void Unregister(const NzString& name); + + private: + static bool Initialize(); + static void Uninitialize(); + + using LibraryMap = std::unordered_map>; +}; + +#include + +#endif // NAZARA_OBJECTLIBRARY_HPP diff --git a/include/Nazara/Core/ObjectLibrary.inl b/include/Nazara/Core/ObjectLibrary.inl new file mode 100644 index 000000000..2c46a3f45 --- /dev/null +++ b/include/Nazara/Core/ObjectLibrary.inl @@ -0,0 +1,51 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzObjectRef NzObjectLibrary::Get(const NzString& name) +{ + auto it = Type::s_library.find(name); + if (it != Type::s_library.end()) + return it->second; + else + { + NazaraError("Object \"" + name + "\" is not present"); + return nullptr; + } +} + +template +bool NzObjectLibrary::Has(const NzString& name) +{ + return Type::s_library.find(name) != Type::s_library.end(); +} + +template +void NzObjectLibrary::Register(const NzString& name, NzObjectRef object) +{ + Type::s_library.emplace(name, object); +} + +template +void NzObjectLibrary::Unregister(const NzString& name) +{ + Type::s_library.erase(name); +} + +template +bool NzObjectLibrary::Initialize() +{ + return true; // Que faire +} + +template +void NzObjectLibrary::Uninitialize() +{ + Type::s_library.clear(); +} + +#include diff --git a/include/Nazara/Renderer.hpp b/include/Nazara/Renderer.hpp index f574fccbe..1009a48f7 100644 --- a/include/Nazara/Renderer.hpp +++ b/include/Nazara/Renderer.hpp @@ -44,14 +44,12 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include #endif // NAZARA_GLOBAL_RENDERER_HPP diff --git a/include/Nazara/Renderer/Shader.hpp b/include/Nazara/Renderer/Shader.hpp index aae8c8854..ecb1ac003 100644 --- a/include/Nazara/Renderer/Shader.hpp +++ b/include/Nazara/Renderer/Shader.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -26,11 +27,13 @@ class NzShaderStage; using NzShaderConstListener = NzObjectListenerWrapper; using NzShaderConstRef = NzObjectRef; +using NzShaderLibrary = NzObjectLibrary; using NzShaderListener = NzObjectListenerWrapper; using NzShaderRef = NzObjectRef; class NAZARA_API NzShader : public NzRefCounted, NzNonCopyable { + friend NzShaderLibrary; friend class NzRenderer; public: @@ -102,10 +105,15 @@ class NAZARA_API NzShader : public NzRefCounted, NzNonCopyable private: bool PostLinkage(); + static bool Initialize(); + static void Uninitialize(); + std::vector m_attachedShaders[nzShaderStage_Max+1]; bool m_linked; int m_uniformLocations[nzShaderUniform_Max+1]; unsigned int m_program; + + static NzShaderLibrary::LibraryMap s_library; }; #include diff --git a/include/Nazara/Renderer/ShaderLibrary.hpp b/include/Nazara/Renderer/ShaderLibrary.hpp deleted file mode 100644 index 859be77af..000000000 --- a/include/Nazara/Renderer/ShaderLibrary.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Renderer module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NAZARA_SHADERLIBRARY_HPP -#define NAZARA_SHADERLIBRARY_HPP - -#include -#include -#include -#include - -class NAZARA_API NzShaderLibrary -{ - friend class NzRenderer; - - public: - NzShaderLibrary() = delete; - ~NzShaderLibrary() = delete; - - static NzShader* Get(const NzString& name); - static bool Has(const NzString& name); - - static void Register(const NzString& name, NzShader* shader); - static void Unregister(const NzString& name); - - private: - static bool Initialize(); - static void Uninitialize(); - - static std::unordered_map s_library; -}; - -#endif // NAZARA_SHADERLIBRARY_HPP diff --git a/include/Nazara/Renderer/UberShader.hpp b/include/Nazara/Renderer/UberShader.hpp index 28a49ab0c..8df9f54f0 100644 --- a/include/Nazara/Renderer/UberShader.hpp +++ b/include/Nazara/Renderer/UberShader.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -19,16 +20,26 @@ class NzUberShader; using NzUberShaderConstListener = NzObjectListenerWrapper; using NzUberShaderConstRef = NzObjectRef; +using NzUberShaderLibrary = NzObjectLibrary; using NzUberShaderListener = NzObjectListenerWrapper; using NzUberShaderRef = NzObjectRef; class NAZARA_API NzUberShader : public NzRefCounted { + friend NzUberShaderLibrary; + friend class NzRenderer; + public: NzUberShader() = default; virtual ~NzUberShader(); virtual NzUberShaderInstance* Get(const NzParameterList& parameters) const = 0; + + private: + static bool Initialize(); + static void Uninitialize(); + + static NzUberShaderLibrary::LibraryMap s_library; }; #endif // NAZARA_UBERSHADER_HPP diff --git a/include/Nazara/Renderer/UberShaderLibrary.hpp b/include/Nazara/Renderer/UberShaderLibrary.hpp deleted file mode 100644 index 8a52da284..000000000 --- a/include/Nazara/Renderer/UberShaderLibrary.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Renderer module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NAZARA_UBERSHADERLIBRARY_HPP -#define NAZARA_UBERSHADERLIBRARY_HPP - -#include -#include -#include -#include - -class NAZARA_API NzUberShaderLibrary -{ - friend class NzRenderer; - - public: - NzUberShaderLibrary() = delete; - ~NzUberShaderLibrary() = delete; - - static NzUberShader* Get(const NzString& name); - static bool Has(const NzString& name); - - static void Register(const NzString& name, NzUberShader* uberShader); - static void Unregister(const NzString& name); - - private: - static bool Initialize(); - static void Uninitialize(); - - static std::unordered_map s_library; -}; - -#endif // NAZARA_UBERSHADERLIBRARY_HPP diff --git a/src/Nazara/Graphics/ColorBackground.cpp b/src/Nazara/Graphics/ColorBackground.cpp index 5428873fb..55c270a63 100644 --- a/src/Nazara/Graphics/ColorBackground.cpp +++ b/src/Nazara/Graphics/ColorBackground.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include diff --git a/src/Nazara/Graphics/DeferredBloomPass.cpp b/src/Nazara/Graphics/DeferredBloomPass.cpp index bae3ae973..045a58094 100644 --- a/src/Nazara/Graphics/DeferredBloomPass.cpp +++ b/src/Nazara/Graphics/DeferredBloomPass.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include diff --git a/src/Nazara/Graphics/DeferredDOFPass.cpp b/src/Nazara/Graphics/DeferredDOFPass.cpp index d898cd66d..bdc438820 100644 --- a/src/Nazara/Graphics/DeferredDOFPass.cpp +++ b/src/Nazara/Graphics/DeferredDOFPass.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include diff --git a/src/Nazara/Graphics/DeferredFXAAPass.cpp b/src/Nazara/Graphics/DeferredFXAAPass.cpp index 929a23453..0dac6fe16 100644 --- a/src/Nazara/Graphics/DeferredFXAAPass.cpp +++ b/src/Nazara/Graphics/DeferredFXAAPass.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include diff --git a/src/Nazara/Graphics/DeferredFinalPass.cpp b/src/Nazara/Graphics/DeferredFinalPass.cpp index a44bbd6d9..bbf73309f 100644 --- a/src/Nazara/Graphics/DeferredFinalPass.cpp +++ b/src/Nazara/Graphics/DeferredFinalPass.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include diff --git a/src/Nazara/Graphics/DeferredGeometryPass.cpp b/src/Nazara/Graphics/DeferredGeometryPass.cpp index 0b2616cc4..4600213b3 100644 --- a/src/Nazara/Graphics/DeferredGeometryPass.cpp +++ b/src/Nazara/Graphics/DeferredGeometryPass.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp index cddb54917..1e7a306ae 100644 --- a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp +++ b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/src/Nazara/Graphics/DeferredRenderTechnique.cpp b/src/Nazara/Graphics/DeferredRenderTechnique.cpp index 73c887fe8..51d609325 100644 --- a/src/Nazara/Graphics/DeferredRenderTechnique.cpp +++ b/src/Nazara/Graphics/DeferredRenderTechnique.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index f5b606a23..812afd886 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include diff --git a/src/Nazara/Graphics/TextureBackground.cpp b/src/Nazara/Graphics/TextureBackground.cpp index 38f501590..8db2a379a 100644 --- a/src/Nazara/Graphics/TextureBackground.cpp +++ b/src/Nazara/Graphics/TextureBackground.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include diff --git a/src/Nazara/Renderer/DebugDrawer.cpp b/src/Nazara/Renderer/DebugDrawer.cpp index f6822e9b9..c13bcfce1 100644 --- a/src/Nazara/Renderer/DebugDrawer.cpp +++ b/src/Nazara/Renderer/DebugDrawer.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index b3ea8f080..f71192b05 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -16,9 +16,8 @@ #include #include #include -#include #include -#include +#include #include #include #include @@ -865,9 +864,9 @@ bool NzRenderer::Initialize() } } - if (!NzShaderLibrary::Initialize()) + if (!NzShader::Initialize()) { - NazaraError("Failed to initialize shader library"); + NazaraError("Failed to initialize shaders"); return false; } @@ -877,9 +876,9 @@ bool NzRenderer::Initialize() return false; } - if (!NzUberShaderLibrary::Initialize()) + if (!NzUberShader::Initialize()) { - NazaraError("Failed to initialize uber shader library"); + NazaraError("Failed to initialize uber shaders"); return false; } @@ -1544,9 +1543,9 @@ void NzRenderer::Uninitialize() NzShaderLibrary::Unregister("DebugSimple"); - NzUberShaderLibrary::Uninitialize(); + NzUberShader::Uninitialize(); NzTextureSampler::Uninitialize(); - NzShaderLibrary::Uninitialize(); + NzShader::Uninitialize(); NzDebugDrawer::Uninitialize(); s_textureUnits.clear(); diff --git a/src/Nazara/Renderer/Shader.cpp b/src/Nazara/Renderer/Shader.cpp index 21fd03a55..d01f1eda2 100644 --- a/src/Nazara/Renderer/Shader.cpp +++ b/src/Nazara/Renderer/Shader.cpp @@ -787,3 +787,21 @@ bool NzShader::PostLinkage() return false; } } + +bool NzShader::Initialize() +{ + if (!NzShaderLibrary::Initialize()) + { + NazaraError("Failed to initialise library"); + return false; + } + + return true; +} + +void NzShader::Uninitialize() +{ + NzShaderLibrary::Uninitialize(); +} + +NzShaderLibrary::LibraryMap NzShader::s_library; diff --git a/src/Nazara/Renderer/ShaderLibrary.cpp b/src/Nazara/Renderer/ShaderLibrary.cpp deleted file mode 100644 index a474ae6d4..000000000 --- a/src/Nazara/Renderer/ShaderLibrary.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Renderer module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include -#include - -NzShader* NzShaderLibrary::Get(const NzString& name) -{ - auto it = s_library.find(name); - if (it != s_library.end()) - return it->second; - else - { - NazaraError("Shader \"" + name + "\" is not present"); - return nullptr; - } -} - -bool NzShaderLibrary::Has(const NzString& name) -{ - return s_library.find(name) != s_library.end(); -} - -void NzShaderLibrary::Register(const NzString& name, NzShader* shader) -{ - s_library.emplace(name, shader); - NazaraDebug("Shader \"" + name + "\" registred"); -} - -void NzShaderLibrary::Unregister(const NzString& name) -{ - s_library.erase(name); - NazaraDebug("Shader \"" + name + "\" unregistred"); -} - -bool NzShaderLibrary::Initialize() -{ - return true; // Que faire -} - -void NzShaderLibrary::Uninitialize() -{ - for (auto it : s_library) - NazaraWarning("Shader \"" + it.first + "\" has not been unregistred"); - - s_library.clear(); -} - -std::unordered_map NzShaderLibrary::s_library; diff --git a/src/Nazara/Renderer/UberShader.cpp b/src/Nazara/Renderer/UberShader.cpp index 6503a0450..ac2b23d3a 100644 --- a/src/Nazara/Renderer/UberShader.cpp +++ b/src/Nazara/Renderer/UberShader.cpp @@ -6,3 +6,21 @@ #include NzUberShader::~NzUberShader() = default; + +bool NzUberShader::Initialize() +{ + if (!NzUberShaderLibrary::Initialize()) + { + NazaraError("Failed to initialise library"); + return false; + } + + return true; +} + +void NzUberShader::Uninitialize() +{ + NzUberShaderLibrary::Uninitialize(); +} + +NzUberShaderLibrary::LibraryMap NzUberShader::s_library; diff --git a/src/Nazara/Renderer/UberShaderLibrary.cpp b/src/Nazara/Renderer/UberShaderLibrary.cpp deleted file mode 100644 index cb5ca9ba8..000000000 --- a/src/Nazara/Renderer/UberShaderLibrary.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Renderer module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include -#include - -NzUberShader* NzUberShaderLibrary::Get(const NzString& name) -{ - auto it = s_library.find(name); - if (it != s_library.end()) - return it->second; - else - { - NazaraError("UberShader \"" + name + "\" is not present"); - return nullptr; - } -} - -bool NzUberShaderLibrary::Has(const NzString& name) -{ - return s_library.find(name) != s_library.end(); -} - -void NzUberShaderLibrary::Register(const NzString& name, NzUberShader* uberShader) -{ - s_library.emplace(name, uberShader); - NazaraDebug("UberShader \"" + name + "\" registred"); -} - -void NzUberShaderLibrary::Unregister(const NzString& name) -{ - s_library.erase(name); - NazaraDebug("UberShader \"" + name + "\" unregistred"); -} - -bool NzUberShaderLibrary::Initialize() -{ - return true; // Que faire -} - -void NzUberShaderLibrary::Uninitialize() -{ - for (auto it : s_library) - NazaraWarning("UberShader \"" + it.first + "\" has not been unregistred"); - - s_library.clear(); -} - -std::unordered_map NzUberShaderLibrary::s_library;