#pragma once #include "RetroTypes.hpp" #include "CFactoryMgr.hpp" #include "IObj.hpp" #include "CToken.hpp" #include "IOStreams.hpp" namespace urde { class CGenDescription; class CSwooshDescription; class CElectricDescription; class CSimplePool; class CVParamTransfer; class CModel; class CUVElement; class CColorElement; class CModVectorElement; class CEmitterElement; class CVectorElement; class CRealElement; class CIntElement; struct SParticleModel { TLockedToken m_token; bool m_found = false; CModel* m_model = nullptr; SParticleModel() = default; SParticleModel(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} operator bool() const { return m_found; } }; struct SChildGeneratorDesc { TLockedToken m_token; bool m_found = false; CGenDescription* m_gen = nullptr; SChildGeneratorDesc() = default; SChildGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} operator bool() const { return m_found; } }; struct SSwooshGeneratorDesc { TLockedToken m_token; bool m_found = false; CSwooshDescription* m_swoosh = nullptr; SSwooshGeneratorDesc() = default; SSwooshGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} operator bool() const { return m_found; } }; struct SElectricGeneratorDesc { TLockedToken m_token; bool m_found = false; CElectricDescription* m_electric = nullptr; SElectricGeneratorDesc() = default; SElectricGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} operator bool() const { return m_found; } }; class CParticleDataFactory { friend class CDecalDataFactory; friend class CCollisionResponseData; friend class CParticleElectricDataFactory; friend class CParticleSwooshDataFactory; friend class CProjectileWeaponDataFactory; static SParticleModel GetModel(CInputStream& in, CSimplePool* resPool); static SChildGeneratorDesc GetChildGeneratorDesc(CAssetId res, CSimplePool* resPool, const std::vector& tracker); static SChildGeneratorDesc GetChildGeneratorDesc(CInputStream& in, CSimplePool* resPool, const std::vector& tracker); static SSwooshGeneratorDesc GetSwooshGeneratorDesc(CInputStream& in, CSimplePool* resPool); static SElectricGeneratorDesc GetElectricGeneratorDesc(CInputStream& in, CSimplePool* resPool); static std::unique_ptr GetTextureElement(CInputStream& in, CSimplePool* resPool); static std::unique_ptr GetColorElement(CInputStream& in); static std::unique_ptr GetModVectorElement(CInputStream& in); static std::unique_ptr GetEmitterElement(CInputStream& in); static std::unique_ptr GetVectorElement(CInputStream& in); static std::unique_ptr GetRealElement(CInputStream& in); static std::unique_ptr GetIntElement(CInputStream& in); static float GetReal(CInputStream& in); static s32 GetInt(CInputStream& in); static bool GetBool(CInputStream& in); static FourCC GetClassID(CInputStream& in); static CGenDescription* CreateGeneratorDescription(CInputStream& in, std::vector& tracker, CAssetId resId, CSimplePool* resPool); static bool CreateGPSM(CGenDescription* fillDesc, CInputStream& in, std::vector& tracker, CSimplePool* resPool); static void LoadGPSMTokens(CGenDescription* desc); public: static CGenDescription* GetGeneratorDesc(CInputStream& in, CSimplePool* resPool); }; CFactoryFnReturn FParticleFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& vparms, CObjectReference* selfRef); }