metaforce/Runtime/Character/IAnimReader.hpp

144 lines
5.7 KiB
C++
Raw Normal View History

2018-10-07 03:42:33 +00:00
#pragma once
2016-04-10 21:22:59 +00:00
2016-04-11 03:59:54 +00:00
#include "RetroTypes.hpp"
#include "CCharAnimTime.hpp"
#include "zeus/CVector3f.hpp"
#include "zeus/CQuaternion.hpp"
2016-04-12 06:15:32 +00:00
#include "CParticleData.hpp"
#include "CToken.hpp"
#include "CAllFormatsAnimSource.hpp"
2016-04-11 03:59:54 +00:00
2016-04-10 21:22:59 +00:00
namespace urde
{
2016-04-11 03:59:54 +00:00
class CSegId;
class CBoolPOINode;
class CInt32POINode;
class CParticlePOINode;
class CSoundPOINode;
class CSegIdList;
class CSegStatementSet;
2016-04-14 21:42:47 +00:00
struct SAdvancementDeltas
{
zeus::CVector3f x0_posDelta;
zeus::CQuaternion xc_rotDelta;
static SAdvancementDeltas Interpolate(const SAdvancementDeltas& a, const SAdvancementDeltas& b,
float oldWeight, float newWeight);
2018-01-30 01:04:01 +00:00
static SAdvancementDeltas Blend(const SAdvancementDeltas& a, const SAdvancementDeltas& b, float w);
2016-04-14 21:42:47 +00:00
};
2016-04-11 03:59:54 +00:00
struct SAdvancementResults
{
2016-04-11 07:10:28 +00:00
CCharAnimTime x0_remTime;
2016-04-14 21:42:47 +00:00
SAdvancementDeltas x8_deltas;
2016-04-11 03:59:54 +00:00
};
2016-04-10 21:22:59 +00:00
2016-08-27 21:16:44 +00:00
class CSteadyStateAnimInfo
2016-04-16 03:24:25 +00:00
{
2016-08-27 21:16:44 +00:00
CCharAnimTime x0_duration;
zeus::CVector3f x8_offset;
bool x14_looping = false;
public:
CSteadyStateAnimInfo(bool looping, const CCharAnimTime& duration, const zeus::CVector3f& offset)
: x0_duration(duration), x8_offset(offset), x14_looping(looping) {}
const CCharAnimTime& GetDuration() const { return x0_duration; }
const zeus::CVector3f& GetOffset() const { return x8_offset; }
bool IsLooping() const { return x14_looping; }
2016-04-16 03:24:25 +00:00
};
2016-08-27 04:54:53 +00:00
struct CAnimTreeEffectiveContribution
{
float x0_contributionWeight;
std::string x4_name;
CSteadyStateAnimInfo x14_ssInfo;
CCharAnimTime x2c_remTime;
u32 x34_dbIdx;
public:
2017-11-13 06:19:18 +00:00
CAnimTreeEffectiveContribution(float cweight, std::string_view name, const CSteadyStateAnimInfo& ssInfo,
2016-08-27 04:54:53 +00:00
const CCharAnimTime& remTime, u32 dbIdx)
: x0_contributionWeight(cweight), x4_name(name), x14_ssInfo(ssInfo), x2c_remTime(remTime), x34_dbIdx(dbIdx) {}
float GetContributionWeight() const { return x0_contributionWeight; }
2017-11-13 06:19:18 +00:00
std::string_view GetPrimitiveName() const { return x4_name; }
2016-08-27 04:54:53 +00:00
const CSteadyStateAnimInfo& GetSteadyStateAnimInfo() const { return x14_ssInfo; }
const CCharAnimTime& GetTimeRemaining() const { return x2c_remTime; }
u32 GetAnimDatabaseIndex() const { return x34_dbIdx; }
};
template <class T>
class TSubAnimTypeToken : public TLockedToken<CAllFormatsAnimSource>
{
};
template <>
class TSubAnimTypeToken<CAnimSource> : public TLockedToken<CAllFormatsAnimSource>
{
public:
TSubAnimTypeToken<CAnimSource>(const TLockedToken<CAllFormatsAnimSource>& token)
: TLockedToken<CAllFormatsAnimSource>(token) {}
const CAnimSource* GetObj() const
{
const CAllFormatsAnimSource* source = TLockedToken<CAllFormatsAnimSource>::GetObj();
return &source->GetAsCAnimSource();
}
const CAnimSource* operator->() const {return GetObj();}
const CAnimSource& operator*() const {return *GetObj();}
};
template <>
class TSubAnimTypeToken<CFBStreamedCompression> : public TLockedToken<CAllFormatsAnimSource>
{
public:
TSubAnimTypeToken<CFBStreamedCompression>(const TLockedToken<CAllFormatsAnimSource>& token)
: TLockedToken<CAllFormatsAnimSource>(token) {}
const CFBStreamedCompression* GetObj() const
{
const CAllFormatsAnimSource* source = TLockedToken<CAllFormatsAnimSource>::GetObj();
return &source->GetAsCFBStreamedCompression();
}
const CFBStreamedCompression* operator->() const {return GetObj();}
const CFBStreamedCompression& operator*() const {return *GetObj();}
};
2016-04-10 21:22:59 +00:00
class IAnimReader
{
2016-04-11 03:59:54 +00:00
public:
virtual ~IAnimReader() = default;
virtual bool IsCAnimTreeNode() const {return false;}
2016-04-11 07:10:28 +00:00
virtual SAdvancementResults VAdvanceView(const CCharAnimTime& a)=0;
2016-04-11 07:47:21 +00:00
virtual CCharAnimTime VGetTimeRemaining() const=0;
2016-04-16 03:24:25 +00:00
virtual CSteadyStateAnimInfo VGetSteadyStateAnimInfo() const=0;
2016-04-11 03:59:54 +00:00
virtual bool VHasOffset(const CSegId& seg) const=0;
2016-04-12 06:15:32 +00:00
virtual zeus::CVector3f VGetOffset(const CSegId& seg) const=0;
virtual zeus::CQuaternion VGetRotation(const CSegId& seg) const=0;
2016-04-11 07:47:21 +00:00
virtual u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const=0;
virtual u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, u32) const=0;
virtual u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, u32) const=0;
virtual u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, u32) const=0;
2016-04-12 06:15:32 +00:00
virtual bool VGetBoolPOIState(const char*) const=0;
virtual s32 VGetInt32POIState(const char*) const=0;
virtual CParticleData::EParentedMode VGetParticlePOIState(const char*) const=0;
2016-04-11 03:59:54 +00:00
virtual void VGetSegStatementSet(const CSegIdList& list, CSegStatementSet& setOut) const=0;
virtual void VGetSegStatementSet(const CSegIdList& list, CSegStatementSet& setOut, const CCharAnimTime& time) const=0;
2017-03-01 06:02:54 +00:00
virtual std::unique_ptr<IAnimReader> VClone() const=0;
virtual std::experimental::optional<std::unique_ptr<IAnimReader>> VSimplified() {return {};}
2016-04-11 03:59:54 +00:00
virtual void VSetPhase(float)=0;
virtual SAdvancementResults VGetAdvancementResults(const CCharAnimTime& a, const CCharAnimTime& b) const;
2016-04-11 07:10:28 +00:00
2016-04-11 07:47:21 +00:00
u32 GetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const;
u32 GetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, u32) const;
u32 GetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, u32) const;
u32 GetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, u32) const;
2016-08-27 04:54:53 +00:00
std::experimental::optional<std::unique_ptr<IAnimReader>> Simplified() { return VSimplified(); }
2017-03-01 06:02:54 +00:00
std::unique_ptr<IAnimReader> Clone() const { return VClone(); }
2016-04-10 21:22:59 +00:00
};
}