diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2013-04-04 07:55:43 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2013-04-04 07:55:43 +0400 |
commit | 966e86cd2dbe2c627e65766d0361cc79f63d7cc7 (patch) | |
tree | 0cb6207ea8f70558c4f4c644780a837b69154f8f /source/gameengine | |
parent | 7bbaf4853ae81344761fceac90b08785520c18d0 (diff) |
Fix for [#34754] "Revision 55527 provokes glitchy GLSL shadow map rendering" reported by Alain Ducharme. Per material uniforms and per object uniforms are now better separated.
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/Ketsji/BL_BlenderShader.cpp | 23 | ||||
-rw-r--r-- | source/gameengine/Ketsji/BL_BlenderShader.h | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_BlenderMaterial.cpp | 2 |
3 files changed, 16 insertions, 11 deletions
diff --git a/source/gameengine/Ketsji/BL_BlenderShader.cpp b/source/gameengine/Ketsji/BL_BlenderShader.cpp index f5f9b344b87..3f2a9a6df6a 100644 --- a/source/gameengine/Ketsji/BL_BlenderShader.cpp +++ b/source/gameengine/Ketsji/BL_BlenderShader.cpp @@ -46,11 +46,20 @@ void BL_BlenderShader::ReloadMaterial() mGPUMat = (mMat) ? GPU_material_from_blender(mBlenderScene, mMat) : NULL; } -void BL_BlenderShader::SetProg(bool enable, double time) +void BL_BlenderShader::SetProg(bool enable, double time, RAS_IRasterizer* rasty) { if (VerifyShader()) { - if (enable) - GPU_material_bind(mGPUMat, mLightLayer, mBlenderScene->lay, time, 1); + if (enable) { + assert(rasty != NULL); // XXX Kinda hacky, but SetProg() should always have the rasterizer if enable is true + + float viewmat[4][4], viewinvmat[4][4]; + const MT_Matrix4x4& view = rasty->GetViewMatrix(); + const MT_Matrix4x4& viewinv = rasty->GetViewInvMatrix(); + view.getValue((float*)viewmat); + viewinv.getValue((float*)viewinvmat); + + GPU_material_bind(mGPUMat, mLightLayer, mBlenderScene->lay, time, 1, viewmat, viewinvmat); + } else GPU_material_unbind(mGPUMat); } @@ -120,7 +129,7 @@ void BL_BlenderShader::SetAttribs(RAS_IRasterizer* ras, const BL_Material *mat) void BL_BlenderShader::Update(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty ) { - float obmat[4][4], viewmat[4][4], viewinvmat[4][4], obcol[4]; + float obmat[4][4], obcol[4]; GPUMaterial *gpumat; gpumat = mGPUMat; @@ -130,13 +139,9 @@ void BL_BlenderShader::Update(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty ) MT_Matrix4x4 model; model.setValue(ms.m_OpenGLMatrix); - const MT_Matrix4x4& view = rasty->GetViewMatrix(); - const MT_Matrix4x4& viewinv = rasty->GetViewInvMatrix(); // note: getValue gives back column major as needed by OpenGL model.getValue((float*)obmat); - view.getValue((float*)viewmat); - viewinv.getValue((float*)viewinvmat); if (ms.m_bObjectColor) ms.m_RGBAcolor.getValue((float *)obcol); @@ -144,7 +149,7 @@ void BL_BlenderShader::Update(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty ) obcol[0] = obcol[1] = obcol[2] = obcol[3] = 1.0f; float auto_bump_scale = ms.m_pDerivedMesh!=0 ? ms.m_pDerivedMesh->auto_bump_scale : 1.0f; - GPU_material_bind_uniforms(gpumat, obmat, viewmat, viewinvmat, obcol, auto_bump_scale); + GPU_material_bind_uniforms(gpumat, obmat, obcol, auto_bump_scale); mAlphaBlend = GPU_material_alpha_blend(gpumat, obcol); } diff --git a/source/gameengine/Ketsji/BL_BlenderShader.h b/source/gameengine/Ketsji/BL_BlenderShader.h index 626c65baadd..71f66c2a49d 100644 --- a/source/gameengine/Ketsji/BL_BlenderShader.h +++ b/source/gameengine/Ketsji/BL_BlenderShader.h @@ -78,7 +78,7 @@ public: // same as VerifyShared return (NULL != mGPUMat); } - void SetProg(bool enable, double time=0.0); + void SetProg(bool enable, double time=0.0, RAS_IRasterizer* rasty=NULL); int GetAttribNum(); void SetAttribs(class RAS_IRasterizer* ras, const BL_Material *mat); diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index 231ec27030d..853cfa53da2 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -314,7 +314,7 @@ void KX_BlenderMaterial::setBlenderShaderData( bool enable, RAS_IRasterizer *ras else BL_Texture::DisableAllTextures(); - mBlenderShader->SetProg(true, ras->GetTime()); + mBlenderShader->SetProg(true, ras->GetTime(), ras); mLastBlenderShader= mBlenderShader; } } |