develop
kaetemi 4 years ago
parent c6f8baa058
commit bb03f80d84
No known key found for this signature in database
GPG Key ID: 9873C4D40BB479BC

@ -775,9 +775,8 @@ void CMeshGeom::renderSkin(CTransformShape *trans, float alphaMRM)
{
uint maxVertices = meshSkinManager->getMaxVertices();
uint vertexSize = meshSkinManager->getVertexSize();
nlassert(vertexSize == 32);
if (_OriginalSkinVertices.size() <= maxVertices)
if (maxVertices >= _OriginalSkinVertices.size() && vertexSize == 32)
{
// apply the skinning
uint8 *dstVb = meshSkinManager->lock();
@ -787,7 +786,7 @@ void CMeshGeom::renderSkin(CTransformShape *trans, float alphaMRM)
else
{
supportVertexStream = false;
nlwarning("Unable to animate skinned model, too many vertices");
nlwarning("Unable to animate skinned model, too many vertices, or stream format unsupported");
}
}
else
@ -795,9 +794,6 @@ void CMeshGeom::renderSkin(CTransformShape *trans, float alphaMRM)
nlwarning("Unable to animate skinned model, unsupported vertex format");
}
// apply the skinning: _VBuffer is modified.
// applySkin(skeleton);
// Setup meshVertexProgram
//===========
@ -1837,26 +1833,13 @@ void CMeshGeom::applySkin(void *dstVb, CSkeletonModel *skeleton)
return;
// Use correct skinning
TSkinType skinType;
if( _OriginalSkinNormals.empty() )
skinType= SkinPosOnly;
else if( _OriginalTGSpace.empty() )
skinType= SkinWithNormal;
else
skinType= SkinWithTgSpace;
nlassert(skinType == SkinWithNormal); // Only support the streamable vertex buffer format
nlassert(!_OriginalSkinNormals.empty());
nlassert(_OriginalTGSpace.empty());
// Get VB src/dst info/ptrs.
uint numVertices= (uint)_OriginalSkinVertices.size();
static const uint dstStride = 32; // _VBuffer.getVertexSize();
uint srcStride = _VBuffer.getVertexSize();
// Get dst TgSpace.
uint tgSpaceStage = 0;
if( skinType>= SkinWithTgSpace)
{
nlassert(_VBuffer.getNumTexCoordUsed() > 0);
tgSpaceStage= _VBuffer.getNumTexCoordUsed() - 1;
}
// Mark all vertices flag to not computed.
static vector<uint8> skinFlags;
@ -1887,24 +1870,10 @@ void CMeshGeom::applySkin(void *dstVb, CSkeletonModel *skeleton)
CVector *srcVector= &_OriginalSkinVertices[0];
uint8 *srcPal= (uint8*)vba.getPaletteSkinPointer(0);
uint8 *srcWgt= (uint8*)vba.getWeightPointer(0);
uint8 *dstVector = dstVbPos; // (uint8 *)vba.getVertexCoordPointer(0);
uint8 *dstVector = dstVbPos;
// Normal.
CVector *srcNormal= NULL;
uint8 *dstNormal= NULL;
if(skinType>=SkinWithNormal)
{
srcNormal= &_OriginalSkinNormals[0];
dstNormal = dstVbNormal; // (uint8 *)vba.getNormalCoordPointer(0);
}
// TgSpace.
CVector *srcTgSpace= NULL;
uint8 *dstTgSpace= NULL;
if(skinType>=SkinWithTgSpace)
{
nlassert(false);
srcTgSpace= &_OriginalTGSpace[0];
dstTgSpace = (uint8 *)vba.getTexCoordPointer(0, tgSpaceStage);
}
CVector *srcNormal= &_OriginalSkinNormals[0];
uint8 *dstNormal = dstVbNormal;
// For all vertices that need to be computed.
uint size= numVertices;
@ -1928,12 +1897,7 @@ void CMeshGeom::applySkin(void *dstVb, CSkeletonModel *skeleton)
computeSoftwarePointSkinning(matrixes, srcVector, psPal, (float*)srcWgt, (CVector*)dstVector);
// compute normal part.
if(skinType>=SkinWithNormal)
computeSoftwareVectorSkinning(matrixes, srcNormal, psPal, (float*)srcWgt, (CVector*)dstNormal);
// compute tg part.
if(skinType>=SkinWithTgSpace)
computeSoftwareVectorSkinning(matrixes, srcTgSpace, psPal, (float*)srcWgt, (CVector*)dstTgSpace);
computeSoftwareVectorSkinning(matrixes, srcNormal, psPal, (float*)srcWgt, (CVector*)dstNormal);
}
// inc flags.
@ -1941,13 +1905,11 @@ void CMeshGeom::applySkin(void *dstVb, CSkeletonModel *skeleton)
// inc src (all whatever skin type used...)
srcVector++;
srcNormal++;
srcTgSpace++;
// inc paletteSkin and dst (all whatever skin type used...)
srcPal+= srcStride;
srcWgt+= srcStride;
dstVector+= dstStride;
dstNormal+= dstStride;
dstTgSpace+= dstStride;
}
}
@ -1983,9 +1945,6 @@ void CMeshGeom::applySkin(void *dstVb, CSkeletonModel *skeleton)
dstUV += dstStride;
}
}
// dirt
_OriginalSkinRestored= false;
}

Loading…
Cancel
Save