# class cogs::Skeleton

## Overview

3D Graph structure, usually representing topology of a 3D model. More…

    #include <Skeleton.h>

    class Skeleton {
    public:
        // structs

        struct BaseProperty;

        template <class T>
        struct Property;

        // fields

        cogs::Transform transform;

        // construction

        Skeleton();
        Skeleton(const Skeleton& skeleton);
        ~Skeleton();

        // methods

        Skeleton& operator=(const Skeleton& skeleton);
        std::string GetName() const;
        void SetName(const std::string& new_name);
        std::vector<Bone*> GetAllBones() const;
        std::vector<std::string> GetAllBoneCaptions() const;
        std::vector<Bone*> GetBones(const std::vector<std::string>& bone_captions) const;
        Bone* GetBone(const uint32_t id) const;
        Bone* GetBone(const std::string& bone_caption) const;
        std::vector<Bone*> GetRootBones() const;
        void Clear();
        unsigned GetBoneCount() const;
        Bone* AddBone(const std::string& name, const std::string& parent_name, const glm::vec3& tail_position);
        Bone* AddBone(const std::string& name, const std::string& parent_name, const BoneTransform& transform);
        Bone* AddBoneToRoot(const std::string& name, const glm::vec3& tail_position);
        Bone* AddBoneToRoot(const std::string& name, const BoneTransform& transform);
        void RollBasis(const std::string& bone_name, const float roll_angle);
        void ApplyBoneLengths(const std::vector<float>& bone_lengths);
        void SortBySkeleton(const cogs::Skeleton& ref_skeleton);
        void InterpolateTo(const cogs::Skeleton& target_skel, float target_weight, cogs::Skeleton* out_skeleton) const;
        SkeletonPose GetCurrentPose() const;
        SkeletonPose GetCurrentPose(const std::vector<std::string>& bone_order) const;
        void ApplyPose(const SkeletonPose& pose, bool ignore_root_transform = false);
        void ApplyBindpose();
        void ApplyCurrentPoseAsBindpose();
        BaseProperty* GetProperty(const std::string& prop) const;

        template <class T>
        T GetProperty(const std::string& prop) const;

        template <class T>
        void SetProperty(const std::string& prop, const T& value);

        bool HasProperty(const std::string& prop) const;

    protected:
        // fields

        std::string name_;
        cogs::Transform bind_transform;
        std::unordered_map<std::string, BaseProperty*> properties_;
        std::map<std::string, Bone*> bone_for_name_;
        std::vector<Bone*> bones_;
        std::vector<Bone*> root_bones_;
        unsigned bone_count_ = 0;

        // methods

        Bone* CreateNewBone(const std::string& caption);
        Bone* CreateBoneClone(const cogs::Bone* bone);
        void MakeCloneOf(const Skeleton& skeleton);
        void OnTransformChange();
    };

## Detailed Documentation

3D Graph structure, usually representing topology of a 3D model.

### Fields

    cogs::Transform transform

Transformation of the entire skeleton.

### Construction

    Skeleton()

Creates an empty skeleton.

    Skeleton(const Skeleton& skeleton)

Creates a copy of specified skeleton.

    ~Skeleton()

Destroys instance and free all its data.

### Methods

    Skeleton& operator=(const Skeleton& skeleton)

Creates a copy of specified skeleton.

    std::string GetName() const

Changes the name of this skeleton object.

    void SetName(const std::string& new_name)

Returns the name of this skeleton object.

    std::vector<Bone*> GetAllBones() const

Returns all bones.

    std::vector<std::string> GetAllBoneCaptions() const

Returns captions of all bones.

    std::vector<Bone*> GetBones(const std::vector<std::string>& bone_captions) const

Returns all bones that have specified captions.

    Bone* GetBone(const uint32_t id) const

Returns bone with specified id.

    Bone* GetBone(const std::string& bone_caption) const

Returns bone with specified caption.

    std::vector<Bone*> GetRootBones() const

Returns all bones which are starting the sub hierarchies.

    void Clear()

Removes all bones from skeleton and clears hierarchy data.

    unsigned GetBoneCount() const

Number of bones in skeleton hierarchy.

    Bone* AddBone(const std::string& name, const std::string& parent_name, const glm::vec3& tail_position)

Will add bone to skeleton, which starts at the fathers tail position and ends in specified tail_position.

    Bone* AddBone(const std::string& name, const std::string& parent_name, const BoneTransform& transform)

Will add bone to skeleton, which has a defined bone transform.

    Bone* AddBoneToRoot(const std::string& name, const glm::vec3& tail_position)

Adds bone to skeleton, which starts at skeleton root position and ends in defined tail_position.

    Bone* AddBoneToRoot(const std::string& name, const BoneTransform& transform)

Adds bone to skeleton, which has a defined bone transform.

    void RollBasis(const std::string& bone_name, const float roll_angle)

Rolls basis of a single bone, without manipulating whole child hierarchy.

    void ApplyBoneLengths(const std::vector<float>& bone_lengths)

Resizes individual bones their orientation will not change.

    void SortBySkeleton(const cogs::Skeleton& ref_skeleton)

/brief Sorts the vector of bones (returned by GetBones) so it corresponds with input skeleton.

/param ref_skeleton Reference skeleton, must have same number of bones with same names as this skeleton.

    void InterpolateTo(const cogs::Skeleton& target_skel, float target_weight, cogs::Skeleton* out_skeleton) const

/brief Interpolates skeleton into target skeleton (same principle as SkeletonPose::InterpolateWith).

/param target_skel Target skeleton. Must have same number of bones and same bone names as this skeleton.

/param target_weight Number in interval <0, 1>, if equals 0 then output will be copy of this skeleton. If equals 1, output will be copy of target skeleton.

/param out_skeleton Result of the interpolation.

    SkeletonPose GetCurrentPose() const

Returns current skeleton pose.

    SkeletonPose GetCurrentPose(const std::vector<std::string>& bone_order) const

Returns current skeleton pose, with reordered bones.

    void ApplyPose(const SkeletonPose& pose, bool ignore_root_transform = false)

Applies pose to the skeleton bones.

    void ApplyBindpose()

Sets default pose (pose with only identity matrices).

    void ApplyCurrentPoseAsBindpose()

Overwrites bind pose by current pose transformations. Current pose transformations will be identities.

    BaseProperty* GetProperty(const std::string& prop) const

Returns specific skeleton property.

    template <class T>
    T GetProperty(const std::string& prop) const

Returns specific skeleton property.

    template <class T>
    void SetProperty(const std::string& prop, const T& value)

Sets specific skeleton property. If property do not exist yet, creates new property record.

    bool HasProperty(const std::string& prop) const

Checks if the property exist.