summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2015-09-14 11:05:08 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2015-09-14 11:05:08 -0400
commit7f19cb367e6182fff78d66738087601470faa9fa (patch)
tree1f70a2f5a05479013ef019877dae554e1ee8f339 /indra/newview
parent9d44aaab46eff6d16ff50d8b6c12df821f637761 (diff)
parent6b2c1d5f104047af8aa71d01b7d8fbe9a0ad3493 (diff)
merge
Diffstat (limited to 'indra/newview')
-rwxr-xr-xindra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl3
-rwxr-xr-xindra/newview/lldrawpoolavatar.cpp38
-rwxr-xr-xindra/newview/llvovolume.cpp27
3 files changed, 20 insertions, 48 deletions
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index d3eed775bf..b342abb7c1 100755
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -40,8 +40,7 @@ mat4 getObjectSkinnedTransform()
index = min(index, vec4(151.0));
index = max(index, vec4( 0.0));
- float scale = 1.0/(w.x+w.y+w.z+w.w);
- w *= scale;
+ w *= 1.0/(w.x+w.y+w.z+w.w);
int i1 = int(index.x);
int i2 = int(index.y);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 9dd4c2ce0d..f1bfe4ecb2 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1554,7 +1554,8 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
{
if (drawable && drawable->isState(LLDrawable::REBUILD_ALL))
- { //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
+ {
+ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
for (S32 i = 0; i < drawable->getNumFaces(); ++i)
{
LLFace* facep = drawable->getFace(i);
@@ -1571,13 +1572,15 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
buffer = face->getVertexBuffer();
}
else
- { //just rebuild this face
+ {
+ //just rebuild this face
getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
}
}
if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
- { //perform software vertex skinning for this face
+ {
+ //perform software vertex skinning for this face
LLStrider<LLVector3> position;
LLStrider<LLVector3> normal;
@@ -1605,10 +1608,6 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
{
joint = avatar->getJoint("mPelvis");
}
- if (!joint)
- {
- LL_DEBUGS("Avatar") << "Failed to find " << skin->mJointNames[j] << LL_ENDL;
- }
if (joint)
{
mat[j] = skin->mInvBindMatrix[j];
@@ -1633,27 +1632,14 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
{
F32 w = weight[j][k];
- idx[k] = llclamp((S32) floorf(w), 0, JOINT_COUNT-1);
+ idx[k] = llclamp((S32) floorf(w), (S32)0, (S32)JOINT_COUNT-1);
wght[k] = w - floorf(w);
scale += wght[k];
}
-
- if (scale > 0.f)
- {
- wght *= 1.f/scale;
- }
- else
- {
- // Complete weighting fail - all zeroes. Just
- // pick some values that add up to 1.0 so we
- // don't wind up with garbage vertices
- // pointing off at (0,0,0)
- wght[0] = 1.f;
- wght[1] = 0.f;
- wght[2] = 0.f;
- wght[3] = 0.f;
- }
+ // This is enforced in unpackVolumeFaces()
+ llassert(scale>0.f);
+ wght *= 1.f/scale;
for (U32 k = 0; k < 4; k++)
{
@@ -1752,6 +1738,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("mPelvis");
+ }
if (joint)
{
mat[i] = skin->mInvBindMatrix[i];
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 25e61c259f..eefe452c14 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4184,12 +4184,6 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
mat[j] = skin->mInvBindMatrix[j];
mat[j] *= joint->getWorldMatrix();
}
- else
- {
- // This shouldn't be possible unless the avatar skeleton
- // is corrupt.
- llassert(false);
- }
}
for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
@@ -4229,21 +4223,9 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
wght[k] = w - floorf(w);
scale += wght[k];
}
- if (scale > 0.f)
- {
- wght *= 1.f / scale;
- }
- else
- {
- // Complete weighting fail - all zeroes. Just
- // pick some values that add up to 1.0 so we
- // don't wind up with garbage vertices
- // pointing off at (0,0,0)
- wght[0] = 1.f;
- wght[1] = 0.f;
- wght[2] = 0.f;
- wght[3] = 0.f;
- }
+ // This is enforced in unpackVolumeFaces()
+ llassert(scale>0.f);
+ wght *= 1.f / scale;
for (U32 k = 0; k < 4; k++)
{
@@ -4252,7 +4234,8 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
LLMatrix4a src;
// Insure ref'd bone is in our clamped array of mats
// clamp idx to maxJoints to avoid reading garbage off stack in release
- src.setMul(mp[(idx[k]<maxJoints)?idx[k]:0], w);
+ S32 index = llclamp((S32)idx[k],(S32)0,(S32)kMaxJoints-1);
+ src.setMul(mp[index], w);
final_mat.add(src);
}