diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2015-09-01 11:35:55 -0400 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2015-09-01 11:35:55 -0400 |
commit | dbc5b757c5059a0efa3b5e23c060b8b48a1761f6 (patch) | |
tree | c016923d6c35a35de51f08d9d3a6c2220fcf634b /indra/newview/llvovolume.cpp | |
parent | 2ea8df0593d520b86bcf958263622218f76ac113 (diff) | |
parent | 98166af9c711e63b5fedbf2227d3eb2e5fca8600 (diff) |
merge
Diffstat (limited to 'indra/newview/llvovolume.cpp')
-rwxr-xr-x | indra/newview/llvovolume.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 7bbaf981ae..f70280d8c1 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4175,6 +4175,8 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons LLJoint* joint = avatar->getJoint(skin->mJointNames[j]); if (!joint) { + // Fall back to a point inside the avatar if mesh is + // rigged to an unknown joint. joint = avatar->getJoint("mPelvis"); } if (joint) @@ -4182,6 +4184,12 @@ 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) @@ -4221,8 +4229,21 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons wght[k] = w - floorf(w); scale += wght[k]; } - - wght *= 1.f/scale; + 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; + } for (U32 k = 0; k < 4; k++) { @@ -4230,9 +4251,8 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons LLMatrix4a src; // Insure ref'd bone is in our clamped array of mats - llassert(idx[k] < kMaxJoints); - // clamp k to kMaxJoints to avoid reading garbage off stack in release - src.setMul(mp[idx[(k < kMaxJoints) ? k : 0]], w); + // clamp idx to maxJoints to avoid reading garbage off stack in release + src.setMul(mp[(idx[k]<maxJoints)?idx[k]:0], w); final_mat.add(src); } |