#pragma once #include "IFactory.hpp" #include "IObjFactory.hpp" #include "CToken.hpp" #include "CSimplePool.hpp" #include "CAnimationSet.hpp" namespace urde { class CSimplePool; class CAnimCharacterSet; class CCharacterInfo; class CCharLayoutInfo; class CAdditiveAnimationInfo; class CTransitionDatabaseGame; class CAnimationManager; class CTransitionManager; class CAllFormatsAnimSource; class CAnimData; class CCharacterFactory : public IObjFactory { public: class CDummyFactory : public IFactory { public: CFactoryFnReturn Build(const SObjectTag&, const CVParamTransfer&, CObjectReference* selfRef); void BuildAsync(const SObjectTag&, const CVParamTransfer&, std::unique_ptr*, CObjectReference* selfRef); void CancelBuild(const SObjectTag&); bool CanBuild(const SObjectTag&); const SObjectTag* GetResourceIdByName(std::string_view) const; FourCC GetResourceTypeById(CAssetId id) const; void EnumerateResources(const std::function& lambda) const; void EnumerateNamedResources(const std::function& lambda) const; u32 ResourceSize(const urde::SObjectTag& tag); std::shared_ptr LoadResourceAsync(const urde::SObjectTag& tag, void* target); std::shared_ptr LoadResourcePartAsync(const urde::SObjectTag& tag, u32 off, u32 size, void* target); std::unique_ptr LoadResourceSync(const urde::SObjectTag& tag); std::unique_ptr LoadNewResourcePartSync(const urde::SObjectTag& tag, u32 off, u32 size); }; private: std::vector x4_charInfoDB; std::vector> x14_charLayoutInfoDB; std::shared_ptr x24_sysContext; std::shared_ptr x28_animMgr; std::shared_ptr x2c_transMgr; std::vector> x30_animSourceDB; std::vector> x40_additiveInfo; CAdditiveAnimationInfo x50_defaultAdditiveInfo; std::vector> x58_animResources; CAssetId x68_selfId; CDummyFactory x6c_dummyFactory; CSimplePool x70_cacheResPool; static std::vector GetCharacterInfoDB(const CAnimCharacterSet& ancs); static std::vector> GetCharLayoutInfoDB(CSimplePool& store, const std::vector& chars); public: CCharacterFactory(CSimplePool& store, const CAnimCharacterSet& ancs, CAssetId); std::unique_ptr CreateCharacter(int charIdx, bool loop, const TLockedToken& factory, int defaultAnim, int drawInsts) const; CAssetId GetEventResourceIdForAnimResourceId(CAssetId animId) const; const CCharacterInfo& GetCharInfo(int charIdx) const { return x4_charInfoDB[charIdx]; } const CAdditiveAnimationInfo& FindAdditiveInfo(u32 idx) const; bool HasAdditiveInfo(u32 idx) const; }; }