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)          { | 
