#ifndef __URDE_IMETAANIM_HPP__ #define __URDE_IMETAANIM_HPP__ #include "../RetroTypes.hpp" #include "CCharAnimTime.hpp" #include namespace urde { class CAnimTreeNode; struct CAnimSysContext; struct CMetaAnimTreeBuildOrders; class CPrimitive; class IAnimReader; enum class EMetaAnimType { Play, Blend, PhaseBlend, Random, Sequence }; class CPreAdvanceIndicator { bool x0_isTime; CCharAnimTime x4_time; const char* xc_string; u32 x10_; u32 x14_; u32 x18_; u32 x1c_; u32 x20_; u32 x24_; u32 x28_; u32 x2c_; u32 x30_; u32 x34_; u32 x38_; u16 x3c_; public: CPreAdvanceIndicator(const CCharAnimTime& time) : x0_isTime(true), x4_time(time) {} CPreAdvanceIndicator(const char* string) : x0_isTime(false), xc_string(string) {} const char* GetString() const {return xc_string;} bool IsString() const {return !x0_isTime;} const CCharAnimTime& GetTime() const {return x4_time;} bool IsTime() const {return x0_isTime;} }; struct CMetaAnimTreeBuildOrders { std::experimental::optional x0_recursiveAdvance; std::experimental::optional x44_singleAdvance; static CMetaAnimTreeBuildOrders NoSpecialOrders() { return {}; } static CMetaAnimTreeBuildOrders PreAdvanceForAll(const CPreAdvanceIndicator& ind) { CMetaAnimTreeBuildOrders ret; ret.x0_recursiveAdvance.emplace(ind); ret.x44_singleAdvance.emplace(ind); return ret; } }; class IMetaAnim { public: virtual ~IMetaAnim() = default; virtual std::shared_ptr GetAnimationTree(const CAnimSysContext& animSys, const CMetaAnimTreeBuildOrders& orders) const; virtual void GetUniquePrimitives(std::set& primsOut) const=0; virtual EMetaAnimType GetType() const=0; virtual std::shared_ptr VGetAnimationTree(const CAnimSysContext& animSys, const CMetaAnimTreeBuildOrders& orders) const=0; static void AdvanceAnim(IAnimReader& anim, const CCharAnimTime& dt); static CCharAnimTime GetTime(const CPreAdvanceIndicator& ind, const IAnimReader& anim); }; } #endif // __URDE_IMETAANIM_HPP__