[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55767] trunk/blender/source: Fix for [ #34754] "Revision 55527 provokes glitchy GLSL shadow map rendering" reported by Alain Ducharme.
Mitchell Stokes
mogurijin at gmail.com
Thu Apr 4 05:55:44 CEST 2013
Revision: 55767
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55767
Author: moguri
Date: 2013-04-04 03:55:43 +0000 (Thu, 04 Apr 2013)
Log Message:
-----------
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.
Revision Links:
--------------
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55527
Modified Paths:
--------------
trunk/blender/source/blender/gpu/GPU_material.h
trunk/blender/source/blender/gpu/intern/gpu_draw.c
trunk/blender/source/blender/gpu/intern/gpu_material.c
trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h
trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
Modified: trunk/blender/source/blender/gpu/GPU_material.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_material.h 2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/blender/gpu/GPU_material.h 2013-04-04 03:55:43 UTC (rev 55767)
@@ -129,8 +129,8 @@
void GPU_materials_free(void);
-void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float viewmat[4][4], float viewinv[4][4], float obcol[4], float autobumpscale);
+void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap, float viewmat[4][4], float viewinv[4][4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float obcol[4], float autobumpscale);
void GPU_material_unbind(GPUMaterial *material);
int GPU_material_bound(GPUMaterial *material);
Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c 2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c 2013-04-04 03:55:43 UTC (rev 55767)
@@ -1457,10 +1457,10 @@
gpumat = GPU_material_from_blender(GMS.gscene, mat);
GPU_material_vertex_attributes(gpumat, gattribs);
- GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
+ GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT), GMS.gviewmat, GMS.gviewinv);
auto_bump_scale = GMS.gob->derivedFinal != NULL ? GMS.gob->derivedFinal->auto_bump_scale : 1.0f;
- GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col, auto_bump_scale);
+ GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gob->col, auto_bump_scale);
GMS.gboundmat= mat;
/* for glsl use alpha blend mode, unless it's set to solid and
Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c 2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c 2013-04-04 03:55:43 UTC (rev 55767)
@@ -257,11 +257,12 @@
BLI_freelistN(&ma->gpumaterial);
}
-void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap)
+void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap, float viewmat[4][4], float viewinv[4][4])
{
if (material->pass) {
LinkData *nlink;
GPULamp *lamp;
+ GPUShader *shader = GPU_pass_shader(material->pass);
/* handle layer lamps */
for (nlink=material->lamps.first; nlink; nlink=nlink->next) {
@@ -275,29 +276,52 @@
lamp->dynenergy = 0.0f;
lamp->dyncol[0]= lamp->dyncol[1]= lamp->dyncol[2] = 0.0f;
}
+
+ if (material->dynproperty & DYN_LAMP_VEC) {
+ copy_v3_v3(lamp->dynvec, lamp->vec);
+ normalize_v3(lamp->dynvec);
+ negate_v3(lamp->dynvec);
+ mul_mat3_m4_v3(viewmat, lamp->dynvec);
+ }
+
+ if (material->dynproperty & DYN_LAMP_CO) {
+ copy_v3_v3(lamp->dynco, lamp->co);
+ mul_m4_v3(viewmat, lamp->dynco);
+ }
+
+ if (material->dynproperty & DYN_LAMP_IMAT) {
+ mult_m4_m4m4(lamp->dynimat, lamp->imat, viewinv);
+ }
+
+ if (material->dynproperty & DYN_LAMP_PERSMAT) {
+ if (!GPU_lamp_has_shadow_buffer(lamp)) /* The lamp matrices are already updated if we're using shadow buffers */
+ GPU_lamp_update_buffer_mats(lamp);
+ mult_m4_m4m4(lamp->dynpersmat, lamp->persmat, viewinv);
+ }
}
+ /* handle per material built-ins */
+ if (material->builtins & GPU_VIEW_MATRIX) {
+ GPU_shader_uniform_vector(shader, material->viewmatloc, 16, 1, (float*)viewmat);
+ }
+ if (material->builtins & GPU_INVERSE_VIEW_MATRIX) {
+ GPU_shader_uniform_vector(shader, material->invviewmatloc, 16, 1, (float*)viewinv);
+ }
+
GPU_pass_bind(material->pass, time, mipmap);
GPU_pass_update_uniforms(material->pass);
+
material->bound = 1;
}
}
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float viewmat[4][4], float viewinv[4][4], float obcol[4], float autobumpscale)
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float obcol[4], float autobumpscale)
{
if (material->pass) {
GPUShader *shader = GPU_pass_shader(material->pass);
- LinkData *nlink;
- GPULamp *lamp;
float invmat[4][4], col[4];
- /* handle builtins */
- if (material->builtins & GPU_VIEW_MATRIX) {
- GPU_shader_uniform_vector(shader, material->viewmatloc, 16, 1, (float*)viewmat);
- }
- if (material->builtins & GPU_INVERSE_VIEW_MATRIX) {
- GPU_shader_uniform_vector(shader, material->invviewmatloc, 16, 1, (float*)viewinv);
- }
+ /* handle per object builtins */
if (material->builtins & GPU_OBJECT_MATRIX) {
GPU_shader_uniform_vector(shader, material->obmatloc, 16, 1, (float*)obmat);
}
@@ -313,32 +337,6 @@
if (material->builtins & GPU_AUTO_BUMPSCALE) {
GPU_shader_uniform_vector(shader, material->obautobumpscaleloc, 1, 1, &autobumpscale);
}
- /* update lamps */
- for (nlink=material->lamps.first; nlink; nlink=nlink->next) {
- lamp= nlink->data;
-
- if (material->dynproperty & DYN_LAMP_VEC) {
- copy_v3_v3(lamp->dynvec, lamp->vec);
- normalize_v3(lamp->dynvec);
- negate_v3(lamp->dynvec);
- mul_mat3_m4_v3(viewmat, lamp->dynvec);
- }
-
- if (material->dynproperty & DYN_LAMP_CO) {
- copy_v3_v3(lamp->dynco, lamp->co);
- mul_m4_v3(viewmat, lamp->dynco);
- }
-
- if (material->dynproperty & DYN_LAMP_IMAT) {
- mult_m4_m4m4(lamp->dynimat, lamp->imat, viewinv);
- }
-
- if (material->dynproperty & DYN_LAMP_PERSMAT) {
- if (!GPU_lamp_has_shadow_buffer(lamp)) /* The lamp matrices are already updated if we're using shadow buffers */
- GPU_lamp_update_buffer_mats(lamp);
- mult_m4_m4m4(lamp->dynpersmat, lamp->persmat, viewinv);
- }
- }
}
}
Modified: trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp 2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp 2013-04-04 03:55:43 UTC (rev 55767)
@@ -46,11 +46,20 @@
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::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 @@
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 @@
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);
}
Modified: trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h 2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h 2013-04-04 03:55:43 UTC (rev 55767)
@@ -78,7 +78,7 @@
// 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);
Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp 2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp 2013-04-04 03:55:43 UTC (rev 55767)
@@ -314,7 +314,7 @@
else
BL_Texture::DisableAllTextures();
- mBlenderShader->SetProg(true, ras->GetTime());
+ mBlenderShader->SetProg(true, ras->GetTime(), ras);
mLastBlenderShader= mBlenderShader;
}
}
More information about the Bf-blender-cvs
mailing list