|
|
|
@ -8,8 +8,8 @@
|
|
|
|
|
namespace SceneUtil
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
|
/// @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:
|
|
|
|
@ -22,6 +22,7 @@ namespace SceneUtil
|
|
|
|
|
|
|
|
|
|
std::vector<Bone*> mChildren;
|
|
|
|
|
|
|
|
|
|
/// Update the skeleton-space matrix of this bone and all its children.
|
|
|
|
|
void update(const osg::Matrixf* parentMatrixInSkeletonSpace);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
@ -29,16 +30,21 @@ namespace SceneUtil
|
|
|
|
|
void operator=(const Bone&);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/// @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);
|
|
|
|
|
|
|
|
|
|
Bone* getBone(const std::string& name);
|
|
|
|
|
|
|
|
|
|
META_Node(NifOsg, Skeleton)
|
|
|
|
|
|
|
|
|
|
/// 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);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|