diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2013-01-13 00:01:58 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2013-01-13 00:01:58 +0400 |
commit | 4bd3477e29319922d7e7bbb774462d419fa0f40b (patch) | |
tree | c6dda5487cd5c31a4874829992f9e74b99dcce6a | |
parent | 3225131223711c99b3bdd4c27693cf4943d90b11 (diff) |
BGE: Adding preliminary alpha shadow support for Simple shadow maps. They do not work in the viewport nor do they work for Variance shadow maps.
7 files changed, 38 insertions, 1 deletions
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index 20791652735..22cfdab6043 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -234,6 +234,7 @@ int GPU_lamp_has_shadow_buffer(GPULamp *lamp); void GPU_lamp_update_buffer_mats(GPULamp *lamp); void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[4][4], int *winsize, float winmat[4][4]); void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp); +int GPU_lamp_shadow_buffer_type(GPULamp *lamp); void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[4][4]); void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy); diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index a2fc1eb05ec..f6403e9359d 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -1882,6 +1882,11 @@ void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp) glEnable(GL_SCISSOR_TEST); } +int GPU_lamp_shadow_buffer_type(GPULamp *lamp) +{ + return lamp->la->shadowmap_type; +} + int GPU_lamp_shadow_layer(GPULamp *lamp) { if (lamp->fb && lamp->tex && (lamp->mode & (LA_LAYER|LA_LAYER_SHADOW))) diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index a55dd701826..231ec27030d 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -400,6 +400,8 @@ KX_BlenderMaterial::ActivatShaders( if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) tmp->setShaderData(true, rasty); + else if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !rasty->GetUsingOverrideShader()) + tmp->setShaderData(true, rasty); else tmp->setShaderData(false, rasty); @@ -445,6 +447,8 @@ KX_BlenderMaterial::ActivateBlenderShaders( if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) tmp->setBlenderShaderData(true, rasty); + else if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !rasty->GetUsingOverrideShader()) + tmp->setBlenderShaderData(true, rasty); else tmp->setBlenderShaderData(false, rasty); @@ -494,6 +498,8 @@ KX_BlenderMaterial::ActivateMat( if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) tmp->setTexData( true,rasty ); + else if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !rasty->GetUsingOverrideShader()) + tmp->setTexData(true, rasty); else tmp->setTexData( false,rasty); @@ -628,7 +634,8 @@ void KX_BlenderMaterial::ActivatGLMaterials( RAS_IRasterizer* rasty )const void KX_BlenderMaterial::ActivateTexGen(RAS_IRasterizer *ras) const { - if (ras->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) { + if (ras->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED || + (ras->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && IsAlpha() && !ras->GetUsingOverrideShader())) { ras->SetAttribNum(0); if (mShader && GLEW_ARB_shader_objects) { if (mShader->GetAttribute() == BL_Shader::SHD_TANGENT) { diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp index 5414a4df0f8..a8f309cc592 100644 --- a/source/gameengine/Ketsji/KX_Light.cpp +++ b/source/gameengine/Ketsji/KX_Light.cpp @@ -246,6 +246,9 @@ void KX_LightObject::BindShadowBuffer(RAS_IRasterizer *ras, RAS_ICanvas *canvas, lamp = GetGPULamp(); GPU_lamp_shadow_buffer_bind(lamp, viewmat, &winsize, winmat); + if (GPU_lamp_shadow_buffer_type(lamp) == LA_SHADMAP_VARIANCE) + ras->SetUsingOverrideShader(true); + /* GPU_lamp_shadow_buffer_bind() changes the viewport, so update the canvas */ canvas->UpdateViewPort(0, 0, winsize, winsize); @@ -276,6 +279,9 @@ void KX_LightObject::UnbindShadowBuffer(RAS_IRasterizer *ras) { GPULamp *lamp = GetGPULamp(); GPU_lamp_shadow_buffer_unbind(lamp); + + if (GPU_lamp_shadow_buffer_type(lamp) == LA_SHADMAP_VARIANCE) + ras->SetUsingOverrideShader(false); } struct Image *KX_LightObject::GetTextureImage(short texslot) diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h index 5a720857d50..99026fa259a 100644 --- a/source/gameengine/Rasterizer/RAS_IRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h @@ -417,6 +417,8 @@ public: virtual void SetAnisotropicFiltering(short level)=0; virtual short GetAnisotropicFiltering()=0; + virtual void SetUsingOverrideShader(bool val)=0; + virtual bool GetUsingOverrideShader()=0; #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_IRasterizer") diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp index a9609a266e8..8c46618ee36 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp @@ -93,6 +93,7 @@ RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas, int storage) m_noOfScanlines(32), m_motionblur(0), m_motionblurvalue(-1.0), + m_usingoverrideshader(false), m_texco_num(0), m_attrib_num(0), //m_last_alphablend(GPU_BLEND_SOLID), @@ -1057,3 +1058,14 @@ short RAS_OpenGLRasterizer::GetAnisotropicFiltering() { return (short)GPU_get_anisotropic(); } + +void RAS_OpenGLRasterizer::SetUsingOverrideShader(bool val) +{ + m_usingoverrideshader = val; +} + +bool RAS_OpenGLRasterizer::GetUsingOverrideShader() +{ + return m_usingoverrideshader; +} + diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h index c156ee53ed3..5ff2709747d 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h @@ -103,6 +103,8 @@ class RAS_OpenGLRasterizer : public RAS_IRasterizer int m_motionblur; float m_motionblurvalue; + bool m_usingoverrideshader; + protected: int m_drawingmode; TexCoGen m_texco[RAS_MAX_TEXCO]; @@ -320,6 +322,8 @@ public: virtual void SetAnisotropicFiltering(short level); virtual short GetAnisotropicFiltering(); + virtual void SetUsingOverrideShader(bool val); + virtual bool GetUsingOverrideShader(); #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_OpenGLRasterizer") |