2015-04-21 14:02:40 +00:00
|
|
|
#ifndef OPENMW_COMPONENTS_NIFOSG_SKELETON_H
|
|
|
|
#define OPENMW_COMPONENTS_NIFOSG_SKELETON_H
|
|
|
|
|
|
|
|
#include <osg/Group>
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
namespace NifOsg
|
|
|
|
{
|
|
|
|
|
|
|
|
// Defines a Bone hierarchy, used for updating of skeleton-space bone matrices.
|
|
|
|
// To prevent unnecessary updates, only bones that are used for skinning will be added to this hierarchy.
|
|
|
|
class Bone
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Bone();
|
|
|
|
~Bone();
|
|
|
|
|
|
|
|
osg::Matrix mMatrixInSkeletonSpace;
|
|
|
|
|
|
|
|
osg::MatrixTransform* mNode;
|
|
|
|
|
|
|
|
std::vector<Bone*> mChildren;
|
|
|
|
|
|
|
|
void update(const osg::Matrixf* parentMatrixInSkeletonSpace);
|
|
|
|
|
|
|
|
private:
|
|
|
|
Bone(const Bone&);
|
|
|
|
void operator=(const Bone&);
|
|
|
|
};
|
|
|
|
|
|
|
|
class Skeleton : public osg::Group
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Skeleton();
|
|
|
|
Skeleton(const Skeleton& copy, const osg::CopyOp& copyop);
|
|
|
|
|
|
|
|
Bone* getBone(const std::string& name);
|
|
|
|
|
|
|
|
META_Node(NifOsg, Skeleton)
|
|
|
|
|
2015-04-21 18:22:32 +00:00
|
|
|
void updateBoneMatrices(osg::NodeVisitor* nv);
|
2015-04-21 14:02:40 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
// The root bone is not a "real" bone, it has no corresponding node in the scene graph.
|
|
|
|
// As far as the scene graph goes we support multiple root bones.
|
|
|
|
std::auto_ptr<Bone> mRootBone;
|
|
|
|
|
|
|
|
typedef std::map<std::string, std::pair<osg::NodePath, osg::MatrixTransform*> > BoneCache;
|
|
|
|
BoneCache mBoneCache;
|
|
|
|
bool mBoneCacheInit;
|
|
|
|
|
|
|
|
bool mNeedToUpdateBoneMatrices;
|
2015-04-21 18:22:32 +00:00
|
|
|
|
|
|
|
unsigned int mLastFrameNumber;
|
2015-04-21 14:02:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|