#ifndef _DNAMP2_ANCS_HPP_ #define _DNAMP2_ANCS_HPP_ #include #include "../DNACommon/DNACommon.hpp" #include "../DNACommon/ANCS.hpp" #include "CMDLMaterials.hpp" #include "BlenderConnection.hpp" #include "CINF.hpp" #include "CSKR.hpp" #include "ANIM.hpp" #include "../DNAMP1/ANCS.hpp" namespace DataSpec { namespace DNAMP2 { struct ANCS : BigYAML { using CINFType = CINF; using CSKRType = CSKR; using ANIMType = ANIM; ANCS(const UniqueID32& ancsId) : animationSet(ancsId) {} DECL_YAML Value version; struct CharacterSet : BigYAML { DECL_YAML Value version; Value characterCount; struct CharacterInfo : BigYAML { DECL_YAML Delete expl; using MP1CharacterInfo = DNAMP1::ANCS::CharacterSet::CharacterInfo; atUint32 idx; std::string name; UniqueID32 cmdl; UniqueID32 _cskrOld; UniqueID32 _cinfOld; AuxiliaryID32 cskr = _S("skin"); AuxiliaryID32 cinf = {_S("layout"), _S("skin")}; struct Animation : BigYAML { DECL_YAML Value animIdx; String<-1> strA; }; std::vector animations; MP1CharacterInfo::PASDatabase pasDatabase; struct ParticleResData { std::vector part; std::vector swhc; std::vector unk; std::vector elsc; std::vector spsc; std::vector unk2; } partResData; atUint32 unk1 = 0; std::vector animAABBs; struct Effect : BigYAML { DECL_YAML String<-1> name; Value compCount; struct EffectComponent : BigYAML { DECL_YAML String<-1> name; DNAFourCC type; UniqueID32 id; Value unkMP2; Value unk1; Value unk2; Value unk3; }; Vector comps; }; std::vector effects; UniqueID32 cmdlOverlay; UniqueID32 _cskrOverlayOld; AuxiliaryID32 cskrOverlay = _S("skin"); std::vector animIdxs; atUint32 unk4; atUint8 unk5; struct Extents : BigYAML { DECL_YAML Value animIdx; Value aabb[2]; }; std::vector extents; }; Vector characters; } characterSet; struct AnimationSet : BigYAML { DECL_YAML Delete expl; const UniqueID32& m_ancsId; AnimationSet(const UniqueID32& ancsId) : m_ancsId(ancsId), defaultTransition(ancsId) {} using MP1AnimationSet = DNAMP1::ANCS::AnimationSet; std::vector animations; std::vector transitions; MP1AnimationSet::MetaTransFactory defaultTransition; std::vector additiveAnims; float floatA = 0.0; float floatB = 0.0; std::vector halfTransitions; struct EVNT : BigYAML { DECL_YAML Delete expl; atUint32 version; struct EventBase : BigYAML { DECL_YAML Value unk0; String<-1> name; Value type; Value startTime; Value unk1; Value idx; Value unk2; Value unk3; Value unk4; Value unk5; }; struct LoopEvent : EventBase { DECL_YAML Value flag; }; std::vector loopEvents; struct UEVTEvent : EventBase { DECL_YAML Value uevtType; String<-1> boneName; }; std::vector uevtEvents; struct EffectEvent : EventBase { DECL_YAML Value frameCount; DNAFourCC effectType; UniqueID32 effectId; Value boneId; Value scale; Value parentMode; }; std::vector effectEvents; struct SFXEvent : EventBase { DECL_YAML Value soundId; Value smallNum; Value bigNum; Value sfxUnk1; Value sfxUnk2; Value sfxUnk3; Value sfxUnk4; }; std::vector sfxEvents; }; std::vector evnts; } animationSet; void getCharacterResInfo(std::vector>& out) const { out.clear(); out.reserve(characterSet.characters.size()); for (const CharacterSet::CharacterInfo& ci : characterSet.characters) { out.emplace_back(); DNAANCS::CharacterResInfo& chOut = out.back(); chOut.name = ci.name; chOut.cmdl = ci.cmdl; chOut.cskr = ci._cskrOld; chOut.cinf = ci._cinfOld; if (ci.cmdlOverlay) chOut.overlays.emplace_back(FOURCC('OVER'), std::make_pair(ci.cmdlOverlay, ci._cskrOverlayOld)); } } void getAnimationResInfo(std::map>& out) const { out.clear(); for (const DNAMP1::ANCS::AnimationSet::Animation& ai : animationSet.animations) ai.metaAnim.m_anim->gatherPrimitives(out); } static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const DNAMP1::PAK::Entry& entry, bool force, hecl::BlenderToken& btok, std::function fileChanged) { hecl::ProjectPath yamlPath = outPath.getWithExtension(_S(".yaml")); hecl::ProjectPath::Type yamlType = yamlPath.getPathType(); hecl::ProjectPath blendPath = outPath.getWithExtension(_S(".blend")); hecl::ProjectPath::Type blendType = blendPath.getPathType(); if (force || yamlType == hecl::ProjectPath::Type::None || blendType == hecl::ProjectPath::Type::None) { ANCS ancs(entry.id); ancs.read(rs); if (force || yamlType == hecl::ProjectPath::Type::None) { FILE* fp = hecl::Fopen(yamlPath.getAbsolutePath().c_str(), _S("wb")); ancs.toYAMLFile(fp); fclose(fp); } if (force || blendType == hecl::ProjectPath::Type::None) { hecl::BlenderConnection& conn = btok.getBlenderConnection(); DNAANCS::ReadANCSToBlender, ANCS, MaterialSet, DNACMDL::SurfaceHeader_2, 4> (conn, ancs, blendPath, pakRouter, entry, dataSpec, fileChanged, force); } } return true; } }; } } #endif // _DNAMP2_ANCS_HPP_