Merge bento-box
commit
eb06fba767
|
|
@ -4645,6 +4645,7 @@ LLVolumeFace::LLVolumeFace() :
|
|||
mTexCoords(NULL),
|
||||
mIndices(NULL),
|
||||
mWeights(NULL),
|
||||
mWeightsScrubbed(FALSE),
|
||||
mOctree(NULL),
|
||||
mOptimized(FALSE)
|
||||
{
|
||||
|
|
@ -4670,6 +4671,7 @@ LLVolumeFace::LLVolumeFace(const LLVolumeFace& src)
|
|||
mTexCoords(NULL),
|
||||
mIndices(NULL),
|
||||
mWeights(NULL),
|
||||
mWeightsScrubbed(FALSE),
|
||||
mOctree(NULL)
|
||||
{
|
||||
mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
|
||||
|
|
@ -4741,6 +4743,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
|
|||
ll_aligned_free_16(mWeights);
|
||||
mWeights = NULL;
|
||||
}
|
||||
mWeightsScrubbed = src.mWeightsScrubbed;
|
||||
}
|
||||
|
||||
if (mNumIndices)
|
||||
|
|
|
|||
|
|
@ -956,6 +956,8 @@ public:
|
|||
// mWeights.size() should be empty or match mVertices.size()
|
||||
LLVector4a* mWeights;
|
||||
|
||||
mutable BOOL mWeightsScrubbed;
|
||||
|
||||
LLOctreeNode<LLVolumeTriangle>* mOctree;
|
||||
|
||||
//whether or not face has been cache optimized
|
||||
|
|
|
|||
|
|
@ -1696,8 +1696,8 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
|
|||
LLVolume* volume,
|
||||
const LLVolumeFace& vol_face)
|
||||
{
|
||||
LLVector4a* weight = vol_face.mWeights;
|
||||
if (!weight)
|
||||
LLVector4a* weights = vol_face.mWeights;
|
||||
if (!weights)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1708,6 +1708,12 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
|
|||
LLDrawable* drawable = face->getDrawable();
|
||||
|
||||
U32 data_mask = face->getRiggedVertexBufferDataMask();
|
||||
|
||||
if (!vol_face.mWeightsScrubbed)
|
||||
{
|
||||
LLSkinningUtil::scrubSkinWeights(weights, vol_face.mNumVertices, skin);
|
||||
vol_face.mWeightsScrubbed = TRUE;
|
||||
}
|
||||
|
||||
if (buffer.isNull() ||
|
||||
buffer->getTypeMask() != data_mask ||
|
||||
|
|
@ -1762,7 +1768,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
|
|||
LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
|
||||
U32 count = LLSkinningUtil::getMeshJointCount(skin);
|
||||
LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count, skin, avatar);
|
||||
LLSkinningUtil::checkSkinWeights(weight, buffer->getNumVerts(), skin);
|
||||
LLSkinningUtil::checkSkinWeights(weights, buffer->getNumVerts(), skin);
|
||||
|
||||
LLMatrix4a bind_shape_matrix;
|
||||
bind_shape_matrix.loadu(skin->mBindShapeMatrix);
|
||||
|
|
@ -1773,8 +1779,8 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
|
|||
LLMatrix4a final_mat;
|
||||
|
||||
// <FS:ND> Use the SSE2 version
|
||||
// LLSkinningUtil::getPerVertexSkinMatrix( weight[ j ].getF32ptr(), mat, false, final_mat, max_joints );
|
||||
FSSkinningUtil::getPerVertexSkinMatrixSSE( weight[ j ], mat, false, final_mat, max_joints );
|
||||
// LLSkinningUtil::getPerVertexSkinMatrix( weights[ j ].getF32ptr(), mat, false, final_mat, max_joints );
|
||||
FSSkinningUtil::getPerVertexSkinMatrixSSE( weights[ j ], mat, false, final_mat, max_joints );
|
||||
// </FS:ND>
|
||||
|
||||
LLVector4a& v = vol_face.mPositions[j];
|
||||
|
|
|
|||
|
|
@ -64,11 +64,13 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin
|
|||
// needed for handling of any legacy bad data.
|
||||
if (!avatar->getJoint(skin->mJointNames[j]))
|
||||
{
|
||||
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
|
||||
// skin->mJointNames[ j ] = "mPelvis";
|
||||
skin->mJointNames[ j ] = JointKey::construct( "mPelvis" );
|
||||
//</FS:ND>
|
||||
}
|
||||
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
|
||||
//LL_DEBUGS("Avatar") << "Mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL;
|
||||
//skin->mJointNames[ j ] = "mPelvis";
|
||||
LL_DEBUGS("Avatar") << "Mesh rigged to invalid joint" << skin->mJointNames[j].mName << LL_ENDL;
|
||||
skin->mJointNames[ j ] = JointKey::construct( "mPelvis" );
|
||||
//</FS:ND>
|
||||
}
|
||||
}
|
||||
skin->mInvalidJointsScrubbed = true;
|
||||
}
|
||||
|
|
@ -143,6 +145,24 @@ void LLSkinningUtil::checkSkinWeights(LLVector4a* weights, U32 num_vertices, con
|
|||
#endif
|
||||
}
|
||||
|
||||
void LLSkinningUtil::scrubSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin)
|
||||
{
|
||||
const S32 max_joints = skin->mJointNames.size();
|
||||
for (U32 j=0; j<num_vertices; j++)
|
||||
{
|
||||
F32 *w = weights[j].getF32ptr();
|
||||
|
||||
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] = i + f;
|
||||
}
|
||||
}
|
||||
checkSkinWeights(weights, num_vertices, skin);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLSkinningUtil::getPerVertexSkinMatrix(
|
||||
F32* weights,
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ public:
|
|||
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 scrubSkinWeights(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);
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue