diff --git a/include/Nazara/Renderer/RenderTexture.hpp b/include/Nazara/Renderer/RenderTexture.hpp index d3f1c1e73..c841f9041 100644 --- a/include/Nazara/Renderer/RenderTexture.hpp +++ b/include/Nazara/Renderer/RenderTexture.hpp @@ -23,8 +23,7 @@ class NAZARA_API NzRenderTexture : public NzRenderTarget, NzResourceListener, Nz ~NzRenderTexture(); bool AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 index, nzPixelFormat format); - bool AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture); - bool AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture, unsigned int z); + bool AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture, unsigned int z = 0); bool Create(unsigned int width, unsigned int height, bool lock = false); void Destroy(); diff --git a/src/Nazara/Renderer/OpenGL.cpp b/src/Nazara/Renderer/OpenGL.cpp index 89c034759..f12099083 100644 --- a/src/Nazara/Renderer/OpenGL.cpp +++ b/src/Nazara/Renderer/OpenGL.cpp @@ -340,6 +340,7 @@ bool NzOpenGL::Initialize() if (!glBindFragDataLocation) glBindFragDataLocation = reinterpret_cast(LoadEntry("glBindFragDataLocationEXT", false)); + glFramebufferTexture = reinterpret_cast(LoadEntry("glFramebufferTexture", false)); glGetStringi = reinterpret_cast(LoadEntry("glGetStringi", false)); glMapBufferRange = reinterpret_cast(LoadEntry("glMapBufferRange", false)); glInvalidateBufferData = reinterpret_cast(LoadEntry("glInvalidateBufferData", false)); @@ -474,7 +475,6 @@ bool NzOpenGL::Initialize() glDeleteFramebuffers = reinterpret_cast(LoadEntry("glDeleteFramebuffers")); glDeleteRenderbuffers = reinterpret_cast(LoadEntry("glDeleteRenderbuffers")); glFramebufferRenderbuffer = reinterpret_cast(LoadEntry("glFramebufferRenderbuffer")); - glFramebufferTexture = reinterpret_cast(LoadEntry("glFramebufferTexture")); glFramebufferTexture1D = reinterpret_cast(LoadEntry("glFramebufferTexture1D")); glFramebufferTexture2D = reinterpret_cast(LoadEntry("glFramebufferTexture2D")); glFramebufferTexture3D = reinterpret_cast(LoadEntry("glFramebufferTexture3D")); diff --git a/src/Nazara/Renderer/RenderTexture.cpp b/src/Nazara/Renderer/RenderTexture.cpp index bd45500d8..2682ed65b 100644 --- a/src/Nazara/Renderer/RenderTexture.cpp +++ b/src/Nazara/Renderer/RenderTexture.cpp @@ -144,84 +144,6 @@ bool NzRenderTexture::AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 in return true; } -bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture) -{ - #if NAZARA_RENDERER_SAFE - if (!m_impl) - { - NazaraError("Render texture not created"); - return false; - } - - if (attachmentPoint != nzAttachmentPoint_Color && index > 0) - { - NazaraError("Index must be 0 for non-color attachments"); - return false; - } - - unsigned int depthStencilIndex = attachmentIndex[nzAttachmentPoint_DepthStencil]; - if (attachmentPoint == nzAttachmentPoint_Stencil && m_impl->attachements.size() > depthStencilIndex && - m_impl->attachements[depthStencilIndex].isUsed) - { - NazaraError("Stencil target already attached by DepthStencil attachment"); - return false; - } - - if (!texture || !texture->IsValid()) - { - NazaraError("Invalid texture"); - return false; - } - - if (texture->GetWidth() < m_impl->width || texture->GetHeight() < m_impl->height) - { - NazaraError("Texture cannot be smaller than render texture"); - return false; - } - - if (texture->GetRenderTexture() != nullptr) - { - NazaraError("Texture already used by another render texture"); - return false; - } - - if (formatTypeToAttachment[NzPixelFormat::GetType(texture->GetFormat())] != attachmentPoint) - { - NazaraError("Pixel format type does not match attachment point type"); - return false; - } - #endif - - if (!Lock()) - { - NazaraError("Failed to lock render texture"); - return false; - } - - // Détachement de l'attache précédente (Si il y a) - Detach(attachmentPoint, index); - - glFramebufferTexture(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, texture->GetOpenGLID(), 0); - Unlock(); - - unsigned int minSize = attachmentIndex[attachmentPoint]+index+1; - if (m_impl->attachements.size() < minSize) - m_impl->attachements.resize(minSize); - - Attachment& attachment = m_impl->attachements[minSize-1]; - attachment.isBuffer = true; - attachment.isUsed = true; - attachment.texture = texture; - - texture->AddResourceListener(this, minSize-1); - texture->SetRenderTexture(this); - - m_impl->checked = false; - m_impl->drawBuffersUpdated = false; - - return true; -} - bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture, unsigned int z) { #if NAZARA_RENDERER_SAFE @@ -315,6 +237,7 @@ bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 i glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, NzOpenGL::CubemapFace[z], texture->GetOpenGLID(), 0); break; } + Unlock(); unsigned int minSize = attachmentIndex[attachmentPoint]+index+1; @@ -471,7 +394,11 @@ void NzRenderTexture::Detach(nzAttachmentPoint attachmentPoint, nzUInt8 index) } else { - glFramebufferTexture(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, 0, 0); + if (glFramebufferTexture) + glFramebufferTexture(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, 0, 0); + else + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, 0, 0, 0); + attachement.texture->RemoveResourceListener(this); attachement.texture->SetRenderTexture(nullptr); }