/* -*-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 std::vector > BoneWeightAttribList; typedef std::vector > BonePalette; typedef std::map BoneNamePaletteIndex; typedef std::vector MatrixPalette; ///set the first Vertex Attribute Array index of the rig generated by this technic (default:11) void setFirstVertexAttributeTarget(unsigned int i){ _minAttribIndex=i;} unsigned int getFirstVertexAttributeTarget()const { return _minAttribIndex;} void setShader(osg::Shader* shader) { _shader = shader; } osg::Shader* getShader() const { return _shader; } osg::Vec4Array* getVertexAttrib(unsigned int index); unsigned int getNumVertexAttrib() const {return _boneWeightAttribArrays.size();} const unsigned int &getNumBonesPerVertex() const{ return _bonesPerVertex; } const unsigned int &getNumVertexes() const { return _nbVertexes; } const BoneNamePaletteIndex& getBoneNameToPalette(){ return _boneNameToPalette; } const BonePalette& getBonePalette() { return _bonePalette; } osg::Uniform* getMatrixPaletteUniform() { return _uniformMatrixPalette; } void computeMatrixPaletteUniform(const osg::Matrix& transformFromSkeletonToGeometry, const osg::Matrix& invTransformFromSkeletonToGeometry); // update rig if needed virtual void operator()(RigGeometry&); // init animations data virtual bool prepareData(RigGeometry& ); protected: unsigned int _bonesPerVertex; unsigned int _nbVertexes; BonePalette _bonePalette; BoneNamePaletteIndex _boneNameToPalette; BoneWeightAttribList _boneWeightAttribArrays; osg::ref_ptr _uniformMatrixPalette; osg::ref_ptr _shader; bool _needInit; unsigned int _minAttribIndex; bool buildPalette(const BoneMap& boneMap ,const RigGeometry& rig); //on first update virtual bool init(RigGeometry& ); }; } #endif