#ifndef __PSHAG_CANIMSOURCEREADER_HPP__ #define __PSHAG_CANIMSOURCEREADER_HPP__ #include "IAnimReader.hpp" #include "CToken.hpp" #include "CAnimSource.hpp" #include "CParticleData.hpp" namespace urde { template using TSubAnimTypeToken = TCachedToken; class IAnimSourceInfo { public: virtual ~IAnimSourceInfo() = default; virtual bool HasPOIData() const=0; virtual const std::vector& GetBoolPOIStream() const=0; virtual const std::vector& GetInt32POIStream() const=0; virtual const std::vector& GetParticlePOIStream() const=0; virtual const std::vector& GetSoundPOIStream() const=0; virtual CCharAnimTime GetAnimationDuration() const=0; }; class CAnimSourceInfo : public IAnimSourceInfo { TSubAnimTypeToken x4_token; public: CAnimSourceInfo(const TSubAnimTypeToken& token); bool HasPOIData() const; const std::vector& GetBoolPOIStream() const; const std::vector& GetInt32POIStream() const; const std::vector& GetParticlePOIStream() const; const std::vector& GetSoundPOIStream() const; CCharAnimTime GetAnimationDuration() const; }; class CAnimSourceReaderBase : public IAnimReader { std::unique_ptr x4_sourceInfo; CCharAnimTime xc_curTime; u32 x14_passedBoolCount = 0; u32 x18_passedIntCount = 0; u32 x1c_passedParticleCount = 0; u32 x20_passedSoundCount = 0; std::vector> x24_boolStates; std::vector> x34_int32States; std::vector> x44_particleStates; std::map GetUniqueParticlePOIs() const; std::map GetUniqueInt32POIs() const; std::map GetUniqueBoolPOIs() const; protected: void PostConstruct(const CCharAnimTime& time); void UpdatePOIStates(); public: CAnimSourceReaderBase(std::unique_ptr&& sourceInfo, const CCharAnimTime& time); u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const; u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, u32) const; u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, u32) const; u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, u32) const; bool VGetBoolPOIState(const char* name) const; s32 VGetInt32POIState(const char* name) const; CParticleData::EParentedMode VGetParticlePOIState(const char* name) const; virtual zeus::CVector3f VGetOffset(const CSegId& seg, const CCharAnimTime& b) const=0; virtual bool VSupportsReverseView() const=0; virtual SAdvancementResults VReverseView(const CCharAnimTime& time)=0; }; class CAnimSourceReader : public CAnimSourceReaderBase { TSubAnimTypeToken x54_source; CCharAnimTime x64_duration; zeus::CVector3f x6c_curRootOffset; bool x78_ = false; public: CAnimSourceReader(const TSubAnimTypeToken& source, const CCharAnimTime& time); SAdvancementResults VGetAdvancementResults(const CCharAnimTime& a, const CCharAnimTime& b) const; bool VSupportsReverseView() const {return true;} void VSetPhase(float); SAdvancementResults VReverseView(const CCharAnimTime& time); std::shared_ptr VClone() const; void VGetSegStatementSet(const CSegIdList& list, CSegStatementSet& setOut) const; void VGetSegStatementSet(const CSegIdList& list, CSegStatementSet& setOut, const CCharAnimTime& time) const; SAdvancementResults VAdvanceView(const CCharAnimTime& a); CCharAnimTime VGetTimeRemaining() const; void VGetSteadyStateAnimInfo() const; bool VHasOffset(const CSegId& seg) const; zeus::CVector3f VGetOffset(const CSegId& seg) const; zeus::CVector3f VGetOffset(const CSegId& seg, const CCharAnimTime& time) const; zeus::CQuaternion VGetRotation(const CSegId& seg) const; }; } #endif // __PSHAG_CANIMSOURCEREADER_HPP__