From 790fc7fda31e9daf8cb4299544c78a1ff2b07d36 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 17 May 2025 13:19:40 +0200 Subject: [PATCH] small mdl stuff --- config/SOUE01/symbols.txt | 50 +++++++------- include/d/a/d_a_player.h | 110 +++++++++++++++++++++++-------- include/m/m_angle.h | 4 ++ include/nw4r/g3d/g3d_calcworld.h | 6 +- src/d/d_player_mdl.cpp | 44 +++++++++++++ 5 files changed, 159 insertions(+), 55 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 086d1776..d7c6b37b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2640,7 +2640,7 @@ fn_8005D2D0 = .text:0x8005D2D0; // type:function size:0x8 fn_8005D2E0 = .text:0x8005D2E0; // type:function size:0x34 isAnimationWaitingMaybe = .text:0x8005D320; // type:function size:0x80 fn_8005D3A0 = .text:0x8005D3A0; // type:function size:0x8 -fn_8005D3B0 = .text:0x8005D3B0; // type:function size:0x30 +ExecCallbackC__27daPlBaseCalcWorldCallback_cFPQ34nw4r4math5MTX34Q34nw4r3g3d6ResMdlPQ34nw4r3g3d16FuncObjCalcWorld = .text:0x8005D3B0; // type:function size:0x30 fn_8005D3E0 = .text:0x8005D3E0; // type:function size:0x28 fn_8005D410 = .text:0x8005D410; // type:function size:0x60 InitLinkItemHeap = .text:0x8005D470; // type:function size:0x58 @@ -2665,22 +2665,22 @@ ActorLink__createModelAndSetDrawPriority = .text:0x8005E820; // type:function si createModelAndSetPriorityDraw = .text:0x8005E890; // type:function size:0x68 fn_8005E900 = .text:0x8005E900; // type:function size:0x11C fn_8005EA20 = .text:0x8005EA20; // type:function size:0xA0 -fn_8005EAC0 = .text:0x8005EAC0; // type:function size:0x274 -fn_8005ED40 = .text:0x8005ED40; // type:function size:0x4 -fn_8005ED50 = .text:0x8005ED50; // type:function size:0xC -fn_8005ED60 = .text:0x8005ED60; // type:function size:0x7B0 -fn_8005F510 = .text:0x8005F510; // type:function size:0x4 -fn_8005F520 = .text:0x8005F520; // type:function size:0x24 -fn_8005F550 = .text:0x8005F550; // type:function size:0x8 -fn_8005F560 = .text:0x8005F560; // type:function size:0x8 -fn_8005F570 = .text:0x8005F570; // type:function size:0x8 +fn_8005EAC0__19daPlayerModelBase_cFv = .text:0x8005EAC0; // type:function size:0x274 +someDivingHrabbingStuff__19daPlayerModelBase_cFv = .text:0x8005ED40; // type:function size:0x4 +vt_0x308__19daPlayerModelBase_cFv = .text:0x8005ED50; // type:function size:0xC +fn_8005ED60__19daPlayerModelBase_cFv = .text:0x8005ED60; // type:function size:0x7B0 +vt_0x2E0__19daPlayerModelBase_cFv = .text:0x8005F510; // type:function size:0x4 +vt_0x30C__19daPlayerModelBase_cFR7mVec3_c = .text:0x8005F520; // type:function size:0x24 +isMPPose__19daPlayerModelBase_cFv = .text:0x8005F550; // type:function size:0x8 +isOnTightRope__19daPlayerModelBase_cFv = .text:0x8005F560; // type:function size:0x8 +isOnVines__19daPlayerModelBase_cFv = .text:0x8005F570; // type:function size:0x8 fn_8005F580 = .text:0x8005F580; // type:function size:0x88 fn_8005F610 = .text:0x8005F610; // type:function size:0xD4 fn_8005F6F0 = .text:0x8005F6F0; // type:function size:0x194 -fn_8005F890 = .text:0x8005F890; // type:function size:0x2C0 -fn_8005FB50 = .text:0x8005FB50; // type:function size:0x8 -fn_8005FB60 = .text:0x8005FB60; // type:function size:0xC -fn_8005FB70 = .text:0x8005FB70; // type:function size:0x14 +fn_8005F890__19daPlayerModelBase_cFv = .text:0x8005F890; // type:function size:0x2C0 +vt_0x2E8__19daPlayerModelBase_cFv = .text:0x8005FB50; // type:function size:0x8 +vt_0x304__19daPlayerModelBase_cCFv = .text:0x8005FB60; // type:function size:0xC +isOnClawTargetMaybe__19daPlayerModelBase_cFiR4mAngR4mAng = .text:0x8005FB70; // type:function size:0x14 fn_8005FB90 = .text:0x8005FB90; // type:function size:0x220 fn_8005FDB0 = .text:0x8005FDB0; // type:function size:0x4 fn_8005FDC0 = .text:0x8005FDC0; // type:function size:0x78 @@ -2711,8 +2711,8 @@ fn_80060D50 = .text:0x80060D50; // type:function size:0x54 fn_80060DB0 = .text:0x80060DB0; // type:function size:0x29C fn_80061050 = .text:0x80061050; // type:function size:0x1B0 fn_80061200 = .text:0x80061200; // type:function size:0x210 -fn_80061410 = .text:0x80061410; // type:function size:0x6C -fn_80061480 = .text:0x80061480; // type:function size:0x8 +fn_80061410__19daPlayerModelBase_cFv = .text:0x80061410; // type:function size:0x6C +alwaysRet0__19daPlayerModelBase_cFv = .text:0x80061480; // type:function size:0x8 fn_80061490 = .text:0x80061490; // type:function size:0x1C fn_800614B0 = .text:0x800614B0; // type:function size:0xC fn_800614C0 = .text:0x800614C0; // type:function size:0xC @@ -2728,15 +2728,15 @@ ActorLink__getCenterTranslation = .text:0x80061560; // type:function size:0x8 fn_80061570 = .text:0x80061570; // type:function size:0x8 __dt__19daPlayerModelBase_cFv = .text:0x80061580; // type:function size:0x254 __dt__16daPlBaseAnmChr_cFv = .text:0x800617E0; // type:function size:0x58 -fn_80061840 = .text:0x80061840; // type:function size:0x40 -fn_80061880 = .text:0x80061880; // type:function size:0x40 -fn_800618C0 = .text:0x800618C0; // type:function size:0x40 -fn_80061900 = .text:0x80061900; // type:function size:0x58 -fn_80061960 = .text:0x80061960; // type:function size:0x58 -fn_800619C0 = .text:0x800619C0; // type:function size:0x6C -fn_80061A30 = .text:0x80061A30; // type:function size:0x58 -fn_80061A90 = .text:0x80061A90; // type:function size:0x4 -fn_80061AA0 = .text:0x80061AA0; // type:function size:0x4 +__dt__24daPlBaseScnObjCallback_cFv = .text:0x80061840; // type:function size:0x40 +__dt__27daPlBaseCalcWorldCallback_cFv = .text:0x80061880; // type:function size:0x40 +__dt__Q34nw4r3g3d18ICalcWorldCallbackFv = .text:0x800618C0; // type:function size:0x40 +__dt__19daPlBaseCallback2_cFv = .text:0x80061900; // type:function size:0x58 +__dt__19daPlBaseCallback1_cFv = .text:0x80061960; // type:function size:0x58 +__dt__13daPlBaseMdl_cFv = .text:0x800619C0; // type:function size:0x6C +__dt__21daPlBaseMdlCallback_cFv = .text:0x80061A30; // type:function size:0x58 +ExecCallbackB__Q34nw4r3g3d18ICalcWorldCallbackFPQ34nw4r3g3d13WorldMtxManipQ34nw4r3g3d6ResMdlPQ34nw4r3g3d16FuncObjCalcWorld = .text:0x80061A90; // type:function size:0x4 +ExecCallbackA__Q34nw4r3g3d18ICalcWorldCallbackFPQ34nw4r3g3d12ChrAnmResultQ34nw4r3g3d6ResMdlPQ34nw4r3g3d16FuncObjCalcWorld = .text:0x80061AA0; // type:function size:0x4 dPlayerModel__sinit = .text:0x80061AB0; // type:function size:0x5C computeChecksumInner__FPvUl = .text:0x80061B10; // type:function size:0x88 computeChecksum__FPvUl = .text:0x80061BA0; // type:function size:0x34 diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 28a454f5..2ad00f85 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -49,10 +49,16 @@ public: virtual ~daPlBase_c() {} }; -class daPlBaseCallback1_c : m3d::callback_c {}; -class daPlBaseCallback2_c : m3d::callback_c {}; +class daPlBaseCallback1_c : m3d::callback_c { + u8 _0x__[4]; +}; +class daPlBaseCallback2_c : m3d::callback_c { + u8 _0x__[4]; +}; -class daPlBaseMdlCallback_c : m3d::mdl_c::mdlCallback_c {}; +class daPlBaseMdlCallback_c : m3d::mdl_c::mdlCallback_c { + u8 _0x__[8]; +}; class daPlBaseAnmChr_c : m3d::anmChr_c { public: @@ -74,22 +80,14 @@ private: class daPlBaseCalcWorldCallback_c : public nw4r::g3d::ICalcWorldCallback { public: - virtual void ExecCallbackA( - nw4r::g3d::ChrAnmResult *pResult, nw4r::g3d::ResMdl mdl, - nw4r::g3d::FuncObjCalcWorld *pFuncObj - ) override; // at 0xC - - virtual void ExecCallbackB( - nw4r::g3d::WorldMtxManip *pManip, nw4r::g3d::ResMdl mdl, - nw4r::g3d::FuncObjCalcWorld *pFuncObj - ) override; // at 0x10 - virtual void ExecCallbackC( nw4r::math::MTX34 *pMtxArray, nw4r::g3d::ResMdl mdl, nw4r::g3d::FuncObjCalcWorld *pFuncObj ) override; // at 0x14 }; -class daPlBaseScnObjCallback_c : public nw4r::g3d::IScnObjCallback {}; +class daPlBaseScnObjCallback_c : public nw4r::g3d::IScnObjCallback { + u8 _0x__[0x10]; +}; class UnkPlayerClass { public: @@ -654,19 +652,72 @@ public: FLG0_HANGING_ITEM | FLG0_HANGING_LEDGE | FLG0_UNK_0x10 | FLG0_IN_AIR, }; - // overriddes omitted - /* vt 0x2E0 */ virtual void vt_0x2E0(); - /* vt 0x2E4 */ virtual void someDivingHrabbingStuff(); - /* vt 0x2E8 */ virtual void vt_0x2E8(); - /* vt 0x2EC */ virtual void isOnClawTargetMaybe(); - /* vt 0x2F0 */ virtual void isMPPose(); - /* vt 0x2F4 */ virtual void isOnTightRope(); - /* vt 0x2F8 */ virtual void isOnVines(); - /* vt 0x2FC */ virtual void alwaysRet0(); - /* vt 0x300 */ virtual void canBlockAttack(); - /* vt 0x304 */ virtual void vt_0x304(); - /* vt 0x308 */ virtual void vt_0x308(); - /* vt 0x30C */ virtual void vt_0x30C(); + void fn_8005ED60(); + void fn_8005EAC0(); + void fn_8005F890(); + void fn_80061410(); + + /* vt 0x114 */ virtual void somethingWithCarriedActorFlags() override { + // TODO + } + /* vt 0x118 */ virtual dAcObjBase_c *getCurrentCarriedActor() override { + // TODO + return nullptr; + } + + /* vt 0x0E4 */ virtual const mVec3_c &getCenterTranslation() const override { + // TODO + return mVec3_c::Zero; + } + /* vt 0x0E8 */ virtual const mVec3_c &vt_0x0E8() const override { + return field_0x12F4; + } + /* vt 0x0EC */ virtual const mVec3_c &vt_0x0EC() const override { + // TODO + return mVec3_c::Zero; + } + /* vt 0x0F0 */ virtual const mVec3_c &vt_0x0F0() const override { + // TODO + return mVec3_c::Zero; + } + /* vt 0x0F4 */ virtual const mVec3_c &vt_0x0F4() const override { + // TODO + return mVec3_c::Zero; + } + + /* vt 0x2E0 */ virtual void vt_0x2E0() {} + /* vt 0x2E4 */ virtual void someDivingHrabbingStuff() {} + /* vt 0x2E8 */ virtual bool vt_0x2E8() { + return true; + } + /* vt 0x2EC */ virtual void isOnClawTargetMaybe(UNKWORD, mAng &a1, mAng &a2) { + a1.setR(0); + a2.setR(0); + } + /* vt 0x2F0 */ virtual bool isMPPose() { + return false; + } + /* vt 0x2F4 */ virtual bool isOnTightRope() { + return false; + } + /* vt 0x2F8 */ virtual bool isOnVines() { + return false; + } + /* vt 0x2FC */ virtual bool alwaysRet0() { + return 0; + } + /* vt 0x300 */ virtual bool canBlockAttack() { + return false; + } + /* vt 0x304 */ virtual const mVec3_c &vt_0x304() const { + return mVec3_c::Zero; + } + /* vt 0x308 */ virtual mAng vt_0x308() { + return 0; + } + /* vt 0x30C */ virtual void vt_0x30C(mVec3_c &res) { + res = mVec3_c::Ex; + } protected: /* 0x370 */ mHeapAllocator_c mModelAllocator; @@ -685,8 +736,11 @@ protected: /* 0x46C */ daPlBaseCallback2_c mCallback2; /* 0x474 */ m3d::smdl_c mFaceMdl; /* 0x490 */ m3d::anmChr_c mFaceAnmChr; + /* 0x4C8 */ u8 _0x4C8[4]; /* 0x4CC */ m3d::anmTexPat_c mFaceTexPat; + /* 0x4F8 */ u8 _0x4F8[4]; /* 0x4FC */ m3d::anmTexSrt_c mFaceTexSrt; + /* 0x528 */ u8 _0x528[4]; /* 0x52C */ m3d::anmChr_c mHeadAnmChr; /* 0x564 */ m3d::smdl_c mHandsMdl; /* 0x580 */ daPlBaseCalcWorldCallback_c mCalcWorldCallback; @@ -709,9 +763,11 @@ protected: /* 0x878 */ dCcD_Cyl mCcCyls[3]; /* 0xC68 */ dCcD_Cps mCcCpss[3]; /* 0x10B8 */ dCcD_Cyl mCcCyl; + /* 0x1208 */ u8 _0x1208[0xA4]; /* 0x12AC */ mVec3_c mTranslationHand[2]; /* 0x12C4 */ mVec3_c mTranslationWeapon[2]; /* 0x12DC */ mVec3_c mToeTranslation[2]; + /* 0x12F4 */ mVec3_c field_0x12F4; /* 0x1300 */ UnkPlayerClass mUnk_0x1300[4]; /* 0x1340 */ mQuat_c mQuat1; /* 0x1350 */ mQuat_c mQuat2; diff --git a/include/m/m_angle.h b/include/m/m_angle.h index a39d29d2..a227f3f0 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -36,6 +36,10 @@ struct mAng { return &mVal; } + void setR(const u32 &v) { + mVal = v; + } + mAng operator-() { return mAng(-mVal); } diff --git a/include/nw4r/g3d/g3d_calcworld.h b/include/nw4r/g3d/g3d_calcworld.h index d32c5adf..3a08e7b2 100644 --- a/include/nw4r/g3d/g3d_calcworld.h +++ b/include/nw4r/g3d/g3d_calcworld.h @@ -43,13 +43,13 @@ public: virtual ~ICalcWorldCallback() {}; // at 0x8 virtual void ExecCallbackA(ChrAnmResult *pResult, ResMdl mdl, - FuncObjCalcWorld *pFuncObj) = 0; // at 0xC + FuncObjCalcWorld *pFuncObj) {}; // at 0xC virtual void ExecCallbackB(WorldMtxManip *pManip, ResMdl mdl, - FuncObjCalcWorld *pFuncObj) = 0; // at 0x10 + FuncObjCalcWorld *pFuncObj) {}; // at 0x10 virtual void ExecCallbackC(math::MTX34 *pMtxArray, ResMdl mdl, - FuncObjCalcWorld *pFuncObj) = 0; // at 0x14 + FuncObjCalcWorld *pFuncObj) {}; // at 0x14 }; /****************************************************************************** diff --git a/src/d/d_player_mdl.cpp b/src/d/d_player_mdl.cpp index eac936bd..a69d3fec 100644 --- a/src/d/d_player_mdl.cpp +++ b/src/d/d_player_mdl.cpp @@ -1,4 +1,48 @@ #include "d/a/d_a_player.h" +#include "m/m_vec.h" + +// TODO: This file contains the vtable and a bunch of weak functions +// for daPlayerModelBase_c. How do we generate the vtable here though? +// All virtual methods of daPlayerModelBase_c seem to be inline, so +// there's not much opportunity to get the vtable to be emitted here +// except for dtor hacks... + +void daPlBaseCalcWorldCallback_c::ExecCallbackC( + nw4r::math::MTX34 *pMtxArray, nw4r::g3d::ResMdl mdl, + nw4r::g3d::FuncObjCalcWorld *pFuncObj + ) { + + } + +void daPlayerModelBase_c::fn_8005EAC0() { + // Just getting weak functions to appear here + someDivingHrabbingStuff(); + vt_0x308(); +} + +void daPlayerModelBase_c::fn_8005ED60() { + // Just getting weak functions to appear here + vt_0x2E0(); + vt_0x308(); + mVec3_c v; + vt_0x30C(v); + isMPPose(); + isOnTightRope(); + isOnVines(); +} + +void daPlayerModelBase_c::fn_8005F890() { + // Just getting weak functions to appear here + vt_0x2E8(); + vt_0x304(); + mAng a1, a2; + isOnClawTargetMaybe(0, a1, a2); +} + +void daPlayerModelBase_c::fn_80061410() { + // Just getting weak functions to appear here + alwaysRet0(); +} void dummy_triggerDtor(daPlayerModelBase_c *pl) { delete pl;