From f903b83674db344c0224ff2d87edd62920fa8879 Mon Sep 17 00:00:00 2001 From: prefect Date: Wed, 15 Feb 2006 23:50:24 +0000 Subject: [PATCH] Add renderer.disableCopyShadow for debugging purposes. Add renderer.depthTextureBits configuration value. This was SVN commit r3518. --- source/renderer/Renderer.cpp | 18 +++++++++++ source/renderer/Renderer.h | 10 ++++++ source/renderer/ShadowMap.cpp | 58 ++++++++++++++++++++++++++++++++--- source/renderer/ShadowMap.h | 16 ++++++++++ 4 files changed, 98 insertions(+), 4 deletions(-) diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 6d0e09e451..16c297cd3d 100755 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -237,6 +237,7 @@ CRenderer::CRenderer() m_SortAllTransparent = false; m_FastNormals = true; m_DisplayFrustum = false; + m_DisableCopyShadow = false; m_VertexShader = 0; @@ -1291,6 +1292,21 @@ void CRenderer::JSI_SetUseDepthTexture(JSContext* ctx, jsval newval) m->shadow->SetUseDepthTexture(depthTexture); } +jsval CRenderer::JSI_GetDepthTextureBits(JSContext*) +{ + return ToJSVal(m->shadow->GetDepthTextureBits()); +} + +void CRenderer::JSI_SetDepthTextureBits(JSContext* ctx, jsval newval) +{ + int depthTextureBits; + + if (!ToPrimitive(ctx, newval, depthTextureBits)) + return; + + m->shadow->SetDepthTextureBits(depthTextureBits); +} + void CRenderer::ScriptingInit() { AddProperty(L"fastPlayerColor", &CRenderer::JSI_GetFastPlayerColor, &CRenderer::JSI_SetFastPlayerColor); @@ -1300,6 +1316,8 @@ void CRenderer::ScriptingInit() AddProperty(L"fastNormals", &CRenderer::m_FastNormals); AddProperty(L"displayFrustum", &CRenderer::m_DisplayFrustum); AddProperty(L"shadowZBias", &CRenderer::m_ShadowZBias); + AddProperty(L"disableCopyShadow", &CRenderer::m_DisableCopyShadow); + AddProperty(L"depthTextureBits", &CRenderer::JSI_GetDepthTextureBits, &CRenderer::JSI_SetDepthTextureBits); CJSObject::ScriptingInit("Renderer"); } diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h index fe6aa4482b..c2ba084091 100755 --- a/source/renderer/Renderer.h +++ b/source/renderer/Renderer.h @@ -294,6 +294,8 @@ public: */ const Caps& GetCapabilities() const { return m_Caps; } + bool GetDisableCopyShadow() const { return m_DisableCopyShadow; } + protected: friend struct CRendererInternals; friend class CVertexBuffer; @@ -314,6 +316,8 @@ protected: void JSI_SetRenderPath(JSContext* ctx, jsval newval); jsval JSI_GetUseDepthTexture(JSContext*); void JSI_SetUseDepthTexture(JSContext* ctx, jsval newval); + jsval JSI_GetDepthTextureBits(JSContext*); + void JSI_SetDepthTextureBits(JSContext* ctx, jsval newval); static void ScriptingInit(); // patch rendering stuff @@ -419,6 +423,12 @@ protected: */ bool m_DisplayFrustum; + /** + * m_DisableCopyShadow: For debugging purpose: + * Disable copying of shadow data into the shadow texture (when EXT_fbo is not available) + */ + bool m_DisableCopyShadow; + // Various model renderers struct Models { ModelRenderer* NormalFF; diff --git a/source/renderer/ShadowMap.cpp b/source/renderer/ShadowMap.cpp index 8576d4c13f..567bac344f 100644 --- a/source/renderer/ShadowMap.cpp +++ b/source/renderer/ShadowMap.cpp @@ -35,6 +35,8 @@ struct ShadowMapInternals { // whether we're using depth texture or luminance map bool UseDepthTexture; + // bit depth for the depth texture, if used + int DepthTextureBits; // handle of shadow map GLuint Texture; // width, height of shadow map @@ -69,6 +71,7 @@ ShadowMap::ShadowMap() m->Width = 0; m->Height = 0; m->UseDepthTexture = false; + m->DepthTextureBits = 16; } @@ -216,8 +219,20 @@ void ShadowMapInternals::CreateTexture() Height = g_Renderer.GetHeight(); Height = RoundUpToPowerOf2(Height); + const char* formatname = "LUMINANCE"; + + if (UseDepthTexture) + { + switch(DepthTextureBits) { + case 16: formatname = "DEPTH_COMPONENT16"; break; + case 24: formatname = "DEPTH_COMPONENT24"; break; + case 32: formatname = "DEPTH_COMPONENT32"; break; + default: formatname = "DEPTH_COMPONENT"; break; + } + } + LOG(NORMAL, LOG_CATEGORY, "Creating shadow texture (size %ix%i) (format = %s)", - Width, Height, UseDepthTexture ? "DEPTH_COMPONENT" : "LUMINANCE"); + Width, Height, formatname); // create texture object glGenTextures(1, &Texture); @@ -227,9 +242,18 @@ void ShadowMapInternals::CreateTexture() if (UseDepthTexture) { + GLenum format; + + switch(DepthTextureBits) { + case 16: format = GL_DEPTH_COMPONENT16; break; + case 24: format = GL_DEPTH_COMPONENT24; break; + case 32: format = GL_DEPTH_COMPONENT32; break; + default: format = GL_DEPTH_COMPONENT; break; + } + float* buf = new float[size]; for(uint i = 0; i < size; i++) buf[i] = 1.0; - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, Width, Height, 0, + glTexImage2D(GL_TEXTURE_2D, 0, format, Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, buf); delete[] buf; @@ -301,8 +325,11 @@ void ShadowMap::EndRender() glDisable(GL_SCISSOR_TEST); // copy result into shadow map texture - g_Renderer.BindTexture(0, m->Texture); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, g_Renderer.GetWidth(), g_Renderer.GetHeight()); + if (!g_Renderer.GetDisableCopyShadow()) + { + g_Renderer.BindTexture(0, m->Texture); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, g_Renderer.GetWidth(), g_Renderer.GetHeight()); + } if (m->UseDepthTexture) { @@ -362,6 +389,29 @@ void ShadowMap::SetUseDepthTexture(bool depthTexture) } +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Depth texture bits +int ShadowMap::GetDepthTextureBits() const +{ + return m->DepthTextureBits; +} + +void ShadowMap::SetDepthTextureBits(int bits) +{ + if (bits != m->DepthTextureBits) + { + if (m->Texture) + { + glDeleteTextures(1, &m->Texture); + m->Texture = 0; + } + m->Width = m->Height = 0; + + m->DepthTextureBits = bits; + } +} + + ////////////////////////////////////////////////////////////////////////////// // RenderDebugDisplay: debug visualizations // - blue: objects in shadow diff --git a/source/renderer/ShadowMap.h b/source/renderer/ShadowMap.h index 0983ef01f3..c85e90641e 100644 --- a/source/renderer/ShadowMap.h +++ b/source/renderer/ShadowMap.h @@ -57,6 +57,22 @@ public: */ void SetUseDepthTexture(bool depthTexture); + /** + * GetDepthTextureBits: Return the number of bits to use for depth textures when + * enabled. + * + * @return depth texture bit depth + */ + int GetDepthTextureBits() const; + + /** + * SetDepthTextureBits: Sets the number of bits to use for depth textures when enabled. + * Possible values are 16, 24, 32 and 0 (= use default) + * + * @param bits number of bits + */ + void SetDepthTextureBits(int bits); + /** * SetupFrame: Configure light space for the given camera and light direction, * create the shadow texture if necessary, etc.