From 0812b449018e84c2fa684d3a8fab9b5fd1b6b84d Mon Sep 17 00:00:00 2001 From: lukeph Date: Tue, 18 Sep 2007 02:51:06 +0000 Subject: [PATCH] fixed weight bug when more then one mesh in an x file is skinned git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@972 dfc29bdd-3216-0410-991c-e03cc46cb475 --- include/ISkinnedMesh.h | 1 + source/Irrlicht/CXMeshFileLoader.cpp | 76 +++++++++++++--------------- source/Irrlicht/CXMeshFileLoader.h | 2 + 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/include/ISkinnedMesh.h b/include/ISkinnedMesh.h index fae03ed5..f548b234 100644 --- a/include/ISkinnedMesh.h +++ b/include/ISkinnedMesh.h @@ -137,6 +137,7 @@ namespace scene //! List of child joints core::array Children; + //! List of attached meshes core::array AttachedMeshes; //! Animation keys causing translation change diff --git a/source/Irrlicht/CXMeshFileLoader.cpp b/source/Irrlicht/CXMeshFileLoader.cpp index 506f5540..a65a62ad 100644 --- a/source/Irrlicht/CXMeshFileLoader.cpp +++ b/source/Irrlicht/CXMeshFileLoader.cpp @@ -200,40 +200,35 @@ bool CXMeshFileLoader::load(io::IReadFile* file) } } - for (i=0;igetAllJoints().size();++i) + for (u32 j=0;jWeights.size();++j) { + ISkinnedMesh::SWeight& Weight = (*mesh->Weights[j]); - ISkinnedMesh::SJoint *Joint=AnimatedMesh->getAllJoints()[i]; + u32 id = Weight.vertex_id; - for (u32 j=0;jWeights.size();++j) + if (id>=verticesLink.size()) { + os::Printer::log("X loader: Weight id out of range", ELL_WARNING); + id=0; + } - ISkinnedMesh::SWeight& Weight = Joint->Weights[j]; - u32 id = Weight.vertex_id; - - if (id>verticesLink.size()) + if (verticesLinkBuffer[id].size()==1) + { + Weight.vertex_id=verticesLink[id][0]; + Weight.buffer_id=verticesLinkBuffer[id][0]; + } + else if (verticesLinkBuffer[id].size() != 0) + { + for (u32 k=1; k < verticesLinkBuffer[id].size(); ++k) { - os::Printer::log("X loader: Weight id out of range", ELL_WARNING); - id=0; - } - - if (verticesLinkBuffer[id].size()==1) - { - Weight.vertex_id=verticesLink[id][0]; - Weight.buffer_id=verticesLinkBuffer[id][0]; - } - else if (verticesLinkBuffer[id].size() != 0) - { - for (u32 k=1; k < verticesLinkBuffer[id].size(); ++k) - { - ISkinnedMesh::SWeight* WeightClone = AnimatedMesh->createWeight(Joint); - WeightClone->strength = Weight.strength; - WeightClone->vertex_id = verticesLink[id][k]; - WeightClone->buffer_id = verticesLinkBuffer[id][k]; - } + ISkinnedMesh::SWeight* WeightClone = AnimatedMesh->createWeight(Joint); + WeightClone->strength = Weight.strength; + WeightClone->vertex_id = verticesLink[id][k]; + WeightClone->buffer_id = verticesLinkBuffer[id][k]; } } } + } #else { @@ -290,26 +285,23 @@ bool CXMeshFileLoader::load(io::IReadFile* file) buffer->Indices.push_back( verticesLink[ mesh->Indices[id] ] ); } - for (i=0; igetAllJoints().size(); ++i) + + for (u32 j=0;jWeights.size();++j) { - ISkinnedMesh::SJoint *Joint = AnimatedMesh->getAllJoints()[i]; + ISkinnedMesh::SWeight& Weight = (*mesh->Weights[j]); - for (u32 j=0;jWeights.size();++j) + u32 id = Weight.vertex_id; + + if (id>=verticesLink.size()) { - ISkinnedMesh::SWeight& Weight = Joint->Weights[j]; - - u32 id = Weight.vertex_id; - - if (id>=verticesLink.size()) - { - os::Printer::log("X loader: Weight id out of range", ELL_WARNING); - id=0; - } - - Weight.vertex_id=verticesLink[id]; - Weight.buffer_id=verticesLinkBuffer[id]; + os::Printer::log("X loader: Weight id out of range", ELL_WARNING); + id=0; } + + Weight.vertex_id=verticesLink[id]; + Weight.buffer_id=verticesLinkBuffer[id]; } + } #endif @@ -884,12 +876,16 @@ bool CXMeshFileLoader::parseDataObjectSkinWeights(SXMesh &mesh) const u32 jointStart = joint->Weights.size(); joint->Weights.reallocate(jointStart+nWeights); + mesh.Weights.reallocate( mesh.Weights.size() + nWeights ); + for (i=0; icreateWeight(joint); weight->buffer_id=0; weight->vertex_id=readInt(); + + mesh.Weights.push_back(weight); } // read vertex weights diff --git a/source/Irrlicht/CXMeshFileLoader.h b/source/Irrlicht/CXMeshFileLoader.h index 2568fd1a..07f72abc 100644 --- a/source/Irrlicht/CXMeshFileLoader.h +++ b/source/Irrlicht/CXMeshFileLoader.h @@ -76,6 +76,8 @@ public: s32 AttachedJointID; bool HasSkinning; + + core::array Weights; }; private: