diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index 6dbbd52fa325fe726b6b0380eb8516eaf273e3ba..67643c4c1c2f3941642b7d12e72a70f63bee3a5f 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -1466,19 +1466,18 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do mat.mMatrix[i][j] = transform[k*16 + i + j*4]; } } - model->mSkinInfo.mInvBindMatrix.push_back(LLMatrix4a(mat)); + + LLMatrix4a inv_bind(mat); + model->mSkinInfo.mInvBindMatrix.push_back(inv_bind); + LLMatrix4a inv_bind_shape; + inv_bind_shape.setMul(inv_bind, model->mSkinInfo.mBindShapeMatrix); + model->mSkinInfo.mInvBindShapeMatrix.push_back(inv_bind_shape); } } } } } - model->mSkinInfo.mInvBindShapeMatrix.resize(llmin(model->mSkinInfo.mInvBindMatrix.size(), (size_t)216)); - for (U32 i = 0; i < model->mSkinInfo.mInvBindShapeMatrix.size(); ++i) - { - model->mSkinInfo.mInvBindShapeMatrix[i].setMul(model->mSkinInfo.mInvBindMatrix[i], model->mSkinInfo.mBindShapeMatrix); - } - //Now that we've parsed the joint array, let's determine if we have a full rig //(which means we have all the joint sthat are required for an avatar versus //a skinned asset attached to a node in a file that contains an entire skeleton, diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 60f03cd9db7c49e96f4a90a226260ea242950a72..142b9823c150148c278db03044e80ef0540a3428 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1450,6 +1450,20 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin) } } + if (skin.has("bind_shape_matrix")) + { + const auto& bind_shape_mat = skin["bind_shape_matrix"]; + LLMatrix4 mat; + for (auto j = 0; j < 4; j++) + { + for (auto k = 0; k < 4; k++) + { + mat.mMatrix[j][k] = bind_shape_mat[j*4+k].asReal(); + } + } + mBindShapeMatrix.loadu(mat); + } + if (skin.has("inverse_bind_matrix")) { const auto& inv_bind_mat = skin["inverse_bind_matrix"]; @@ -1464,7 +1478,12 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin) } } - mInvBindMatrix.push_back(LLMatrix4a(mat)); + LLMatrix4a inv_bind(mat); + mInvBindMatrix.push_back(inv_bind); + + LLMatrix4a inv_bind_shape; + inv_bind_shape.setMul(inv_bind, mBindShapeMatrix); + mInvBindShapeMatrix.push_back(inv_bind_shape); } if (mJointNames.size() != mInvBindMatrix.size()) @@ -1476,26 +1495,6 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin) } } - if (skin.has("bind_shape_matrix")) - { - const auto& bind_shape_mat = skin["bind_shape_matrix"]; - LLMatrix4 mat; - for (auto j = 0; j < 4; j++) - { - for (auto k = 0; k < 4; k++) - { - mat.mMatrix[j][k] = bind_shape_mat[j*4+k].asReal(); - } - } - mBindShapeMatrix.loadu(mat); - } - - mInvBindShapeMatrix.resize(llmin(mInvBindMatrix.size(), (size_t)216)); - for (U32 i = 0; i < mInvBindShapeMatrix.size(); ++i) - { - mInvBindShapeMatrix[i].setMul(mInvBindMatrix[i], mBindShapeMatrix); - } - if (skin.has("alt_inverse_bind_matrix")) { const auto& alt_inv_bind_mat = skin["alt_inverse_bind_matrix"];