Updated Skinning code

Former-commit-id: ae608042061847b2f710abce8101eb008ef2a661
This commit is contained in:
Lynix 2014-07-08 11:31:14 +02:00
parent d3c3ad5bb8
commit f19b89f947
3 changed files with 24 additions and 37 deletions

View File

@ -19,10 +19,8 @@
struct NzSkinningData struct NzSkinningData
{ {
const NzJoint* joints; const NzJoint* joints;
const NzMeshVertex* inputVertex; const NzSkeletalMeshVertex* inputVertex;
NzMeshVertex* outputVertex; NzMeshVertex* outputVertex;
const NzVertexWeight* vertexWeights;
const NzWeight* weights;
}; };
NAZARA_API void NzComputeBoxIndexVertexCount(const NzVector3ui& subdivision, unsigned int* indexCount, unsigned int* vertexCount); NAZARA_API void NzComputeBoxIndexVertexCount(const NzVector3ui& subdivision, unsigned int* indexCount, unsigned int* vertexCount);

View File

@ -103,28 +103,26 @@ namespace
void Skin_MonoCPU(const NzSkeletalMesh* mesh, const NzSkeleton* skeleton, NzVertexBuffer* buffer) void Skin_MonoCPU(const NzSkeletalMesh* mesh, const NzSkeleton* skeleton, NzVertexBuffer* buffer)
{ {
NzBufferMapper<NzVertexBuffer> mapper(buffer, nzBufferAccess_DiscardAndWrite); NzBufferMapper<NzVertexBuffer> inputMapper(mesh->GetVertexBuffer(), nzBufferAccess_ReadOnly);
NzBufferMapper<NzVertexBuffer> outputMapper(buffer, nzBufferAccess_DiscardAndWrite);
NzSkinningData skinningData; NzSkinningData skinningData;
skinningData.inputVertex = mesh->GetBindPoseBuffer(); skinningData.inputVertex = static_cast<NzSkeletalMeshVertex*>(inputMapper.GetPointer());
skinningData.outputVertex = static_cast<NzMeshVertex*>(mapper.GetPointer()); skinningData.outputVertex = static_cast<NzMeshVertex*>(outputMapper.GetPointer());
skinningData.joints = skeleton->GetJoints(); skinningData.joints = skeleton->GetJoints();
skinningData.vertexWeights = mesh->GetVertexWeight(0);
skinningData.weights = mesh->GetWeight(0);
NzSkinPositionNormalTangent(skinningData, 0, mesh->GetVertexCount()); NzSkinPositionNormalTangent(skinningData, 0, mesh->GetVertexCount());
} }
void Skin_MultiCPU(const NzSkeletalMesh* mesh, const NzSkeleton* skeleton, NzVertexBuffer* buffer) void Skin_MultiCPU(const NzSkeletalMesh* mesh, const NzSkeleton* skeleton, NzVertexBuffer* buffer)
{ {
NzBufferMapper<NzVertexBuffer> mapper(buffer, nzBufferAccess_DiscardAndWrite); NzBufferMapper<NzVertexBuffer> inputMapper(mesh->GetVertexBuffer(), nzBufferAccess_ReadOnly);
NzBufferMapper<NzVertexBuffer> outputMapper(buffer, nzBufferAccess_DiscardAndWrite);
NzSkinningData skinningData; NzSkinningData skinningData;
skinningData.inputVertex = mesh->GetBindPoseBuffer(); skinningData.inputVertex = static_cast<NzSkeletalMeshVertex*>(inputMapper.GetPointer());
skinningData.outputVertex = static_cast<NzMeshVertex*>(mapper.GetPointer()); skinningData.outputVertex = static_cast<NzMeshVertex*>(outputMapper.GetPointer());
skinningData.joints = skeleton->GetJoints(); skinningData.joints = skeleton->GetJoints();
skinningData.vertexWeights = mesh->GetVertexWeight(0);
skinningData.weights = mesh->GetWeight(0);
// Afin d'empêcher les différents threads de vouloir mettre à jour la même matrice en même temps, // Afin d'empêcher les différents threads de vouloir mettre à jour la même matrice en même temps,
// on se charge de la mettre à jour avant de les lancer // on se charge de la mettre à jour avant de les lancer

View File

@ -961,7 +961,7 @@ void NzGenerateUvSphere(float size, unsigned int sliceCount, unsigned int stackC
} }
} }
/************************************NzOptimize***********************************/ /**********************************NzOptimize*********************************/
void NzOptimizeIndices(NzIndexIterator indices, unsigned int indexCount) void NzOptimizeIndices(NzIndexIterator indices, unsigned int indexCount)
{ {
@ -972,23 +972,20 @@ void NzOptimizeIndices(NzIndexIterator indices, unsigned int indexCount)
/************************************NzSkin***********************************/ /************************************NzSkin***********************************/
void NzSkinPosition(const NzSkinningData& data, unsigned int startVertex, unsigned int vertexCount) void NzSkinPosition(const NzSkinningData& skinningInfos, unsigned int startVertex, unsigned int vertexCount)
{ {
const NzMeshVertex* inputVertex = &data.inputVertex[startVertex]; const NzSkeletalMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex];
NzMeshVertex* outputVertex = &data.outputVertex[startVertex]; NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex];
unsigned int endVertex = startVertex + vertexCount - 1; unsigned int endVertex = startVertex + vertexCount - 1;
for (unsigned int i = startVertex; i <= endVertex; ++i) for (unsigned int i = startVertex; i <= endVertex; ++i)
{ {
NzVector3f finalPosition(NzVector3f::Zero()); NzVector3f finalPosition(NzVector3f::Zero());
unsigned int weightCount = data.vertexWeights[i].weights.size(); for (int j = 0; j < inputVertex->weightCount; ++j)
for (unsigned int j = 0; j < weightCount; ++j)
{ {
const NzWeight& weight = data.weights[data.vertexWeights[i].weights[j]]; NzMatrix4f mat(skinningInfos.joints[inputVertex->jointIndexes[j]].GetSkinningMatrix());
mat *= inputVertex->weights[j];
NzMatrix4f mat(data.joints[weight.jointIndex].GetSkinningMatrix());
mat *= weight.weight;
finalPosition += mat.Transform(inputVertex->position); finalPosition += mat.Transform(inputVertex->position);
} }
@ -1003,7 +1000,7 @@ void NzSkinPosition(const NzSkinningData& data, unsigned int startVertex, unsign
void NzSkinPositionNormal(const NzSkinningData& skinningInfos, unsigned int startVertex, unsigned int vertexCount) void NzSkinPositionNormal(const NzSkinningData& skinningInfos, unsigned int startVertex, unsigned int vertexCount)
{ {
const NzMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex]; const NzSkeletalMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex];
NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex]; NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex];
unsigned int endVertex = startVertex + vertexCount - 1; unsigned int endVertex = startVertex + vertexCount - 1;
@ -1012,13 +1009,10 @@ void NzSkinPositionNormal(const NzSkinningData& skinningInfos, unsigned int star
NzVector3f finalPosition(NzVector3f::Zero()); NzVector3f finalPosition(NzVector3f::Zero());
NzVector3f finalNormal(NzVector3f::Zero()); NzVector3f finalNormal(NzVector3f::Zero());
unsigned int weightCount = skinningInfos.vertexWeights[i].weights.size(); for (int j = 0; j < inputVertex->weightCount; ++j)
for (unsigned int j = 0; j < weightCount; ++j)
{ {
const NzWeight& weight = skinningInfos.weights[skinningInfos.vertexWeights[i].weights[j]]; NzMatrix4f mat(skinningInfos.joints[inputVertex->jointIndexes[j]].GetSkinningMatrix());
mat *= inputVertex->weights[j];
NzMatrix4f mat(skinningInfos.joints[weight.jointIndex].GetSkinningMatrix());
mat *= weight.weight;
finalPosition += mat.Transform(inputVertex->position); finalPosition += mat.Transform(inputVertex->position);
finalNormal += mat.Transform(inputVertex->normal, 0.f); finalNormal += mat.Transform(inputVertex->normal, 0.f);
@ -1037,7 +1031,7 @@ void NzSkinPositionNormal(const NzSkinningData& skinningInfos, unsigned int star
void NzSkinPositionNormalTangent(const NzSkinningData& skinningInfos, unsigned int startVertex, unsigned int vertexCount) void NzSkinPositionNormalTangent(const NzSkinningData& skinningInfos, unsigned int startVertex, unsigned int vertexCount)
{ {
const NzMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex]; const NzSkeletalMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex];
NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex]; NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex];
unsigned int endVertex = startVertex + vertexCount - 1; unsigned int endVertex = startVertex + vertexCount - 1;
@ -1047,13 +1041,10 @@ void NzSkinPositionNormalTangent(const NzSkinningData& skinningInfos, unsigned i
NzVector3f finalNormal(NzVector3f::Zero()); NzVector3f finalNormal(NzVector3f::Zero());
NzVector3f finalTangent(NzVector3f::Zero()); NzVector3f finalTangent(NzVector3f::Zero());
unsigned int weightCount = skinningInfos.vertexWeights[i].weights.size(); for (int j = 0; j < inputVertex->weightCount; ++j)
for (unsigned int j = 0; j < weightCount; ++j)
{ {
const NzWeight& weight = skinningInfos.weights[skinningInfos.vertexWeights[i].weights[j]]; NzMatrix4f mat(skinningInfos.joints[inputVertex->jointIndexes[j]].GetSkinningMatrix());
mat *= inputVertex->weights[j];
NzMatrix4f mat(skinningInfos.joints[weight.jointIndex].GetSkinningMatrix());
mat *= weight.weight;
finalPosition += mat.Transform(inputVertex->position); finalPosition += mat.Transform(inputVertex->position);
finalNormal += mat.Transform(inputVertex->normal, 0.f); finalNormal += mat.Transform(inputVertex->normal, 0.f);