#pragma once #include #include "Runtime/CFactoryMgr.hpp" #include "Runtime/Character/CSkinBank.hpp" #include "Runtime/RetroTypes.hpp" #include namespace metaforce { class CPoseAsTransforms; class CModel; struct SSkinWeighting { CSegId x0_id; float x4_weight; explicit SSkinWeighting(CInputStream& in) : x0_id(in), x4_weight(in.ReadFloat()) {} }; class CVirtualBone { friend class CSkinnedModel; rstl::reserved_vector x0_weights; u32 x1c_vertexCount; zeus::CTransform x20_xf; zeus::CMatrix3f x50_mtx; public: explicit CVirtualBone(CInputStream& in); [[nodiscard]] const rstl::reserved_vector& GetWeights() const { return x0_weights; } }; class CSkinRules { friend class CSkinnedModel; std::vector x0_bones; u32 x10_vertexCount = 0; u32 x14_normalCount = 0; public: explicit CSkinRules(CInputStream& in); // void GetBankTransforms(std::vector& out, const CPoseAsTransforms& pose, // int skinBankIdx) const { // // FIXME: This is definitely not proper behavior, this is here to fix the phazon suit crashing // if (x0_skinBanks.size() <= skinBankIdx) { // return; // } // x0_skinBanks[skinBankIdx].GetBankTransforms(out, pose); // } // void TransformVerticesCPU(std::vector>& vnOut, // const CPoseAsTransforms& pose, const CModel& model) const; }; CFactoryFnReturn FSkinRulesFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& params, CObjectReference* selfRef); } // namespace metaforce