#pragma once #include #include #include #include #include #include #include "KingSystem/Utils/Types.h" namespace ksys::phys { class SupportBoneResource : public sead::DirectResource, agl::utl::IParameterIO { public: struct Bone : public agl::utl::ParameterObj { ~Bone(); agl::utl::Parameter> name; }; struct ConnectionLinear : public agl::utl::ParameterObj { agl::utl::Parameter bone_attribute; // TODO enum? agl::utl::Parameter slope_intercept; }; struct ConnectionCurve : public agl::utl::ParameterObj { ~ConnectionCurve() = default; agl::utl::Parameter bone_attribute; // TODO enum? agl::utl::Parameter constant_in; agl::utl::Parameter constant_out; agl::utl::Parameter key0; agl::utl::Parameter key1; agl::utl::Parameter key2; }; struct OutputSingle : public agl::utl::ParameterObj { agl::utl::Parameter connection; agl::utl::Parameter weight; }; struct OutputDouble : public agl::utl::ParameterObj { ~OutputDouble() = default; agl::utl::Parameter connection_0; agl::utl::Parameter weight_0; agl::utl::Parameter connection_1; agl::utl::Parameter weight_1; }; struct BaseBone : public agl::utl::ParameterObj { BaseBone(); ~BaseBone(); void postRead_() override; agl::utl::Parameter bone; agl::utl::Parameter aim; agl::utl::Parameter up; agl::utl::Parameter space; agl::utl::Parameter base_rotate; agl::utl::Parameter base_translate; sead::Quatf reverse_rotate; sead::Vector3 side; }; struct MainBone : public BaseBone { MainBone(); }; struct SupportBone : public BaseBone { SupportBone(); ~SupportBone() = default; agl::utl::Parameter bendH; agl::utl::Parameter bendV; agl::utl::Parameter roll; agl::utl::Parameter translateX; agl::utl::Parameter translateY; agl::utl::Parameter translateZ; }; SupportBoneResource(); ~SupportBoneResource(); void freeBuffers(); int getSupportBoneIndexByName(const sead::SafeString& name); virtual void doCreate_(u8* data, u32 actualFileSize, sead::Heap* heap); bool init(agl::utl::ResParameterArchive archive, sead::Heap* heap); float getInterpolatedConnectionCurve(u32 index, float lookup); float somethingGetLinearConnection(u32 a2, float a3); private: agl::utl::ParameterObj mSupportBoneHeader; agl::utl::ParameterList mSupportBoneData; agl::utl::Parameter mBoneNum; agl::utl::ParameterList mBoneList; sead::Buffer boneBuffer; agl::utl::Parameter mConnectionLinearNum; agl::utl::ParameterList mConnectionLinearList; sead::Buffer mConnectionLinearBuffer; agl::utl::Parameter mConnectionCurveNum; agl::utl::ParameterList mConnectionCurveList; sead::Buffer mConnectionCurveBuffer; agl::utl::Parameter mOutputSingleNum; agl::utl::ParameterList mOutputSingleList; sead::Buffer mOutputSingleBuffer; agl::utl::Parameter mOutputDoubleNum; agl::utl::ParameterList mOutputDoubleList; sead::Buffer mOutputDoubleBuffer; agl::utl::Parameter mMainBoneNum; agl::utl::ParameterList mMainBoneList; sead::Buffer mMainBoneBuffer; agl::utl::Parameter mSupportBoneNum; agl::utl::ParameterList mSupportBoneList; sead::Buffer mSupportBoneBuffer; }; KSYS_CHECK_SIZE_NX150(SupportBoneResource, 0x5B0); } // namespace ksys::phys