You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.9 KiB
85 lines
2.9 KiB
/* -*-c++-*- |
|
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net> |
|
* |
|
* 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 <osgAnimation/Export> |
|
#include <osgAnimation/RigTransform> |
|
#include <osgAnimation/VertexInfluence> |
|
#include <osgAnimation/Bone> |
|
#include <osg/Matrix> |
|
#include <osg/Array> |
|
|
|
namespace osgAnimation |
|
{ |
|
class RigGeometry; |
|
|
|
/// This class manage format for hardware skinning |
|
class OSGANIMATION_EXPORT RigTransformHardware : public RigTransform |
|
{ |
|
public: |
|
typedef osg::Matrix MatrixType; |
|
typedef osgAnimation::Bone BoneType; |
|
typedef std::vector<osg::ref_ptr<osg::Vec4Array> > BoneWeightAttribList; |
|
typedef std::vector<osg::ref_ptr<BoneType> > BonePalette; |
|
|
|
typedef std::vector<osg::Matrix> 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<std::vector<IndexWeightEntry> > VertexIndexWeightList; |
|
|
|
RigTransformHardware(); |
|
|
|
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*); |
|
|
|
protected: |
|
|
|
bool init(RigGeometry&); |
|
|
|
BoneWeightAttribList createVertexAttribList(); |
|
osg::Uniform* createVertexUniform(); |
|
|
|
int _bonesPerVertex; |
|
int _nbVertexes; |
|
VertexIndexWeightList _vertexIndexMatrixWeightList; |
|
BonePalette _bonePalette; |
|
BoneWeightAttribList _boneWeightAttribArrays; |
|
osg::ref_ptr<osg::Uniform> _uniformMatrixPalette; |
|
osg::ref_ptr<osg::Shader> _shader; |
|
|
|
bool _needInit; |
|
}; |
|
} |
|
|
|
#endif
|
|
|