Merge branch 'master' of git://github.com/Shyotl/SingularityViewer
This commit is contained in:
@@ -4737,7 +4737,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
|
||||
LLStrider<LLVector3> normal_strider;
|
||||
LLStrider<LLVector2> tc_strider;
|
||||
LLStrider<U16> index_strider;
|
||||
LLStrider<LLVector4> weights_strider;
|
||||
LLStrider<LLVector4a> weights_strider;
|
||||
|
||||
vb->getVertexStrider(vertex_strider);
|
||||
vb->getIndexStrider(index_strider);
|
||||
@@ -4780,7 +4780,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
|
||||
w.mV[i] = joint + wght;
|
||||
}
|
||||
|
||||
*(weights_strider++) = w;
|
||||
(*(weights_strider++)).loadua(w.mV);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5417,71 +5417,11 @@ BOOL LLModelPreview::render()
|
||||
for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
|
||||
{
|
||||
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
|
||||
|
||||
const LLVolumeFace& face = model->getVolumeFace(i);
|
||||
|
||||
LLStrider<LLVector3> position;
|
||||
buffer->getVertexStrider(position);
|
||||
|
||||
LLStrider<LLVector4> weight;
|
||||
LLStrider<LLVector4a> weight;
|
||||
buffer->getWeight4Strider(weight);
|
||||
|
||||
//quick 'n dirty software vertex skinning
|
||||
|
||||
//build matrix palette
|
||||
|
||||
LLMatrix4 mat[64];
|
||||
for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
|
||||
{
|
||||
LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]);
|
||||
if (joint)
|
||||
{
|
||||
mat[j] = model->mSkinInfo.mInvBindMatrix[j];
|
||||
mat[j] *= joint->getWorldMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
for (S32 j = 0; j < buffer->getNumVerts(); ++j)
|
||||
{
|
||||
LLMatrix4 final_mat;
|
||||
final_mat.mMatrix[0][0] = final_mat.mMatrix[1][1] = final_mat.mMatrix[2][2] = final_mat.mMatrix[3][3] = 0.f;
|
||||
|
||||
LLVector4 wght;
|
||||
S32 idx[4];
|
||||
|
||||
F32 scale = 0.f;
|
||||
for (U32 k = 0; k < 4; k++)
|
||||
{
|
||||
F32 w = weight[j].mV[k];
|
||||
|
||||
idx[k] = (S32) floorf(w);
|
||||
wght.mV[k] = w - floorf(w);
|
||||
scale += wght.mV[k];
|
||||
}
|
||||
|
||||
wght *= 1.f/scale;
|
||||
|
||||
for (U32 k = 0; k < 4; k++)
|
||||
{
|
||||
F32* src = (F32*) mat[idx[k]].mMatrix;
|
||||
F32* dst = (F32*) final_mat.mMatrix;
|
||||
|
||||
F32 w = wght.mV[k];
|
||||
|
||||
for (U32 l = 0; l < 16; l++)
|
||||
{
|
||||
dst[l] += src[l]*w;
|
||||
}
|
||||
}
|
||||
|
||||
//VECTORIZE THIS
|
||||
LLVector3 v(face.mPositions[j].getF32ptr());
|
||||
|
||||
v = v * model->mSkinInfo.mBindShapeMatrix;
|
||||
v = v * final_mat;
|
||||
|
||||
position[j] = v;
|
||||
}
|
||||
getPreviewAvatar()->updateSoftwareSkinnedVertices(&model->mSkinInfo, weight.get(), face, buffer);
|
||||
|
||||
const std::string& binding = instance.mModel->mMaterialList[i];
|
||||
const LLImportMaterial& material = instance.mMaterial[binding];
|
||||
|
||||
Reference in New Issue
Block a user