summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2016-10-18 16:05:35 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2016-10-18 16:05:35 -0400
commit8230a9937f3bded847dae6c33e01b44158a7f8ee (patch)
tree77ecbe9a9d6796b3704d0b6a13d6ebfe2f07eec6 /indra
parent801a628cc116954f589d8478d5cfa06998db6beb (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.cpp3
-rw-r--r--indra/llmath/llvolume.h4
-rw-r--r--indra/llprimitive/llmodel.h1
-rw-r--r--indra/newview/lldrawpoolavatar.cpp8
-rw-r--r--indra/newview/llskinningutil.cpp224
-rw-r--r--indra/newview/llskinningutil.h6
-rw-r--r--indra/newview/llvoavatar.cpp1
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)
{