Add renderer.disableCopyShadow for debugging purposes.

Add renderer.depthTextureBits configuration value.

This was SVN commit r3518.
This commit is contained in:
prefect 2006-02-15 23:50:24 +00:00
parent 7396587f6e
commit f903b83674
4 changed files with 98 additions and 4 deletions

View File

@ -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<CRenderer>::ScriptingInit("Renderer");
}

View File

@ -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;

View File

@ -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

View File

@ -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.