This is an automated email from the git hooks/post-receive script. odyx pushed a commit to branch upstream/latest in repository colobot.
commit f67c01e5e77735535c6631494f7af0ff69072d68 Author: Tomasz Kapuściński <[email protected]> Date: Thu May 21 18:03:17 2015 +0200 Added proper render to texture support --- src/graphics/core/device.h | 14 ++++++++++ src/graphics/core/nulldevice.cpp | 4 +++ src/graphics/core/nulldevice.h | 2 ++ src/graphics/opengl/gl33device.cpp | 56 +++++++++++++++++++++++++++++++++++++- src/graphics/opengl/gl33device.h | 4 +++ src/graphics/opengl/gldevice.cpp | 40 +++++++++++++++++++++++++++ src/graphics/opengl/gldevice.h | 4 +++ 7 files changed, 123 insertions(+), 1 deletion(-) diff --git a/src/graphics/core/device.h b/src/graphics/core/device.h index 8db8e33..f99127a 100644 --- a/src/graphics/core/device.h +++ b/src/graphics/core/device.h @@ -227,6 +227,17 @@ enum FrustumPlane }; /** + * \enum RenderTarget + * \brief Render targets for rendering to textures + */ +enum RenderTarget +{ + RENDER_TARGET_COLOR, + RENDER_TARGET_DEPTH, + RENDER_TARGET_STENCIL +}; + +/** * \class CDevice * \brief Abstract interface of graphics device * @@ -382,6 +393,9 @@ public: //! Initializes offscreen buffer virtual void InitOffscreenBuffer(int width, int height) = 0; + //! Sets render target to texture + virtual void SetRenderTexture(RenderTarget target, int texture) = 0; + //! Copies content of framebuffer to texture virtual void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) = 0; diff --git a/src/graphics/core/nulldevice.cpp b/src/graphics/core/nulldevice.cpp index 26956ab..acac78d 100644 --- a/src/graphics/core/nulldevice.cpp +++ b/src/graphics/core/nulldevice.cpp @@ -355,6 +355,10 @@ void CNullDevice::InitOffscreenBuffer(int width, int height) { } +void CNullDevice::SetRenderTexture(RenderTarget target, int texture) +{ +} + void CNullDevice::CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) { } diff --git a/src/graphics/core/nulldevice.h b/src/graphics/core/nulldevice.h index e68b982..07abf3a 100644 --- a/src/graphics/core/nulldevice.h +++ b/src/graphics/core/nulldevice.h @@ -140,6 +140,8 @@ public: virtual void InitOffscreenBuffer(int width, int height); + virtual void SetRenderTexture(RenderTarget target, int texture); + virtual void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height); virtual void* GetFrameBufferPixels() const; diff --git a/src/graphics/opengl/gl33device.cpp b/src/graphics/opengl/gl33device.cpp index 193440c..0401edc 100644 --- a/src/graphics/opengl/gl33device.cpp +++ b/src/graphics/opengl/gl33device.cpp @@ -49,6 +49,7 @@ CGL33Device::CGL33Device(const GLDeviceConfig &config) m_framebuffer = 0; m_colorBuffer = 0; m_depthBuffer = 0; + m_offscreenRenderingEnabled = false; } @@ -336,6 +337,9 @@ bool CGL33Device::Create() assert(false); } + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + glUseProgram(m_shaderProgram); // Obtain uniform locations @@ -428,6 +432,18 @@ bool CGL33Device::Create() void CGL33Device::Destroy() { + glUseProgram(0); + glDeleteProgram(m_shaderProgram); + + if (m_framebuffer != 0) + { + glDeleteFramebuffers(1, &m_framebuffer); + glDeleteRenderbuffers(1, &m_colorBuffer); + glDeleteRenderbuffers(1, &m_depthBuffer); + + m_framebuffer = 0; + } + // Delete the remaining textures // Should not be strictly necessary, but just in case DestroyAllTextures(); @@ -827,7 +843,7 @@ Texture CGL33Device::CreateDepthTexture(int width, int height, int depth) } glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, GL_DEPTH_COMPONENT, GL_INT, nullptr); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); float color[] = { 1.0f, 1.0f, 1.0f, 1.0f }; @@ -1767,6 +1783,8 @@ void CGL33Device::SetRenderState(RenderState state, bool enabled) if (m_framebuffer == 0) InitOffscreenBuffer(2048, 2048); + m_offscreenRenderingEnabled = true; + GLuint toBind = (enabled ? m_framebuffer : 0); glBindFramebuffer(GL_FRAMEBUFFER, toBind); @@ -1914,6 +1932,42 @@ void CGL33Device::InitOffscreenBuffer(int width, int height) GetLogger()->Info("Initialized offscreen buffer %dx%d\n", width, height); } +void CGL33Device::SetRenderTexture(RenderTarget target, int texture) +{ + if (!m_offscreenRenderingEnabled) return; + + GLenum attachment; + GLuint defaultBuffer; + + switch (target) + { + case RENDER_TARGET_COLOR: + attachment = GL_COLOR_ATTACHMENT0; + defaultBuffer = m_colorBuffer; + break; + case RENDER_TARGET_DEPTH: + attachment = GL_DEPTH_ATTACHMENT; + defaultBuffer = m_depthBuffer; + break; + case RENDER_TARGET_STENCIL: + attachment = GL_STENCIL_ATTACHMENT; + defaultBuffer = 0; + break; + default: assert(false); break; + } + + if (texture == 0) // unbind texture and bind default buffer + { + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, 0, 0); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, defaultBuffer); + } + else // unbind default buffer and bind texture + { + glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, texture, 0); + } +} + void CGL33Device::CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) { if (texture.id == 0) return; diff --git a/src/graphics/opengl/gl33device.h b/src/graphics/opengl/gl33device.h index 9c14e38..d83bf20 100644 --- a/src/graphics/opengl/gl33device.h +++ b/src/graphics/opengl/gl33device.h @@ -135,6 +135,8 @@ public: virtual void InitOffscreenBuffer(int width, int height) OVERRIDE; + virtual void SetRenderTexture(RenderTarget target, int texture) OVERRIDE; + virtual void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) OVERRIDE; virtual void* GetFrameBufferPixels() const OVERRIDE; @@ -220,6 +222,8 @@ private: GLuint m_depthBuffer; //! Maximum available renderbuffer size int m_maxRenderbufferSize; + //! true if offscreen rendering is enabled + bool m_offscreenRenderingEnabled; //! Shader program GLuint m_shaderProgram; diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index f8fc2fa..811ae5b 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -54,6 +54,7 @@ CGLDevice::CGLDevice(const GLDeviceConfig &config) m_framebuffer = 0; m_colorBuffer = 0; m_depthBuffer = 0; + m_offscreenRenderingEnabled = false; } @@ -1741,6 +1742,8 @@ void CGLDevice::SetRenderState(RenderState state, bool enabled) return; } + m_offscreenRenderingEnabled = enabled; + if (m_framebuffer == 0) InitOffscreenBuffer(2048, 2048); @@ -1878,6 +1881,43 @@ void CGLDevice::InitOffscreenBuffer(int width, int height) GetLogger()->Info("Initialized offscreen buffer %dx%d\n", width, height); } +void CGLDevice::SetRenderTexture(RenderTarget target, int texture) +{ + if (!m_framebufferObject) return; + if (!m_offscreenRenderingEnabled) return; + + GLenum attachment; + GLuint defaultBuffer; + + switch (target) + { + case RENDER_TARGET_COLOR: + attachment = GL_COLOR_ATTACHMENT0_EXT; + defaultBuffer = m_colorBuffer; + break; + case RENDER_TARGET_DEPTH: + attachment = GL_DEPTH_ATTACHMENT_EXT; + defaultBuffer = m_depthBuffer; + break; + case RENDER_TARGET_STENCIL: + attachment = GL_STENCIL_ATTACHMENT_EXT; + defaultBuffer = 0; + break; + default: assert(false); break; + } + + if (texture == 0) // unbind texture and bind default buffer + { + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment, GL_TEXTURE_2D, 0, 0); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, defaultBuffer); + } + else // unbind default buffer and bind texture + { + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment, GL_TEXTURE_2D, texture, 0); + } +} + void CGLDevice::CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) { if (texture.id == 0) return; diff --git a/src/graphics/opengl/gldevice.h b/src/graphics/opengl/gldevice.h index d1f085a..2ffefdf 100644 --- a/src/graphics/opengl/gldevice.h +++ b/src/graphics/opengl/gldevice.h @@ -158,6 +158,8 @@ public: virtual void InitOffscreenBuffer(int width, int height) OVERRIDE; + virtual void SetRenderTexture(RenderTarget target, int texture) OVERRIDE; + virtual void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) OVERRIDE; virtual void* GetFrameBufferPixels() const OVERRIDE; @@ -253,6 +255,8 @@ private: GLuint m_depthBuffer; //! Maximum available renderbuffer size int m_maxRenderbufferSize; + //! true if offscreen rendering enabled + bool m_offscreenRenderingEnabled; }; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

