Made Initialize/Uninitialize static methods from non-submodules private

Former-commit-id: 78dac32c8650dc9eb4fd2c7f0bece030012497cf
This commit is contained in:
Lynix 2014-04-21 00:08:34 +02:00
parent 082015fe5a
commit 7d99550925
9 changed files with 157 additions and 145 deletions

View File

@ -24,6 +24,8 @@
class NAZARA_API NzDeferredRenderTechnique : public NzAbstractRenderTechnique, public NzRenderTarget::Listener class NAZARA_API NzDeferredRenderTechnique : public NzAbstractRenderTechnique, public NzRenderTarget::Listener
{ {
friend class NzGraphics;
public: public:
NzDeferredRenderTechnique(); NzDeferredRenderTechnique();
~NzDeferredRenderTechnique(); ~NzDeferredRenderTechnique();
@ -49,13 +51,14 @@ class NAZARA_API NzDeferredRenderTechnique : public NzAbstractRenderTechnique, p
void SetPass(nzRenderPassType relativeTo, int position, NzDeferredRenderPass* pass); void SetPass(nzRenderPassType relativeTo, int position, NzDeferredRenderPass* pass);
static bool Initialize();
static bool IsSupported(); static bool IsSupported();
static void Uninitialize();
private: private:
bool Resize(const NzVector2ui& dimensions) const; bool Resize(const NzVector2ui& dimensions) const;
static bool Initialize();
static void Uninitialize();
struct RenderPassComparator struct RenderPassComparator
{ {
bool operator()(nzRenderPassType pass1, nzRenderPassType pass2); bool operator()(nzRenderPassType pass1, nzRenderPassType pass2);

View File

@ -41,7 +41,7 @@ using NzMaterialRef = NzResourceRef<NzMaterial>;
class NAZARA_API NzMaterial : public NzResource class NAZARA_API NzMaterial : public NzResource
{ {
friend NzMaterialLoader; friend NzMaterialLoader;
friend class NzRenderer; friend class NzGraphics;
public: public:
NzMaterial(); NzMaterial();
@ -129,9 +129,7 @@ class NAZARA_API NzMaterial : public NzResource
NzMaterial& operator=(const NzMaterial& material); NzMaterial& operator=(const NzMaterial& material);
NzMaterial& operator=(NzMaterial&& material); NzMaterial& operator=(NzMaterial&& material);
static bool Initialize();
static NzMaterial* GetDefault(); static NzMaterial* GetDefault();
static void Uninitialize();
private: private:
struct ShaderInstance struct ShaderInstance
@ -145,6 +143,9 @@ class NAZARA_API NzMaterial : public NzResource
void GenerateShader(nzUInt32 flags) const; void GenerateShader(nzUInt32 flags) const;
void InvalidateShaders(); void InvalidateShaders();
static bool Initialize();
static void Uninitialize();
NzColor m_ambientColor; NzColor m_ambientColor;
NzColor m_diffuseColor; NzColor m_diffuseColor;
NzColor m_specularColor; NzColor m_specularColor;

View File

@ -22,6 +22,7 @@ class NzContextImpl;
class NAZARA_API NzContext : public NzResource class NAZARA_API NzContext : public NzResource
{ {
friend NzContextImpl; friend NzContextImpl;
friend class NzOpenGL;
public: public:
NzContext() = default; NzContext() = default;
@ -39,10 +40,11 @@ class NAZARA_API NzContext : public NzResource
static const NzContext* GetCurrent(); static const NzContext* GetCurrent();
static const NzContext* GetReference(); static const NzContext* GetReference();
static const NzContext* GetThreadContext(); static const NzContext* GetThreadContext();
private:
static bool Initialize(); static bool Initialize();
static void Uninitialize(); static void Uninitialize();
private:
NzContextParameters m_parameters; NzContextParameters m_parameters;
NzContextImpl* m_impl = nullptr; NzContextImpl* m_impl = nullptr;

View File

@ -14,6 +14,8 @@
class NAZARA_API NzShaderLibrary class NAZARA_API NzShaderLibrary
{ {
friend class NzRenderer;
public: public:
NzShaderLibrary() = delete; NzShaderLibrary() = delete;
~NzShaderLibrary() = delete; ~NzShaderLibrary() = delete;
@ -21,12 +23,13 @@ class NAZARA_API NzShaderLibrary
static NzShader* Get(const NzString& name); static NzShader* Get(const NzString& name);
static bool Has(const NzString& name); static bool Has(const NzString& name);
static bool Initialize();
static void Register(const NzString& name, NzShader* shader); static void Register(const NzString& name, NzShader* shader);
static void Uninitialize();
static void Unregister(const NzString& name); static void Unregister(const NzString& name);
private: private:
static bool Initialize();
static void Uninitialize();
static std::unordered_map<NzString, NzShaderRef> s_library; static std::unordered_map<NzString, NzShaderRef> s_library;
}; };

View File

@ -14,6 +14,8 @@
class NAZARA_API NzUberShaderLibrary class NAZARA_API NzUberShaderLibrary
{ {
friend class NzRenderer;
public: public:
NzUberShaderLibrary() = delete; NzUberShaderLibrary() = delete;
~NzUberShaderLibrary() = delete; ~NzUberShaderLibrary() = delete;
@ -21,12 +23,13 @@ class NAZARA_API NzUberShaderLibrary
static NzUberShader* Get(const NzString& name); static NzUberShader* Get(const NzString& name);
static bool Has(const NzString& name); static bool Has(const NzString& name);
static bool Initialize();
static void Register(const NzString& name, NzUberShader* uberShader); static void Register(const NzString& name, NzUberShader* uberShader);
static void Uninitialize();
static void Unregister(const NzString& name); static void Unregister(const NzString& name);
private: private:
static bool Initialize();
static void Uninitialize();
static std::unordered_map<NzString, NzUberShaderRef> s_library; static std::unordered_map<NzString, NzUberShaderRef> s_library;
}; };

View File

@ -379,6 +379,37 @@ void NzDeferredRenderTechnique::SetPass(nzRenderPassType relativeTo, int positio
m_passes[relativeTo].erase(position); m_passes[relativeTo].erase(position);
} }
bool NzDeferredRenderTechnique::IsSupported()
{
// On ne va pas s'embêter à écrire un Deferred Renderer qui ne passe pas par le MRT, ce serait trop lent pour servir...
return NzOpenGL::GetGLSLVersion() >= 140 && // On ne va pas s'embêter non plus avec le mode de compatibilité
NzRenderer::HasCapability(nzRendererCap_RenderTexture) &&
NzRenderer::HasCapability(nzRendererCap_MultipleRenderTargets) &&
NzRenderer::GetMaxColorAttachments() >= 4 &&
NzRenderer::GetMaxRenderTargets() >= 4;
}
bool NzDeferredRenderTechnique::Resize(const NzVector2ui& dimensions) const
{
try
{
NzErrorFlags errFlags(nzErrorFlag_ThrowException);
for (auto& passIt : m_passes)
for (auto& passIt2 : passIt.second)
passIt2.second->Resize(dimensions);
m_GBufferSize = dimensions;
return true;
}
catch (const std::exception& e)
{
NazaraError("Failed to create work RTT/G-Buffer");
return false;
}
}
bool NzDeferredRenderTechnique::Initialize() bool NzDeferredRenderTechnique::Initialize()
{ {
const nzUInt8 fragmentSource_BloomBright[] = { const nzUInt8 fragmentSource_BloomBright[] = {
@ -540,16 +571,6 @@ bool NzDeferredRenderTechnique::Initialize()
return true; return true;
} }
bool NzDeferredRenderTechnique::IsSupported()
{
// On ne va pas s'embêter à écrire un Deferred Renderer qui ne passe pas par le MRT, ce serait trop lent pour servir...
return NzOpenGL::GetGLSLVersion() >= 140 && // On ne va pas s'embêter non plus avec le mode de compatibilité
NzRenderer::HasCapability(nzRendererCap_RenderTexture) &&
NzRenderer::HasCapability(nzRendererCap_MultipleRenderTargets) &&
NzRenderer::GetMaxColorAttachments() >= 4 &&
NzRenderer::GetMaxRenderTargets() >= 4;
}
void NzDeferredRenderTechnique::Uninitialize() void NzDeferredRenderTechnique::Uninitialize()
{ {
NzShaderLibrary::Unregister("DeferredGBufferClear"); NzShaderLibrary::Unregister("DeferredGBufferClear");
@ -561,27 +582,6 @@ void NzDeferredRenderTechnique::Uninitialize()
NzShaderLibrary::Unregister("DeferredGaussianBlur"); NzShaderLibrary::Unregister("DeferredGaussianBlur");
} }
bool NzDeferredRenderTechnique::Resize(const NzVector2ui& dimensions) const
{
try
{
NzErrorFlags errFlags(nzErrorFlag_ThrowException);
for (auto& passIt : m_passes)
for (auto& passIt2 : passIt.second)
passIt2.second->Resize(dimensions);
m_GBufferSize = dimensions;
return true;
}
catch (const std::exception& e)
{
NazaraError("Failed to create work RTT/G-Buffer");
return false;
}
}
bool NzDeferredRenderTechnique::RenderPassComparator::operator()(nzRenderPassType pass1, nzRenderPassType pass2) bool NzDeferredRenderTechnique::RenderPassComparator::operator()(nzRenderPassType pass1, nzRenderPassType pass2)
{ {
return RenderPassPriority[pass1] < RenderPassPriority[pass2]; return RenderPassPriority[pass1] < RenderPassPriority[pass2];

View File

@ -638,6 +638,88 @@ NzMaterial& NzMaterial::operator=(NzMaterial&& material)
return *this; return *this;
} }
NzMaterial* NzMaterial::GetDefault()
{
return s_defaultMaterial;
}
void NzMaterial::Copy(const NzMaterial& material)
{
// On relache les références proprement
m_alphaMap.Reset();
m_diffuseMap.Reset();
m_emissiveMap.Reset();
m_heightMap.Reset();
m_normalMap.Reset();
m_specularMap.Reset();
m_uberShader.Reset();
std::memcpy(this, &material, sizeof(NzMaterial)); // Autorisé dans notre cas, et bien plus rapide
// Ensuite une petite astuce pour récupérer correctement les références
m_alphaMap.Release();
m_diffuseMap.Release();
m_emissiveMap.Release();
m_heightMap.Release();
m_normalMap.Release();
m_specularMap.Release();
m_uberShader.Release();
m_alphaMap = material.m_alphaMap;
m_diffuseMap = material.m_diffuseMap;
m_emissiveMap = material.m_emissiveMap;
m_heightMap = material.m_heightMap;
m_normalMap = material.m_normalMap;
m_specularMap = material.m_specularMap;
m_uberShader = material.m_uberShader;
}
void NzMaterial::GenerateShader(nzUInt32 flags) const
{
NzParameterList list;
list.SetParameter("ALPHA_MAPPING", m_alphaMap.IsValid());
list.SetParameter("ALPHA_TEST", m_alphaTestEnabled);
list.SetParameter("COMPUTE_TBNMATRIX", m_normalMap.IsValid() || m_heightMap.IsValid());
list.SetParameter("DIFFUSE_MAPPING", m_diffuseMap.IsValid());
list.SetParameter("EMISSIVE_MAPPING", m_emissiveMap.IsValid());
list.SetParameter("LIGHTING", m_lightingEnabled);
list.SetParameter("NORMAL_MAPPING", m_normalMap.IsValid());
list.SetParameter("PARALLAX_MAPPING", m_heightMap.IsValid());
list.SetParameter("SPECULAR_MAPPING", m_specularMap.IsValid());
list.SetParameter("TEXTURE_MAPPING", m_alphaMap.IsValid() || m_diffuseMap.IsValid() || m_emissiveMap.IsValid() ||
m_normalMap.IsValid() || m_heightMap.IsValid() || m_specularMap.IsValid());
list.SetParameter("TRANSFORM", m_transformEnabled);
list.SetParameter("FLAG_DEFERRED", static_cast<bool>(flags & nzShaderFlags_Deferred));
list.SetParameter("FLAG_INSTANCING", static_cast<bool>(flags & nzShaderFlags_Instancing));
ShaderInstance& instance = m_shaders[flags];
instance.uberInstance = m_uberShader->Get(list);
instance.shader = instance.uberInstance->GetShader();
#define CacheUniform(name) instance.uniforms[nzMaterialUniform_##name] = instance.shader->GetUniformLocation("Material" #name)
CacheUniform(AlphaMap);
CacheUniform(AlphaThreshold);
CacheUniform(Ambient);
CacheUniform(Diffuse);
CacheUniform(DiffuseMap);
CacheUniform(EmissiveMap);
CacheUniform(HeightMap);
CacheUniform(NormalMap);
CacheUniform(Shininess);
CacheUniform(Specular);
CacheUniform(SpecularMap);
#undef CacheUniform
}
void NzMaterial::InvalidateShaders()
{
for (ShaderInstance& instance : m_shaders)
instance.uberInstance = nullptr;
}
bool NzMaterial::Initialize() bool NzMaterial::Initialize()
{ {
bool glsl140 = (NzOpenGL::GetGLSLVersion() >= 140); bool glsl140 = (NzOpenGL::GetGLSLVersion() >= 140);
@ -733,11 +815,6 @@ bool NzMaterial::Initialize()
return true; return true;
} }
NzMaterial* NzMaterial::GetDefault()
{
return s_defaultMaterial;
}
void NzMaterial::Uninitialize() void NzMaterial::Uninitialize()
{ {
NzUberShaderLibrary::Unregister("PhongLighting"); NzUberShaderLibrary::Unregister("PhongLighting");
@ -747,82 +824,5 @@ void NzMaterial::Uninitialize()
s_defaultMaterial = nullptr; s_defaultMaterial = nullptr;
} }
void NzMaterial::Copy(const NzMaterial& material)
{
// On relache les références proprement
m_alphaMap.Reset();
m_diffuseMap.Reset();
m_emissiveMap.Reset();
m_heightMap.Reset();
m_normalMap.Reset();
m_specularMap.Reset();
m_uberShader.Reset();
std::memcpy(this, &material, sizeof(NzMaterial)); // Autorisé dans notre cas, et bien plus rapide
// Ensuite une petite astuce pour récupérer correctement les références
m_alphaMap.Release();
m_diffuseMap.Release();
m_emissiveMap.Release();
m_heightMap.Release();
m_normalMap.Release();
m_specularMap.Release();
m_uberShader.Release();
m_alphaMap = material.m_alphaMap;
m_diffuseMap = material.m_diffuseMap;
m_emissiveMap = material.m_emissiveMap;
m_heightMap = material.m_heightMap;
m_normalMap = material.m_normalMap;
m_specularMap = material.m_specularMap;
m_uberShader = material.m_uberShader;
}
void NzMaterial::GenerateShader(nzUInt32 flags) const
{
NzParameterList list;
list.SetParameter("ALPHA_MAPPING", m_alphaMap.IsValid());
list.SetParameter("ALPHA_TEST", m_alphaTestEnabled);
list.SetParameter("COMPUTE_TBNMATRIX", m_normalMap.IsValid() || m_heightMap.IsValid());
list.SetParameter("DIFFUSE_MAPPING", m_diffuseMap.IsValid());
list.SetParameter("EMISSIVE_MAPPING", m_emissiveMap.IsValid());
list.SetParameter("LIGHTING", m_lightingEnabled);
list.SetParameter("NORMAL_MAPPING", m_normalMap.IsValid());
list.SetParameter("PARALLAX_MAPPING", m_heightMap.IsValid());
list.SetParameter("SPECULAR_MAPPING", m_specularMap.IsValid());
list.SetParameter("TEXTURE_MAPPING", m_alphaMap.IsValid() || m_diffuseMap.IsValid() || m_emissiveMap.IsValid() ||
m_normalMap.IsValid() || m_heightMap.IsValid() || m_specularMap.IsValid());
list.SetParameter("TRANSFORM", m_transformEnabled);
list.SetParameter("FLAG_DEFERRED", static_cast<bool>(flags & nzShaderFlags_Deferred));
list.SetParameter("FLAG_INSTANCING", static_cast<bool>(flags & nzShaderFlags_Instancing));
ShaderInstance& instance = m_shaders[flags];
instance.uberInstance = m_uberShader->Get(list);
instance.shader = instance.uberInstance->GetShader();
#define CacheUniform(name) instance.uniforms[nzMaterialUniform_##name] = instance.shader->GetUniformLocation("Material" #name)
CacheUniform(AlphaMap);
CacheUniform(AlphaThreshold);
CacheUniform(Ambient);
CacheUniform(Diffuse);
CacheUniform(DiffuseMap);
CacheUniform(EmissiveMap);
CacheUniform(HeightMap);
CacheUniform(NormalMap);
CacheUniform(Shininess);
CacheUniform(Specular);
CacheUniform(SpecularMap);
#undef CacheUniform
}
void NzMaterial::InvalidateShaders()
{
for (ShaderInstance& instance : m_shaders)
instance.uberInstance = nullptr;
}
NzMaterial* NzMaterial::s_defaultMaterial = nullptr; NzMaterial* NzMaterial::s_defaultMaterial = nullptr;
NzMaterialLoader::LoaderList NzMaterial::s_loaders; NzMaterialLoader::LoaderList NzMaterial::s_loaders;

View File

@ -23,17 +23,23 @@ bool NzShaderLibrary::Has(const NzString& name)
return s_library.find(name) != s_library.end(); return s_library.find(name) != s_library.end();
} }
bool NzShaderLibrary::Initialize()
{
return true; // Que faire
}
void NzShaderLibrary::Register(const NzString& name, NzShader* shader) void NzShaderLibrary::Register(const NzString& name, NzShader* shader)
{ {
s_library.emplace(name, shader); s_library.emplace(name, shader);
NazaraDebug("Shader \"" + name + "\" registred"); 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() void NzShaderLibrary::Uninitialize()
{ {
for (auto it : s_library) for (auto it : s_library)
@ -42,10 +48,4 @@ void NzShaderLibrary::Uninitialize()
s_library.clear(); s_library.clear();
} }
void NzShaderLibrary::Unregister(const NzString& name)
{
s_library.erase(name);
NazaraDebug("Shader \"" + name + "\" unregistred");
}
std::unordered_map<NzString, NzShaderRef> NzShaderLibrary::s_library; std::unordered_map<NzString, NzShaderRef> NzShaderLibrary::s_library;

View File

@ -23,17 +23,23 @@ bool NzUberShaderLibrary::Has(const NzString& name)
return s_library.find(name) != s_library.end(); return s_library.find(name) != s_library.end();
} }
bool NzUberShaderLibrary::Initialize()
{
return true; // Que faire
}
void NzUberShaderLibrary::Register(const NzString& name, NzUberShader* uberShader) void NzUberShaderLibrary::Register(const NzString& name, NzUberShader* uberShader)
{ {
s_library.emplace(name, uberShader); s_library.emplace(name, uberShader);
NazaraDebug("UberShader \"" + name + "\" registred"); 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() void NzUberShaderLibrary::Uninitialize()
{ {
for (auto it : s_library) for (auto it : s_library)
@ -42,10 +48,4 @@ void NzUberShaderLibrary::Uninitialize()
s_library.clear(); s_library.clear();
} }
void NzUberShaderLibrary::Unregister(const NzString& name)
{
s_library.erase(name);
NazaraDebug("UberShader \"" + name + "\" unregistred");
}
std::unordered_map<NzString, NzUberShaderRef> NzUberShaderLibrary::s_library; std::unordered_map<NzString, NzUberShaderRef> NzUberShaderLibrary::s_library;