From b01fad269e4ae942417e5b2bb97e660dda0d3bfb Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Sep 2013 10:50:27 +0200 Subject: [PATCH] Improved Texture mipmap support Former-commit-id: 0fc3e003a6524e5c026712a3dc695cf80817ea88 --- include/Nazara/Renderer/Texture.hpp | 8 ++++++- src/Nazara/Renderer/Texture.cpp | 36 ++++++++++++++++++----------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/include/Nazara/Renderer/Texture.hpp b/include/Nazara/Renderer/Texture.hpp index b220a3610..d938b0b87 100644 --- a/include/Nazara/Renderer/Texture.hpp +++ b/include/Nazara/Renderer/Texture.hpp @@ -25,6 +25,9 @@ struct NzTextureImpl; class NAZARA_API NzTexture : public NzResource, NzNonCopyable { + friend class NzRenderer; + friend class NzRenderTexture; + public: NzTexture() = default; explicit NzTexture(const NzImage& image); @@ -37,6 +40,8 @@ class NAZARA_API NzTexture : public NzResource, NzNonCopyable bool EnableMipmapping(bool enable); + void EnsureMipmapsUpdate() const; + nzUInt8 GetBytesPerPixel() const; unsigned int GetDepth() const; nzPixelFormat GetFormat() const; @@ -82,7 +87,6 @@ class NAZARA_API NzTexture : public NzResource, NzNonCopyable bool UpdateFace(nzCubemapFace face, const nzUInt8* pixels, const NzRectui& rect, unsigned int srcWidth = 0, unsigned int srcHeight = 0, nzUInt8 level = 0); // Fonctions OpenGL - bool Bind() const; unsigned int GetOpenGLID() const; static unsigned int GetValidSize(unsigned int size); @@ -91,6 +95,8 @@ class NAZARA_API NzTexture : public NzResource, NzNonCopyable static bool IsTypeSupported(nzImageType type); private: + void InvalidateMipmaps(); + NzTextureImpl* m_impl = nullptr; }; diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index a715f7580..853e76c1c 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -398,6 +398,16 @@ bool NzTexture::EnableMipmapping(bool enable) return true; } +void NzTexture::EnsureMipmapsUpdate() const +{ + if (m_impl->mipmapping && !m_impl->mipmapsUpdated) + { + NzOpenGL::BindTexture(m_impl->type, m_impl->id); + glGenerateMipmap(NzOpenGL::TextureTarget[m_impl->type]); + m_impl->mipmapsUpdated = true; + } +} + nzUInt8 NzTexture::GetBytesPerPixel() const { #if NAZARA_RENDERER_SAFE @@ -1224,19 +1234,6 @@ bool NzTexture::UpdateFace(nzCubemapFace face, const nzUInt8* pixels, const NzRe return true; } -bool NzTexture::Bind() const -{ - NzOpenGL::BindTexture(m_impl->type, m_impl->id); - - if (m_impl->mipmapping && !m_impl->mipmapsUpdated) - { - glGenerateMipmap(NzOpenGL::TextureTarget[m_impl->type]); - m_impl->mipmapsUpdated = true; - } - - return true; -} - unsigned int NzTexture::GetOpenGLID() const { #if NAZARA_RENDERER_SAFE @@ -1372,3 +1369,16 @@ bool NzTexture::IsTypeSupported(nzImageType type) NazaraError("Image type not handled (0x" + NzString::Number(type, 16) + ')'); return false; } + +void NzTexture::InvalidateMipmaps() +{ + #if NAZARA_RENDERER_SAFE + if (!m_impl) + { + NazaraInternalError("Texture must be valid"); + return; + } + #endif + + m_impl->mipmapsUpdated = false; +}