/* -*-c++-*- * Copyright (C) 2009 Cedric Pinson * Copyright (C) 2017 Julien Valentin * * 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 std::vector > BoneWeightAttribList; typedef std::vector > BonePalette; typedef std::map BoneNamePaletteIndex; typedef std::vector MatrixPalette; osg::Vec4Array* getVertexAttrib(unsigned int index); unsigned int getNumVertexAttrib(); osg::Uniform* getMatrixPaletteUniform(); void computeMatrixPaletteUniform(const osg::Matrix& transformFromSkeletonToGeometry, const osg::Matrix& invTransformFromSkeletonToGeometry); unsigned int getNumBonesPerVertex() const; unsigned int getNumVertexes() const; virtual void operator()(RigGeometry&); virtual bool prepareData(RigGeometry& ); void setShader(osg::Shader*); const BoneNamePaletteIndex& getBoneNameToPalette() { return _boneNameToPalette; } protected: osg::Uniform* createVertexUniform(); unsigned int _bonesPerVertex; unsigned int _nbVertexes; BonePalette _bonePalette; BoneNamePaletteIndex _boneNameToPalette; BoneWeightAttribList _boneWeightAttribArrays; osg::ref_ptr _uniformMatrixPalette; osg::ref_ptr _shader; bool _needInit; bool buildPalette(BoneMap&boneMap ,RigGeometry&rig); }; } #endif