2016-04-13 06:07:23 +00:00
|
|
|
#ifndef __URDE_IMETAANIM_HPP__
|
|
|
|
#define __URDE_IMETAANIM_HPP__
|
2015-08-22 01:58:41 +00:00
|
|
|
|
|
|
|
#include "../RetroTypes.hpp"
|
2016-04-11 07:10:28 +00:00
|
|
|
#include "CCharAnimTime.hpp"
|
2016-04-10 21:22:59 +00:00
|
|
|
#include <set>
|
2015-08-22 01:58:41 +00:00
|
|
|
|
2016-03-04 23:04:53 +00:00
|
|
|
namespace urde
|
2015-08-22 01:58:41 +00:00
|
|
|
{
|
2016-04-10 21:22:59 +00:00
|
|
|
class CAnimTreeNode;
|
2016-05-21 03:02:09 +00:00
|
|
|
struct CAnimSysContext;
|
2016-09-11 01:25:59 +00:00
|
|
|
struct CMetaAnimTreeBuildOrders;
|
2016-04-10 21:22:59 +00:00
|
|
|
class CPrimitive;
|
2016-04-11 07:10:28 +00:00
|
|
|
class IAnimReader;
|
2016-04-10 21:22:59 +00:00
|
|
|
|
|
|
|
enum class EMetaAnimType
|
|
|
|
{
|
2016-09-10 04:50:00 +00:00
|
|
|
Play,
|
2016-04-10 21:22:59 +00:00
|
|
|
Blend,
|
|
|
|
PhaseBlend,
|
|
|
|
Random,
|
|
|
|
Sequence
|
|
|
|
};
|
2015-08-22 01:58:41 +00:00
|
|
|
|
2016-04-11 07:10:28 +00:00
|
|
|
class CPreAdvanceIndicator
|
|
|
|
{
|
|
|
|
bool x0_isTime;
|
|
|
|
CCharAnimTime x4_time;
|
|
|
|
const char* xc_string;
|
2018-05-25 06:39:38 +00:00
|
|
|
/*
|
2016-08-27 04:54:53 +00:00
|
|
|
u32 x10_;
|
|
|
|
u32 x14_;
|
|
|
|
u32 x18_;
|
|
|
|
u32 x1c_;
|
|
|
|
u32 x20_;
|
|
|
|
u32 x24_;
|
|
|
|
u32 x28_;
|
|
|
|
u32 x2c_;
|
|
|
|
u32 x30_;
|
|
|
|
u32 x34_;
|
|
|
|
u32 x38_;
|
|
|
|
u16 x3c_;
|
2018-05-25 06:39:38 +00:00
|
|
|
*/
|
2016-04-11 07:10:28 +00:00
|
|
|
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;}
|
|
|
|
};
|
|
|
|
|
2016-08-27 04:54:53 +00:00
|
|
|
struct CMetaAnimTreeBuildOrders
|
|
|
|
{
|
2017-12-20 06:06:54 +00:00
|
|
|
std::experimental::optional<CPreAdvanceIndicator> x0_recursiveAdvance;
|
|
|
|
std::experimental::optional<CPreAdvanceIndicator> x44_singleAdvance;
|
2016-08-27 04:54:53 +00:00
|
|
|
static CMetaAnimTreeBuildOrders NoSpecialOrders() { return {}; }
|
2017-11-24 08:01:06 +00:00
|
|
|
static CMetaAnimTreeBuildOrders PreAdvanceForAll(const CPreAdvanceIndicator& ind)
|
|
|
|
{
|
|
|
|
CMetaAnimTreeBuildOrders ret;
|
2017-12-20 06:06:54 +00:00
|
|
|
ret.x0_recursiveAdvance.emplace(ind);
|
|
|
|
ret.x44_singleAdvance.emplace(ind);
|
2017-11-24 08:01:06 +00:00
|
|
|
return ret;
|
|
|
|
}
|
2016-08-27 04:54:53 +00:00
|
|
|
};
|
|
|
|
|
2015-08-22 01:58:41 +00:00
|
|
|
class IMetaAnim
|
|
|
|
{
|
2016-04-10 21:22:59 +00:00
|
|
|
public:
|
|
|
|
virtual ~IMetaAnim() = default;
|
|
|
|
virtual std::shared_ptr<CAnimTreeNode> GetAnimationTree(const CAnimSysContext& animSys,
|
2016-04-11 07:10:28 +00:00
|
|
|
const CMetaAnimTreeBuildOrders& orders) const;
|
2016-04-10 21:22:59 +00:00
|
|
|
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 07:10:28 +00:00
|
|
|
|
|
|
|
static void AdvanceAnim(IAnimReader& anim, const CCharAnimTime& dt);
|
2016-08-27 21:16:44 +00:00
|
|
|
static CCharAnimTime GetTime(const CPreAdvanceIndicator& ind, const IAnimReader& anim);
|
2015-08-22 01:58:41 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-04-13 06:07:23 +00:00
|
|
|
#endif // __URDE_IMETAANIM_HPP__
|