You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw/components/sceneutil/skeleton.hpp

79 lines
2.3 KiB
C++

#ifndef OPENMW_COMPONENTS_NIFOSG_SKELETON_H
#define OPENMW_COMPONENTS_NIFOSG_SKELETON_H
#include <osg/Group>
#include <memory>
namespace SceneUtil
{
10 years ago
/// @brief Defines a Bone hierarchy, used for updating of skeleton-space bone matrices.
/// @note To prevent unnecessary updates, only bones that are used for skinning will be added to this hierarchy.
class Bone
{
public:
Bone();
~Bone();
osg::Matrixf mMatrixInSkeletonSpace;
osg::MatrixTransform* mNode;
std::vector<Bone*> mChildren;
10 years ago
/// Update the skeleton-space matrix of this bone and all its children.
void update(const osg::Matrixf* parentMatrixInSkeletonSpace);
private:
Bone(const Bone&);
void operator=(const Bone&);
};
10 years ago
/// @brief Handles the bone matrices for any number of child RigGeometries.
/// @par Bones should be created as osg::MatrixTransform children of the skeleton.
/// To be a referenced by a RigGeometry, a bone needs to have a unique name.
class Skeleton : public osg::Group
{
public:
Skeleton();
Skeleton(const Skeleton& copy, const osg::CopyOp& copyop);
META_Node(SceneUtil, Skeleton)
10 years ago
/// Retrieve a bone by name.
Bone* getBone(const std::string& name);
/// Request an update of bone matrices. May be a no-op if already updated in this frame.
void updateBoneMatrices(osg::NodeVisitor* nv);
/// Set the skinning active flag. Inactive skeletons will not have their child rigs updated.
/// You should set this flag to false if you know that bones are not currently moving.
void setActive(bool active);
bool getActive() const;
void traverse(osg::NodeVisitor& nv);
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;
bool mActive;
unsigned int mLastFrameNumber;
bool mTraversedEvenFrame;
bool mTraversedOddFrame;
};
}
#endif