From f19b89f947529c3496e83feda42bdba659f574d1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 8 Jul 2014 11:31:14 +0200 Subject: [PATCH] Updated Skinning code Former-commit-id: ae608042061847b2f710abce8101eb008ef2a661 --- include/Nazara/Utility/Algorithm.hpp | 4 +-- src/Nazara/Graphics/SkinningManager.cpp | 18 +++++------- src/Nazara/Utility/Algorithm.cpp | 39 ++++++++++--------------- 3 files changed, 24 insertions(+), 37 deletions(-) diff --git a/include/Nazara/Utility/Algorithm.hpp b/include/Nazara/Utility/Algorithm.hpp index d168cbe94..59812fca4 100644 --- a/include/Nazara/Utility/Algorithm.hpp +++ b/include/Nazara/Utility/Algorithm.hpp @@ -19,10 +19,8 @@ struct NzSkinningData { const NzJoint* joints; - const NzMeshVertex* inputVertex; + const NzSkeletalMeshVertex* inputVertex; NzMeshVertex* outputVertex; - const NzVertexWeight* vertexWeights; - const NzWeight* weights; }; NAZARA_API void NzComputeBoxIndexVertexCount(const NzVector3ui& subdivision, unsigned int* indexCount, unsigned int* vertexCount); diff --git a/src/Nazara/Graphics/SkinningManager.cpp b/src/Nazara/Graphics/SkinningManager.cpp index 9a756ea03..9200b1186 100644 --- a/src/Nazara/Graphics/SkinningManager.cpp +++ b/src/Nazara/Graphics/SkinningManager.cpp @@ -103,28 +103,26 @@ namespace void Skin_MonoCPU(const NzSkeletalMesh* mesh, const NzSkeleton* skeleton, NzVertexBuffer* buffer) { - NzBufferMapper mapper(buffer, nzBufferAccess_DiscardAndWrite); + NzBufferMapper inputMapper(mesh->GetVertexBuffer(), nzBufferAccess_ReadOnly); + NzBufferMapper outputMapper(buffer, nzBufferAccess_DiscardAndWrite); NzSkinningData skinningData; - skinningData.inputVertex = mesh->GetBindPoseBuffer(); - skinningData.outputVertex = static_cast(mapper.GetPointer()); + skinningData.inputVertex = static_cast(inputMapper.GetPointer()); + skinningData.outputVertex = static_cast(outputMapper.GetPointer()); skinningData.joints = skeleton->GetJoints(); - skinningData.vertexWeights = mesh->GetVertexWeight(0); - skinningData.weights = mesh->GetWeight(0); NzSkinPositionNormalTangent(skinningData, 0, mesh->GetVertexCount()); } void Skin_MultiCPU(const NzSkeletalMesh* mesh, const NzSkeleton* skeleton, NzVertexBuffer* buffer) { - NzBufferMapper mapper(buffer, nzBufferAccess_DiscardAndWrite); + NzBufferMapper inputMapper(mesh->GetVertexBuffer(), nzBufferAccess_ReadOnly); + NzBufferMapper outputMapper(buffer, nzBufferAccess_DiscardAndWrite); NzSkinningData skinningData; - skinningData.inputVertex = mesh->GetBindPoseBuffer(); - skinningData.outputVertex = static_cast(mapper.GetPointer()); + skinningData.inputVertex = static_cast(inputMapper.GetPointer()); + skinningData.outputVertex = static_cast(outputMapper.GetPointer()); 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, // on se charge de la mettre à jour avant de les lancer diff --git a/src/Nazara/Utility/Algorithm.cpp b/src/Nazara/Utility/Algorithm.cpp index d1f203977..3fd6078fc 100644 --- a/src/Nazara/Utility/Algorithm.cpp +++ b/src/Nazara/Utility/Algorithm.cpp @@ -961,7 +961,7 @@ void NzGenerateUvSphere(float size, unsigned int sliceCount, unsigned int stackC } } -/************************************NzOptimize***********************************/ +/**********************************NzOptimize*********************************/ void NzOptimizeIndices(NzIndexIterator indices, unsigned int indexCount) { @@ -972,23 +972,20 @@ void NzOptimizeIndices(NzIndexIterator indices, unsigned int indexCount) /************************************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]; - NzMeshVertex* outputVertex = &data.outputVertex[startVertex]; + const NzSkeletalMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex]; + NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex]; unsigned int endVertex = startVertex + vertexCount - 1; for (unsigned int i = startVertex; i <= endVertex; ++i) { NzVector3f finalPosition(NzVector3f::Zero()); - unsigned int weightCount = data.vertexWeights[i].weights.size(); - for (unsigned int j = 0; j < weightCount; ++j) + for (int j = 0; j < inputVertex->weightCount; ++j) { - const NzWeight& weight = data.weights[data.vertexWeights[i].weights[j]]; - - NzMatrix4f mat(data.joints[weight.jointIndex].GetSkinningMatrix()); - mat *= weight.weight; + NzMatrix4f mat(skinningInfos.joints[inputVertex->jointIndexes[j]].GetSkinningMatrix()); + mat *= inputVertex->weights[j]; 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) { - const NzMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex]; + const NzSkeletalMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex]; NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex]; unsigned int endVertex = startVertex + vertexCount - 1; @@ -1012,13 +1009,10 @@ void NzSkinPositionNormal(const NzSkinningData& skinningInfos, unsigned int star NzVector3f finalPosition(NzVector3f::Zero()); NzVector3f finalNormal(NzVector3f::Zero()); - unsigned int weightCount = skinningInfos.vertexWeights[i].weights.size(); - for (unsigned int j = 0; j < weightCount; ++j) + for (int j = 0; j < inputVertex->weightCount; ++j) { - const NzWeight& weight = skinningInfos.weights[skinningInfos.vertexWeights[i].weights[j]]; - - NzMatrix4f mat(skinningInfos.joints[weight.jointIndex].GetSkinningMatrix()); - mat *= weight.weight; + NzMatrix4f mat(skinningInfos.joints[inputVertex->jointIndexes[j]].GetSkinningMatrix()); + mat *= inputVertex->weights[j]; finalPosition += mat.Transform(inputVertex->position); 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) { - const NzMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex]; + const NzSkeletalMeshVertex* inputVertex = &skinningInfos.inputVertex[startVertex]; NzMeshVertex* outputVertex = &skinningInfos.outputVertex[startVertex]; unsigned int endVertex = startVertex + vertexCount - 1; @@ -1047,13 +1041,10 @@ void NzSkinPositionNormalTangent(const NzSkinningData& skinningInfos, unsigned i NzVector3f finalNormal(NzVector3f::Zero()); NzVector3f finalTangent(NzVector3f::Zero()); - unsigned int weightCount = skinningInfos.vertexWeights[i].weights.size(); - for (unsigned int j = 0; j < weightCount; ++j) + for (int j = 0; j < inputVertex->weightCount; ++j) { - const NzWeight& weight = skinningInfos.weights[skinningInfos.vertexWeights[i].weights[j]]; - - NzMatrix4f mat(skinningInfos.joints[weight.jointIndex].GetSkinningMatrix()); - mat *= weight.weight; + NzMatrix4f mat(skinningInfos.joints[inputVertex->jointIndexes[j]].GetSkinningMatrix()); + mat *= inputVertex->weights[j]; finalPosition += mat.Transform(inputVertex->position); finalNormal += mat.Transform(inputVertex->normal, 0.f);