#pragma once #include #include #include "DataSpec/DNACommon/DNACommon.hpp" #include "DataSpec/DNACommon/ParticleCommon.hpp" namespace DataSpec { class PAKEntryReadStream; } namespace hecl { class ProjectPath; } namespace DataSpec::DNAParticle { template struct _GPSM { static constexpr ParticleType Type = ParticleType::GPSM; #define INT_ENTRY(name, identifier) IntElementFactory identifier; #define REAL_ENTRY(name, identifier) RealElementFactory identifier; #define VECTOR_ENTRY(name, identifier) VectorElementFactory identifier; #define MOD_VECTOR_ENTRY(name, identifier) ModVectorElementFactory identifier; #define COLOR_ENTRY(name, identifier) ColorElementFactory identifier; #define EMITTER_ENTRY(name, identifier) EmitterElementFactory identifier; #define UV_ENTRY(name, identifier) UVElementFactory identifier; #define RES_ENTRY(name, identifier) ChildResourceFactory identifier; #define KSSM_ENTRY(name, identifier) SpawnSystemKeyframeData identifier; #define BOOL_ENTRY(name, identifier, def) bool identifier = def; #include "PART.def" template void constexpr Enumerate(_Func f) { #define ENTRY(name, identifier) f(FOURCC(name), identifier); #define BOOL_ENTRY(name, identifier, def) f(FOURCC(name), identifier, def); #include "PART.def" } template bool constexpr Lookup(FourCC fcc, _Func f) { switch (fcc.toUint32()) { #define ENTRY(name, identifier) \ case SBIG(name): \ f(identifier); \ return true; #include "PART.def" default: return false; } } }; template using GPSM = PPImpl<_GPSM>; template bool ExtractGPSM(PAKEntryReadStream& rs, const hecl::ProjectPath& outPath); template bool WriteGPSM(const GPSM& gpsm, const hecl::ProjectPath& outPath); } // namespace DataSpec::DNAParticle