diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2016-10-18 16:05:35 -0400 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2016-10-18 16:05:35 -0400 |
commit | 8230a9937f3bded847dae6c33e01b44158a7f8ee (patch) | |
tree | 77ecbe9a9d6796b3704d0b6a13d6ebfe2f07eec6 /indra | |
parent | 801a628cc116954f589d8478d5cfa06998db6beb (diff) |
MAINT-6841 - removed the joint remapping code, since it was designed to support a feature we no longer have. This also incidentally fixes any bugs caused by the joint remapping code.
Diffstat (limited to 'indra')
-rw-r--r-- | indra/llmath/llvolume.cpp | 3 | ||||
-rw-r--r-- | indra/llmath/llvolume.h | 4 | ||||
-rw-r--r-- | indra/llprimitive/llmodel.h | 1 | ||||
-rw-r--r-- | indra/newview/lldrawpoolavatar.cpp | 8 | ||||
-rw-r--r-- | indra/newview/llskinningutil.cpp | 224 | ||||
-rw-r--r-- | indra/newview/llskinningutil.h | 6 | ||||
-rw-r--r-- | indra/newview/llvoavatar.cpp | 1 |
7 files changed, 13 insertions, 234 deletions
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index ac6f77b5ab..d57fe81de4 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -4572,7 +4572,6 @@ LLVolumeFace::LLVolumeFace() : mTexCoords(NULL), mIndices(NULL), mWeights(NULL), - mWeightsRemapped(FALSE), mOctree(NULL), mOptimized(FALSE) { @@ -4598,7 +4597,6 @@ LLVolumeFace::LLVolumeFace(const LLVolumeFace& src) mTexCoords(NULL), mIndices(NULL), mWeights(NULL), - mWeightsRemapped(FALSE), mOctree(NULL) { mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); @@ -4670,7 +4668,6 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) ll_aligned_free_16(mWeights); mWeights = NULL; } - mWeightsRemapped = src.mWeightsRemapped; } if (mNumIndices) diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index 33e1403a14..1da2d0c6b1 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -953,10 +953,6 @@ public: // mWeights.size() should be empty or match mVertices.size() LLVector4a* mWeights; - // Whether or not the weights have been cleaned up and remapped - // based on currently supported joints. - mutable BOOL mWeightsRemapped; - LLOctreeNode<LLVolumeTriangle>* mOctree; //whether or not face has been cache optimized diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 2034686529..365ba8a51c 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -52,7 +52,6 @@ public: mutable std::vector<S32> mJointNums; std::vector<LLMatrix4> mInvBindMatrix; std::vector<LLMatrix4> mAlternateBindMatrix; - std::vector<U32> mJointRemap; LLMatrix4 mBindShapeMatrix; float mPelvisOffset; diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index e9524189ed..517c69305a 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1550,19 +1550,13 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer( return; } // FIXME ugly const cast - LLSkinningUtil::remapSkinInfoJoints(avatar, const_cast<LLMeshSkinInfo*>(skin)); + LLSkinningUtil::scrubInvalidJoints(avatar, const_cast<LLMeshSkinInfo*>(skin)); LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer(); LLDrawable* drawable = face->getDrawable(); U32 data_mask = face->getRiggedVertexBufferDataMask(); - if (!vol_face.mWeightsRemapped) - { - LLSkinningUtil::remapSkinWeights(weight, vol_face.mNumVertices, skin); - vol_face.mWeightsRemapped = TRUE; - } - if (buffer.isNull() || buffer->getTypeMask() != data_mask || buffer->getNumVerts() != vol_face.mNumVertices || diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp index 3ad30dac69..c0589e33bb 100644 --- a/indra/newview/llskinningutil.cpp +++ b/indra/newview/llskinningutil.cpp @@ -32,97 +32,15 @@ #include "llviewercontrol.h" #include "llmeshrepository.h" -bool LLSkinningUtil::sIncludeEnhancedSkeleton = true; - -namespace { - -bool get_name_index(const std::string& name, std::vector<std::string>& names, U32& result) -{ - std::vector<std::string>::const_iterator find_it = - std::find(names.begin(), names.end(), name); - if (find_it != names.end()) - { - result = find_it - names.begin(); - return true; - } - else - { - return false; - } -} - -// Find a name table index that is also a valid joint on the -// avatar. Order of preference is: requested name, mPelvis, first -// valid match in names table. -U32 get_valid_joint_index(const std::string& name, LLVOAvatar *avatar, std::vector<std::string>& joint_names) -{ - U32 result; - if (avatar->getJoint(name) && get_name_index(name,joint_names,result)) - { - return result; - } - if (get_name_index("mPelvis",joint_names,result)) - { - return result; - } - for (U32 j=0; j<joint_names.size(); j++) - { - if (avatar->getJoint(joint_names[j])) - { - return j; - } - } - // Shouldn't ever get here, because of the name cleanup pass in remapSkinInfoJoints() - LL_ERRS() << "no valid joints in joint_names" << LL_ENDL; - return 0; -} - -// Which joint will stand in for this joint? -U32 get_proxy_joint_index(U32 joint_index, LLVOAvatar *avatar, std::vector<std::string>& joint_names) -{ - bool include_enhanced = LLSkinningUtil::sIncludeEnhancedSkeleton; - U32 j_proxy = get_valid_joint_index(joint_names[joint_index], avatar, joint_names); - LLJoint *joint = avatar->getJoint(joint_names[j_proxy]); - llassert(joint); - // Find the first ancestor that's not flagged as extended, or the - // last ancestor that's rigged in this mesh, whichever - // comes first. - while (1) - { - if (include_enhanced || - joint->getSupport()==LLJoint::SUPPORT_BASE) - break; - LLJoint *parent = joint->getParent(); - if (!parent) - break; - if (!get_name_index(parent->getName(), joint_names, j_proxy)) - { - break; - } - joint = parent; - } - return j_proxy; -} - -} - // static void LLSkinningUtil::initClass() { - sIncludeEnhancedSkeleton = gSavedSettings.getBOOL("IncludeEnhancedSkeleton"); } // static U32 LLSkinningUtil::getMaxJointCount() { U32 result = LL_MAX_JOINTS_PER_MESH_OBJECT; - if (!sIncludeEnhancedSkeleton) - { - // Currently the remap logic does not guarantee joint count <= 52; - // if one of the base ancestors is not rigged in a given mesh, an extended - // joint can still be included. - result = llmin(result,(U32)52); - } return result; } @@ -133,33 +51,8 @@ U32 LLSkinningUtil::getMeshJointCount(const LLMeshSkinInfo *skin) } // static - -// Destructively remap the joints in skin info based on what joints -// are known in the avatar, and which are currently supported. This -// will also populate mJointRemap[] in the skin, which can be used to -// make the corresponding changes to the integer part of vertex -// weights. -// -// This will throw away joint info for any joints that are not known -// in the avatar, or not currently flagged to support based on the -// debug setting for IncludeEnhancedSkeleton. -// - -// BENTO maybe this really only makes sense for new leaf joints? New spine -// joints may need different logic. - -// static -void LLSkinningUtil::remapSkinInfoJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin) +void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin) { - // skip if already done. - if (!skin->mJointRemap.empty()) - { - return; - } - - U32 max_joints = getMeshJointCount(skin); - - // Compute the remap for (U32 j = 0; j < skin->mJointNames.size(); ++j) { // Fix invalid names to "mPelvis". Currently meshes with @@ -170,70 +63,6 @@ void LLSkinningUtil::remapSkinInfoJoints(LLVOAvatar *avatar, LLMeshSkinInfo* ski skin->mJointNames[j] = "mPelvis"; } } - std::vector<U32> j_proxy(skin->mJointNames.size()); - for (U32 j = 0; j < skin->mJointNames.size(); ++j) - { - U32 j_rep = get_proxy_joint_index(j, avatar, skin->mJointNames); - j_proxy[j] = j_rep; - } - S32 top = 0; - std::vector<U32> j_remap(skin->mJointNames.size()); - // Fill in j_remap for all joints that will be kept. - for (U32 j = 0; j < skin->mJointNames.size(); ++j) - { - if (j_proxy[j] == j) - { - // Joint will be included - j_remap[j] = top; - if (top < max_joints-1) - { - top++; - } - } - } - // Then use j_proxy to fill in j_remap for the joints that will be discarded - for (U32 j = 0; j < skin->mJointNames.size(); ++j) - { - if (j_proxy[j] != j) - { - j_remap[j] = j_remap[j_proxy[j]]; - } - } - - - // Apply the remap to mJointNames, mInvBindMatrix, and mAlternateBindMatrix - std::vector<std::string> new_joint_names; - std::vector<S32> new_joint_nums; - std::vector<LLMatrix4> new_inv_bind_matrix; - std::vector<LLMatrix4> new_alternate_bind_matrix; - - for (U32 j = 0; j < skin->mJointNames.size(); ++j) - { - if (j_proxy[j] == j && new_joint_names.size() < max_joints) - { - new_joint_names.push_back(skin->mJointNames[j]); - new_joint_nums.push_back(-1); - new_inv_bind_matrix.push_back(skin->mInvBindMatrix[j]); - if (!skin->mAlternateBindMatrix.empty()) - { - new_alternate_bind_matrix.push_back(skin->mAlternateBindMatrix[j]); - } - } - } - llassert(new_joint_names.size() <= max_joints); - - for (U32 j = 0; j < skin->mJointNames.size(); ++j) - { - if (skin->mJointNames[j] != new_joint_names[j_remap[j]]) - { - LL_DEBUGS("Avatar") << "Starting joint[" << j << "] = " << skin->mJointNames[j] << " j_remap " << j_remap[j] << " ==> " << new_joint_names[j_remap[j]] << LL_ENDL; - } - } - - skin->mJointNames = new_joint_names; - skin->mInvBindMatrix = new_inv_bind_matrix; - skin->mAlternateBindMatrix = new_alternate_bind_matrix; - skin->mJointRemap = j_remap; } // static @@ -278,61 +107,30 @@ void LLSkinningUtil::initSkinningMatrixPalette( // This shouldn't happen - in mesh upload, skinned // rendering should be disabled unless all joints are // valid. In other cases of skinned rendering, invalid - // joints should already have been removed during remap. + // joints should already have been removed during scrubInvalidJoints(). LL_WARNS_ONCE("Avatar") << "Rigged to invalid joint name " << skin->mJointNames[j] << LL_ENDL; } } } -// Transform the weights based on the remap info stored in skin. Note -// that this is destructive and non-idempotent, so we need to keep -// track of whether we've done it already. If the desired remapping -// changes, the viewer must be restarted. -// // static -void LLSkinningUtil::remapSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin) +void LLSkinningUtil::checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin) { - checkSkinWeights(weights, num_vertices, skin); - llassert(skin->mJointRemap.size()>0); // Must call remapSkinInfoJoints() first, which this checks for. - const U32* remap = &skin->mJointRemap[0]; - const S32 max_joints = skin->mJointRemap.size(); +#ifndef LL_RELEASE_FOR_DOWNLOAD + const S32 max_joints = skin->mJointNames.size(); for (U32 j=0; j<num_vertices; j++) { F32 *w = weights[j].getF32ptr(); - + + F32 wsum = 0.0; for (U32 k=0; k<4; ++k) { S32 i = llfloor(w[k]); - F32 f = w[k]-i; - i = llclamp(i,0,max_joints-1); - w[k] = remap[i] + f; - } - } - checkSkinWeights(weights, num_vertices, skin); -} - -// static -void LLSkinningUtil::checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin) -{ -#ifndef LL_RELEASE_FOR_DOWNLOAD - const S32 max_joints = skin->mJointRemap.size(); - if (skin->mJointRemap.size()>0) - { - // Check the weights are consistent with the current remap. - for (U32 j=0; j<num_vertices; j++) - { - F32 *w = weights[j].getF32ptr(); - - F32 wsum = 0.0; - for (U32 k=0; k<4; ++k) - { - S32 i = llfloor(w[k]); - llassert(i>=0); - llassert(i<max_joints); - wsum += w[k]-i; - } - llassert(wsum > 0.0f); + llassert(i>=0); + llassert(i<max_joints); + wsum += w[k]-i; } + llassert(wsum > 0.0f); } #endif } diff --git a/indra/newview/llskinningutil.h b/indra/newview/llskinningutil.h index 9a28100dc3..6a6091114c 100644 --- a/indra/newview/llskinningutil.h +++ b/indra/newview/llskinningutil.h @@ -37,14 +37,10 @@ public: static void initClass(); static U32 getMaxJointCount(); static U32 getMeshJointCount(const LLMeshSkinInfo *skin); - static void remapSkinInfoJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin); + static void scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin); static void initSkinningMatrixPalette(LLMatrix4* mat, S32 count, const LLMeshSkinInfo* skin, LLVOAvatar *avatar); static void checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin); - static void remapSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin); static void getPerVertexSkinMatrix(F32* weights, LLMatrix4a* mat, bool handle_bad_scale, LLMatrix4a& final_mat, U32 max_joints); - - // This is initialized from gSavedSettings at startup and then left alone. - static bool sIncludeEnhancedSkeleton; }; #endif diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 1ff4c1f681..46c367b4e6 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -6001,7 +6001,6 @@ void LLVOAvatar::initAttachmentPoints(bool ignore_hud_joints) attachment->setIsHUDAttachment(info->mIsHUDAttachment); // attachment can potentially be animated, needs a number. attachment->setJointNum(mNumBones + mNumCollisionVolumes + attachmentID - 1); - LL_WARNS() << "Initialized attachment" << attachment->getName() << " joint_num " << attachment->getJointNum() << LL_ENDL; if (newly_created) { |