diff --git a/include/osgAnimation/RigTransformSoftware b/include/osgAnimation/RigTransformSoftware index 9d2a014dc..fa8aabcb9 100644 --- a/include/osgAnimation/RigTransformSoftware +++ b/include/osgAnimation/RigTransformSoftware @@ -53,7 +53,6 @@ namespace osgAnimation osg::observer_ptr< Bone > _boneptr; }; typedef std::vector BonePtrWeightList; - typedef std::vector IndexList; /// map a set of boneinfluence to a list of vertex indices sharing this set class VertexGroup @@ -61,7 +60,7 @@ namespace osgAnimation public: inline BonePtrWeightList& getBoneWeights() { return _boneweights; } - inline IndexList& getVertexes() { return _vertexes; } + inline IndexList& getVertices() { return _vertexes; } inline void resetMatrix() { @@ -122,9 +121,8 @@ namespace osgAnimation osg::Matrix _result; }; - - - template void compute(const osg::Matrix& transform, const osg::Matrix& invTransform, const V* src, V* dst) + template + inline void compute(const osg::Matrix& transform, const osg::Matrix& invTransform, const V* src, V* dst) { // the result of matrix mult should be cached to be used for vertexes transform and normal transform and maybe other computation for(VertexGroupList::iterator itvg=_uniqInfluenceSet2VertIDList.begin(); itvg!=_uniqInfluenceSet2VertIDList.end(); ++itvg) @@ -133,7 +131,7 @@ namespace osgAnimation uniq.computeMatrixForVertexSet(); osg::Matrix matrix = transform * uniq.getMatrix() * invTransform; - const IndexList& vertexes = uniq.getVertexes(); + const IndexList& vertexes = uniq.getVertices(); for(IndexList::const_iterator vertIDit=vertexes.begin(); vertIDit!=vertexes.end(); ++vertIDit) { dst[*vertIDit] = src[*vertIDit] * matrix; @@ -143,7 +141,8 @@ namespace osgAnimation } - template void computeNormal(const osg::Matrix& transform, const osg::Matrix& invTransform, const V* src, V* dst) + template + inline void computeNormal(const osg::Matrix& transform, const osg::Matrix& invTransform, const V* src, V* dst) { for(VertexGroupList::iterator itvg=_uniqInfluenceSet2VertIDList.begin(); itvg!=_uniqInfluenceSet2VertIDList.end(); ++itvg) { @@ -151,7 +150,7 @@ namespace osgAnimation uniq.computeMatrixForVertexSet(); osg::Matrix matrix = transform * uniq.getMatrix() * invTransform; - const IndexList& vertexes = uniq.getVertexes(); + const IndexList& vertexes = uniq.getVertices(); for(IndexList::const_iterator vertIDit=vertexes.begin(); vertIDit!=vertexes.end(); ++vertIDit) { dst[*vertIDit] = osg::Matrix::transform3x3(src[*vertIDit],matrix); diff --git a/include/osgAnimation/VertexInfluence b/include/osgAnimation/VertexInfluence index 1b35b2c0f..4bb42b105 100644 --- a/include/osgAnimation/VertexInfluence +++ b/include/osgAnimation/VertexInfluence @@ -46,14 +46,6 @@ namespace osgAnimation typedef std::vector BoneWeightList; typedef std::vector IndexList; - /// map a set of boneinfluence to a list of vertex indices sharing this set - class VertexGroup: public std::pair - { - public: - inline const BoneWeightList& getBoneWeights()const { return first; } - inline void setBoneWeights(BoneWeightList&o) { first=o; } - inline IndexList& vertIDs() { return second; } - }; class OSGANIMATION_EXPORT BoneInfluenceList : public IndexWeightList { public: @@ -82,9 +74,19 @@ namespace osgAnimation void cullInfluenceCountPerVertex(unsigned int maxnumbonepervertex, float minweight=0, bool renormalize=true); //compute PerVertexInfluenceList - void computePerVertexInfluenceList(std::vector& vertex2Bones,unsigned int numvert)const; - //create the minimal VertexGroup set - void computeMinimalVertexGroupList(std::vector&uniqVertexGroupList,unsigned int numvert)const; + void computePerVertexInfluenceList(std::vector& perVertexInfluenceList, unsigned int numvert)const; + + /// map a set of boneinfluence to a list of vertex indices sharing this set + class VertexGroup: public std::pair + { + public: + inline const BoneWeightList& getBoneWeights()const { return first; } + inline void setBoneWeights( BoneWeightList& o ) { first=o; } + inline IndexList& vertIDs() { return second; } + }; + + /// compute the minimal VertexGroup Set in which vertices shares the same influence set + void computeMinimalVertexGroupList(std::vector&uniqVertexGroupList, unsigned int numvert)const; }; } diff --git a/src/osgAnimation/RigTransformSoftware.cpp b/src/osgAnimation/RigTransformSoftware.cpp index d7d1515df..ff241bc91 100644 --- a/src/osgAnimation/RigTransformSoftware.cpp +++ b/src/osgAnimation/RigTransformSoftware.cpp @@ -20,6 +20,7 @@ #include #include + using namespace osgAnimation; RigTransformSoftware::RigTransformSoftware() @@ -35,7 +36,6 @@ RigTransformSoftware::RigTransformSoftware(const RigTransformSoftware& rts,const } - // sort by name and weight struct SortByNameAndWeight : public std::less { @@ -104,7 +104,7 @@ void RigTransformSoftware::buildMinimumUpdateSet(const BoneMap&boneMap,const Rig const unsigned int &index = iw.getIndex(); float weight = iw.getWeight(); - _vertex2Bones[index].push_back(BonePtrWeight(inflist.getBoneName(), weight,bone));; + _vertex2Bones[index].push_back(BonePtrWeight(inflist.getBoneName(), weight,bone)); } } @@ -135,19 +135,25 @@ void RigTransformSoftware::buildMinimumUpdateSet(const BoneMap&boneMap,const Rig typedef std::map UnifyBoneGroup; UnifyBoneGroup unifyBuffer; vertexID=0; + ; for (std::vector::iterator it = _vertex2Bones.begin(); it != _vertex2Bones.end(); ++it,++vertexID) { - BonePtrWeightList& bones = *it; + BonePtrWeightList bones = *it; // sort the vector to have a consistent key std::sort(bones.begin(), bones.end(), SortByNameAndWeight() ); // we use the vector as key to differentiate group UnifyBoneGroup::iterator result = unifyBuffer.find(bones); - if (result == unifyBuffer.end()) - unifyBuffer[bones].getBoneWeights()=bones; - unifyBuffer[bones].getVertexes().push_back(vertexID); + if (result != unifyBuffer.end()) + result->second.getVertices().push_back(vertexID); + else + { + VertexGroup& vg = unifyBuffer[bones]; + vg.getBoneWeights() = bones; + vg.getVertices().push_back(vertexID); + } } _uniqInfluenceSet2VertIDList.reserve(unifyBuffer.size()); - for (UnifyBoneGroup::iterator it = unifyBuffer.begin(); it != unifyBuffer.end(); ++it) + for (UnifyBoneGroup::const_iterator it = unifyBuffer.begin(); it != unifyBuffer.end(); ++it) _uniqInfluenceSet2VertIDList.push_back(it->second); OSG_DEBUG << "uniq groups " << _uniqInfluenceSet2VertIDList.size() << " for " << rig.getName() << std::endl; }