/* -*-c++-*- * Copyright (C) 2009 Cedric Pinson * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #ifndef OSGANIMATION_RIG_TRANSFORM_HARDWARE #define OSGANIMATION_RIG_TRANSFORM_HARDWARE 1 #include #include #include #include #include #include namespace osgAnimation { class RigGeometry; /// This class manage format for hardware skinning class OSGANIMATION_EXPORT RigTransformHardware : public RigTransform { public: RigTransformHardware(); RigTransformHardware(const RigTransformHardware& rth, const osg::CopyOp& copyop); META_Object(osgAnimation,RigTransformHardware) typedef osg::Matrix MatrixType; typedef osgAnimation::Bone BoneType; typedef std::vector > BoneWeightAttribList; typedef std::vector > BonePalette; typedef std::map BoneNamePaletteIndex; typedef std::vector MatrixPalette; struct IndexWeightEntry { int _boneIndex; float _boneWeight; IndexWeightEntry() { _boneIndex = 0; _boneWeight = 0;} IndexWeightEntry(int index, float weight) { _boneIndex = index; _boneWeight = weight;} int getIndex() const { return _boneIndex; } float getWeight() const { return _boneWeight; } }; typedef std::vector > VertexIndexWeightList; osg::Vec4Array* getVertexAttrib(int index); int getNumVertexAttrib(); osg::Uniform* getMatrixPaletteUniform(); void computeMatrixPaletteUniform(const osg::Matrix& transformFromSkeletonToGeometry, const osg::Matrix& invTransformFromSkeletonToGeometry); int getNumBonesPerVertex() const; int getNumVertexes() const; bool createPalette(int nbVertexes, BoneMap boneMap, const VertexInfluenceSet::VertexIndexToBoneWeightMap& vertexIndexToBoneWeightMap); virtual void operator()(RigGeometry&); void setShader(osg::Shader*); const BoneNamePaletteIndex& getBoneNameToPalette() { return _boneNameToPalette; } protected: bool init(RigGeometry&); BoneWeightAttribList createVertexAttribList(); osg::Uniform* createVertexUniform(); int _bonesPerVertex; int _nbVertexes; VertexIndexWeightList _vertexIndexMatrixWeightList; BonePalette _bonePalette; BoneNamePaletteIndex _boneNameToPalette; BoneWeightAttribList _boneWeightAttribArrays; osg::ref_ptr _uniformMatrixPalette; osg::ref_ptr _shader; bool _needInit; }; } #endif