metaforce/Runtime/Character/IMetaAnim.hpp

69 lines
2.0 KiB
C++
Raw Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2015-08-21 18:58:41 -07:00
#include "../RetroTypes.hpp"
2016-04-11 00:10:28 -07:00
#include "CCharAnimTime.hpp"
2016-04-10 14:22:59 -07:00
#include <set>
2015-08-21 18:58:41 -07:00
2018-12-07 21:30:43 -08:00
namespace urde {
2016-04-10 14:22:59 -07:00
class CAnimTreeNode;
2016-05-20 20:02:09 -07:00
struct CAnimSysContext;
2016-09-10 18:25:59 -07:00
struct CMetaAnimTreeBuildOrders;
2016-04-10 14:22:59 -07:00
class CPrimitive;
2016-04-11 00:10:28 -07:00
class IAnimReader;
2016-04-10 14:22:59 -07:00
2018-12-07 21:30:43 -08:00
enum class EMetaAnimType { Play, Blend, PhaseBlend, Random, Sequence };
2015-08-21 18:58:41 -07:00
2018-12-07 21:30:43 -08:00
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_;
*/
2016-04-11 00:10:28 -07:00
public:
2018-12-07 21:30:43 -08:00
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; }
2016-04-11 00:10:28 -07:00
};
2018-12-07 21:30:43 -08:00
struct CMetaAnimTreeBuildOrders {
std::optional<CPreAdvanceIndicator> x0_recursiveAdvance;
std::optional<CPreAdvanceIndicator> x44_singleAdvance;
2018-12-07 21:30:43 -08:00
static CMetaAnimTreeBuildOrders NoSpecialOrders() { return {}; }
static CMetaAnimTreeBuildOrders PreAdvanceForAll(const CPreAdvanceIndicator& ind) {
CMetaAnimTreeBuildOrders ret;
ret.x44_singleAdvance.emplace(ind);
return ret;
}
2016-08-26 21:54:53 -07:00
};
2018-12-07 21:30:43 -08:00
class IMetaAnim {
2016-04-10 14:22:59 -07:00
public:
2018-12-07 21:30:43 -08:00
virtual ~IMetaAnim() = default;
virtual std::shared_ptr<CAnimTreeNode> GetAnimationTree(const CAnimSysContext& animSys,
const CMetaAnimTreeBuildOrders& orders) const;
virtual void GetUniquePrimitives(std::set<CPrimitive>& primsOut) const = 0;
virtual EMetaAnimType GetType() const = 0;
virtual std::shared_ptr<CAnimTreeNode> VGetAnimationTree(const CAnimSysContext& animSys,
const CMetaAnimTreeBuildOrders& orders) const = 0;
2016-04-11 00:10:28 -07:00
2018-12-07 21:30:43 -08:00
static void AdvanceAnim(IAnimReader& anim, const CCharAnimTime& dt);
static CCharAnimTime GetTime(const CPreAdvanceIndicator& ind, const IAnimReader& anim);
2015-08-21 18:58:41 -07:00
};
2018-12-07 21:30:43 -08:00
} // namespace urde