From eab807daebdb6e6571107c925e0336005fee31da Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 8 Feb 2014 01:47:22 -0600 Subject: [PATCH 1/4] Fix fullbright alpha in fixed-function. --- indra/newview/lldrawpoolalpha.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index fad98ddbd..7d25f6fc8 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -457,11 +457,11 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) if (light_enabled) // Turn off lighting if it hasn't already been so. { - gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); + gPipeline.enableLightsDynamic(); } else // Turn on lighting if it isn't already. { - gPipeline.enableLightsDynamic(); + gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); } } } From 9d7d7590a7c3a1fecb064d9fa278af57b478f443 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sun, 9 Feb 2014 23:40:03 -0600 Subject: [PATCH 2/4] Prevent debug visualizations from writing to the z-buffer (caused occlusion weirdness) --- indra/newview/pipeline.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 5dd82bc4a..a94323f71 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -4706,6 +4706,8 @@ void LLPipeline::renderDebug() if(!mRenderDebugMask) return; + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_LEQUAL); + // Debug stuff. for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) From f7fdeeea9bf3c822bbd486945629e4a4bd5eaeff Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 10 Feb 2014 20:18:39 -0600 Subject: [PATCH 3/4] Be super sure not to let rigged vert weights extend beyond actual joint count. --- indra/llrender/llshadermgr.cpp | 1 + indra/llrender/llshadermgr.h | 1 + .../app_settings/shaders/class1/avatar/objectSkinV.glsl | 3 ++- indra/newview/lldrawpoolavatar.cpp | 4 ++-- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 8dab8bbc8..37a16ff6f 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1225,6 +1225,7 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("matrixPalette"); mReservedUniforms.push_back("translationPalette"); + mReservedUniforms.push_back("maxWeight"); mReservedUniforms.push_back("screenTex"); mReservedUniforms.push_back("screenDepth"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 5cf22f58f..e29f80f10 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -179,6 +179,7 @@ public: AVATAR_MATRIX, AVATAR_TRANSLATION, + AVATAR_MAX_WEIGHT, WATER_SCREENTEX, WATER_SCREENDEPTH, diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index 57129c3bd..44bd9f5ed 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -26,6 +26,7 @@ ATTRIBUTE vec4 weight4; uniform mat3 matrixPalette[52]; uniform vec3 translationPalette[52]; +uniform float maxWeight; mat4 getObjectSkinnedTransform() { @@ -34,7 +35,7 @@ mat4 getObjectSkinnedTransform() vec4 w = fract(weight4); vec4 index = floor(weight4); - index = min(index, vec4(51.0)); + index = min(index, vec4(maxWeight)); index = max(index, vec4( 0.0)); float scale = 1.0/(w.x+w.y+w.z+w.w); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index d4962256e..6bbb66fbc 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1599,7 +1599,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* { F32 w = weight[j][k]; - idx[k] = llclamp((S32) floorf(w), 0, 63); + idx[k] = llclamp((S32) floorf(w), 0, S32(count-1)); wght[k] = w - floorf(w); scale += wght[k]; } @@ -1747,7 +1747,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) (GLfloat*) mp); LLDrawPoolAvatar::sVertexProgram->uniform3fv(LLShaderMgr::AVATAR_TRANSLATION, count, transp); - + LLDrawPoolAvatar::sVertexProgram->uniform1f(LLShaderMgr::AVATAR_MAX_WEIGHT, F32(count-1)); stop_glerror(); } From dda7cb5791926d31733a33faa436059ec64df57b Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 10 Feb 2014 20:20:03 -0600 Subject: [PATCH 4/4] Lazy workaround avoiding undefined behavior for rigged meshes with invalid joints. --- indra/newview/lldrawpoolavatar.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 6bbb66fbc..eba3d2606 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1575,6 +1575,10 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* for (U32 j = 0; j < count; ++j) { LLJoint* joint = avatar->getJoint(skin->mJointNames[j]); + if(!joint) + { + joint = avatar->getJoint("mRoot"); + } if (joint) { mat[j] = skin->mInvBindMatrix[j]; @@ -1703,6 +1707,10 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) for (U32 i = 0; i < count; ++i) { LLJoint* joint = avatar->getJoint(skin->mJointNames[i]); + if(!joint) + { + joint = avatar->getJoint("mRoot"); + } if (joint) { mat[i] = skin->mInvBindMatrix[i];