#pragma once struct ITransformationAnimation; struct __declspec(novtable) IBone { virtual ~IBone() {}; virtual void Initialize(const string16& argName, int argIndex, const D3DXVECTOR3& argPoseTranslation, const D3DXVECTOR3& argPoseScale, const D3DXQUATERNION& argPoseRotation) = 0; virtual const D3DXMATRIX& GetTransformationAtTime(float argTime, const D3DXMATRIX& argRootTransformationMatrix) = 0; virtual const D3DXMATRIX& get_PoseTransformation() const = 0; virtual void set_Parent(IBone* argParent_) = 0; virtual IBone* get_Parent() const = 0; virtual std::vector& get_ChildBones() = 0; virtual string16 get_Name() const = 0; virtual int get_Index() const = 0; virtual void set_TransformationAnimation(ITransformationAnimation* argTransformationAnimation) = 0; virtual ITransformationAnimation* get_TransformationAnimation() const = 0; virtual std::map& get_BoneIndexList() = 0; virtual D3DXMATRIX* get_MatrixArray() = 0; virtual unsigned int get_MatrixArraySize() = 0; }; struct Sequence { Sequence() : m_Start(0.0f) , m_End(0.0f) , m_Loop(false) { } float m_Start; float m_End; bool m_Loop; }; struct __declspec(novtable) IBoneController { virtual ~IBoneController() {} virtual void Initialize(IBone& argRootBone) = 0; virtual void Initialize(const IBoneController& argOther) = 0; virtual void Apply() = 0; virtual void RegisterSequence(const string16& argName, float argStart, float argEnd, bool argLoop) = 0; virtual void PlaySequence(const string16& argName) = 0; virtual const string16& get_CurrentSequence() const = 0; virtual const std::map& get_Sequences() const = 0; virtual IBone& get_RootBone() const = 0; };