diff --git a/asm/m_Do/m_Do_ext/entryDL__21mDoExt_invisibleModelFP4cXyz.s b/asm/m_Do/m_Do_ext/entryDL__21mDoExt_invisibleModelFP4cXyz.s deleted file mode 100644 index e59bcbf1c78..00000000000 --- a/asm/m_Do/m_Do_ext/entryDL__21mDoExt_invisibleModelFP4cXyz.s +++ /dev/null @@ -1,30 +0,0 @@ -lbl_8000E7C0: -/* 8000E7C0 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 8000E7C4 7C 08 02 A6 */ mflr r0 -/* 8000E7C8 90 01 00 24 */ stw r0, 0x24(r1) -/* 8000E7CC 39 61 00 20 */ addi r11, r1, 0x20 -/* 8000E7D0 48 35 3A 05 */ bl _savegpr_27 -/* 8000E7D4 7C 7B 1B 78 */ mr r27, r3 -/* 8000E7D8 7C 9C 23 78 */ mr r28, r4 -/* 8000E7DC 3C 60 80 43 */ lis r3, j3dSys@ha /* 0x80434AC8@ha */ -/* 8000E7E0 3B E3 4A C8 */ addi r31, r3, j3dSys@l /* 0x80434AC8@l */ -/* 8000E7E4 83 DF 00 48 */ lwz r30, 0x48(r31) -/* 8000E7E8 83 BF 00 4C */ lwz r29, 0x4c(r31) -/* 8000E7EC 3C 60 80 40 */ lis r3, g_dComIfG_gameInfo@ha /* 0x804061C0@ha */ -/* 8000E7F0 38 63 61 C0 */ addi r3, r3, g_dComIfG_gameInfo@l /* 0x804061C0@l */ -/* 8000E7F4 80 03 5F A8 */ lwz r0, 0x5fa8(r3) -/* 8000E7F8 90 1F 00 48 */ stw r0, 0x48(r31) -/* 8000E7FC 90 1F 00 4C */ stw r0, 0x4c(r31) -/* 8000E800 80 7B 00 00 */ lwz r3, 0(r27) -/* 8000E804 4B FF F5 61 */ bl mDoExt_modelEntryDL__FP8J3DModel -/* 8000E808 7F 63 DB 78 */ mr r3, r27 -/* 8000E80C 7F 84 E3 78 */ mr r4, r28 -/* 8000E810 4B FF FE B9 */ bl entryJoint__21mDoExt_invisibleModelFP4cXyz -/* 8000E814 93 DF 00 48 */ stw r30, 0x48(r31) -/* 8000E818 93 BF 00 4C */ stw r29, 0x4c(r31) -/* 8000E81C 39 61 00 20 */ addi r11, r1, 0x20 -/* 8000E820 48 35 3A 01 */ bl _restgpr_27 -/* 8000E824 80 01 00 24 */ lwz r0, 0x24(r1) -/* 8000E828 7C 08 03 A6 */ mtlr r0 -/* 8000E82C 38 21 00 20 */ addi r1, r1, 0x20 -/* 8000E830 4E 80 00 20 */ blr diff --git a/asm/m_Do/m_Do_ext/entryJoint__21mDoExt_invisibleModelFP4cXyz.s b/asm/m_Do/m_Do_ext/entryJoint__21mDoExt_invisibleModelFP4cXyz.s deleted file mode 100644 index 24eaea2ac5f..00000000000 --- a/asm/m_Do/m_Do_ext/entryJoint__21mDoExt_invisibleModelFP4cXyz.s +++ /dev/null @@ -1,69 +0,0 @@ -lbl_8000E6C8: -/* 8000E6C8 94 21 FF C0 */ stwu r1, -0x40(r1) -/* 8000E6CC 7C 08 02 A6 */ mflr r0 -/* 8000E6D0 90 01 00 44 */ stw r0, 0x44(r1) -/* 8000E6D4 39 61 00 40 */ addi r11, r1, 0x40 -/* 8000E6D8 48 35 3A F5 */ bl _savegpr_25 -/* 8000E6DC 7C 79 1B 78 */ mr r25, r3 -/* 8000E6E0 7C 9A 23 79 */ or. r26, r4, r4 -/* 8000E6E4 80 63 00 00 */ lwz r3, 0(r3) -/* 8000E6E8 83 A3 00 04 */ lwz r29, 4(r3) -/* 8000E6EC 83 F9 00 04 */ lwz r31, 4(r25) -/* 8000E6F0 40 82 00 78 */ bne lbl_8000E768 -/* 8000E6F4 3B 60 00 00 */ li r27, 0 -/* 8000E6F8 3C 60 80 40 */ lis r3, g_dComIfG_gameInfo@ha /* 0x804061C0@ha */ -/* 8000E6FC 3B C3 61 C0 */ addi r30, r3, g_dComIfG_gameInfo@l /* 0x804061C0@l */ -/* 8000E700 3B 9E 5F 64 */ addi r28, r30, 0x5f64 -/* 8000E704 48 00 00 50 */ b lbl_8000E754 -lbl_8000E708: -/* 8000E708 80 79 00 00 */ lwz r3, 0(r25) -/* 8000E70C 80 63 00 84 */ lwz r3, 0x84(r3) -/* 8000E710 80 63 00 0C */ lwz r3, 0xc(r3) -/* 8000E714 57 60 04 3E */ clrlwi r0, r27, 0x10 -/* 8000E718 1C 00 00 30 */ mulli r0, r0, 0x30 -/* 8000E71C 7C 63 02 14 */ add r3, r3, r0 -/* 8000E720 C0 43 00 2C */ lfs f2, 0x2c(r3) -/* 8000E724 C0 23 00 1C */ lfs f1, 0x1c(r3) -/* 8000E728 C0 03 00 0C */ lfs f0, 0xc(r3) -/* 8000E72C D0 01 00 08 */ stfs f0, 8(r1) -/* 8000E730 D0 21 00 0C */ stfs f1, 0xc(r1) -/* 8000E734 D0 41 00 10 */ stfs f2, 0x10(r1) -/* 8000E738 7F 83 E3 78 */ mr r3, r28 -/* 8000E73C 80 9E 5F A8 */ lwz r4, 0x5fa8(r30) -/* 8000E740 7F E5 FB 78 */ mr r5, r31 -/* 8000E744 38 C1 00 08 */ addi r6, r1, 8 -/* 8000E748 48 04 7E A5 */ bl entryZSortXluDrawList__12dDlst_list_cFP13J3DDrawBufferP9J3DPacketR4cXyz -/* 8000E74C 3B FF 00 18 */ addi r31, r31, 0x18 -/* 8000E750 3B 7B 00 01 */ addi r27, r27, 1 -lbl_8000E754: -/* 8000E754 57 63 04 3E */ clrlwi r3, r27, 0x10 -/* 8000E758 A0 1D 00 2C */ lhz r0, 0x2c(r29) -/* 8000E75C 7C 03 00 40 */ cmplw r3, r0 -/* 8000E760 41 80 FF A8 */ blt lbl_8000E708 -/* 8000E764 48 00 00 44 */ b lbl_8000E7A8 -lbl_8000E768: -/* 8000E768 3B 60 00 00 */ li r27, 0 -/* 8000E76C 3C 60 80 40 */ lis r3, g_dComIfG_gameInfo@ha /* 0x804061C0@ha */ -/* 8000E770 3B C3 61 C0 */ addi r30, r3, g_dComIfG_gameInfo@l /* 0x804061C0@l */ -/* 8000E774 3B 9E 5F 64 */ addi r28, r30, 0x5f64 -/* 8000E778 48 00 00 20 */ b lbl_8000E798 -lbl_8000E77C: -/* 8000E77C 7F 83 E3 78 */ mr r3, r28 -/* 8000E780 80 9E 5F A8 */ lwz r4, 0x5fa8(r30) -/* 8000E784 7F E5 FB 78 */ mr r5, r31 -/* 8000E788 7F 46 D3 78 */ mr r6, r26 -/* 8000E78C 48 04 7E 61 */ bl entryZSortXluDrawList__12dDlst_list_cFP13J3DDrawBufferP9J3DPacketR4cXyz -/* 8000E790 3B FF 00 18 */ addi r31, r31, 0x18 -/* 8000E794 3B 7B 00 01 */ addi r27, r27, 1 -lbl_8000E798: -/* 8000E798 57 63 04 3E */ clrlwi r3, r27, 0x10 -/* 8000E79C A0 1D 00 2C */ lhz r0, 0x2c(r29) -/* 8000E7A0 7C 03 00 40 */ cmplw r3, r0 -/* 8000E7A4 41 80 FF D8 */ blt lbl_8000E77C -lbl_8000E7A8: -/* 8000E7A8 39 61 00 40 */ addi r11, r1, 0x40 -/* 8000E7AC 48 35 3A 6D */ bl _restgpr_25 -/* 8000E7B0 80 01 00 44 */ lwz r0, 0x44(r1) -/* 8000E7B4 7C 08 03 A6 */ mtlr r0 -/* 8000E7B8 38 21 00 40 */ addi r1, r1, 0x40 -/* 8000E7BC 4E 80 00 20 */ blr diff --git a/asm/m_Do/m_Do_ext/func_8000FC4C.s b/asm/m_Do/m_Do_ext/func_8000FC4C.s deleted file mode 100644 index 5d29b66ec46..00000000000 --- a/asm/m_Do/m_Do_ext/func_8000FC4C.s +++ /dev/null @@ -1,50 +0,0 @@ -lbl_8000FC4C: -/* 8000FC4C 94 21 FF B0 */ stwu r1, -0x50(r1) -/* 8000FC50 7C 08 02 A6 */ mflr r0 -/* 8000FC54 90 01 00 54 */ stw r0, 0x54(r1) -/* 8000FC58 DB E1 00 48 */ stfd f31, 0x48(r1) -/* 8000FC5C 39 61 00 48 */ addi r11, r1, 0x48 -/* 8000FC60 48 35 25 59 */ bl _savegpr_20 -/* 8000FC64 7C 74 1B 78 */ mr r20, r3 -/* 8000FC68 7C 95 23 78 */ mr r21, r4 -/* 8000FC6C 7C B6 2B 78 */ mr r22, r5 -/* 8000FC70 7C D7 33 78 */ mr r23, r6 -/* 8000FC74 7C F8 3B 78 */ mr r24, r7 -/* 8000FC78 7D 19 43 78 */ mr r25, r8 -/* 8000FC7C FF E0 08 90 */ fmr f31, f1 -/* 8000FC80 7D 3A 4B 78 */ mr r26, r9 -/* 8000FC84 7D 5B 53 78 */ mr r27, r10 -/* 8000FC88 83 81 00 58 */ lwz r28, 0x58(r1) -/* 8000FC8C 83 A1 00 5C */ lwz r29, 0x5c(r1) -/* 8000FC90 83 C1 00 60 */ lwz r30, 0x60(r1) -/* 8000FC94 83 E1 00 64 */ lwz r31, 0x64(r1) -/* 8000FC98 4B FF FC B9 */ bl __ct__13mDoExt_morf_cFv -/* 8000FC9C 3C 60 80 3A */ lis r3, __vt__14mDoExt_McaMorf@ha /* 0x803A32FC@ha */ -/* 8000FCA0 38 03 32 FC */ addi r0, r3, __vt__14mDoExt_McaMorf@l /* 0x803A32FC@l */ -/* 8000FCA4 90 14 00 00 */ stw r0, 0(r20) -/* 8000FCA8 38 00 00 00 */ li r0, 0 -/* 8000FCAC 98 14 00 50 */ stb r0, 0x50(r20) -/* 8000FCB0 98 14 00 51 */ stb r0, 0x51(r20) -/* 8000FCB4 98 14 00 52 */ stb r0, 0x52(r20) -/* 8000FCB8 93 81 00 08 */ stw r28, 8(r1) -/* 8000FCBC 93 A1 00 0C */ stw r29, 0xc(r1) -/* 8000FCC0 93 C1 00 10 */ stw r30, 0x10(r1) -/* 8000FCC4 93 E1 00 14 */ stw r31, 0x14(r1) -/* 8000FCC8 7E 83 A3 78 */ mr r3, r20 -/* 8000FCCC 7E A4 AB 78 */ mr r4, r21 -/* 8000FCD0 7E C5 B3 78 */ mr r5, r22 -/* 8000FCD4 7E E6 BB 78 */ mr r6, r23 -/* 8000FCD8 7F 07 C3 78 */ mr r7, r24 -/* 8000FCDC 7F 28 CB 78 */ mr r8, r25 -/* 8000FCE0 FC 20 F8 90 */ fmr f1, f31 -/* 8000FCE4 7F 49 D3 78 */ mr r9, r26 -/* 8000FCE8 7F 6A DB 78 */ mr r10, r27 -/* 8000FCEC 48 00 00 A9 */ bl create__14mDoExt_McaMorfFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiiPvUlUl -/* 8000FCF0 7E 83 A3 78 */ mr r3, r20 -/* 8000FCF4 CB E1 00 48 */ lfd f31, 0x48(r1) -/* 8000FCF8 39 61 00 48 */ addi r11, r1, 0x48 -/* 8000FCFC 48 35 25 09 */ bl _restgpr_20 -/* 8000FD00 80 01 00 54 */ lwz r0, 0x54(r1) -/* 8000FD04 7C 08 03 A6 */ mtlr r0 -/* 8000FD08 38 21 00 50 */ addi r1, r1, 0x50 -/* 8000FD0C 4E 80 00 20 */ blr diff --git a/include/JSystem/J3DGraphAnimator/J3DAnimation.h b/include/JSystem/J3DGraphAnimator/J3DAnimation.h index 00bd2b8655e..ae8d86f7544 100644 --- a/include/JSystem/J3DGraphAnimator/J3DAnimation.h +++ b/include/JSystem/J3DGraphAnimator/J3DAnimation.h @@ -604,22 +604,23 @@ public: void update(); virtual ~J3DFrameCtrl() {} - f32 getRate() const { return mRate; } - f32 getFrame() const { return mFrame; } - s16 getEnd() const { return mEnd; } - s16 getStart() const { return mStart; } u8 getAttribute() const { return mAttribute; } - u8 getState() const { return mState; } void setAttribute(u8 attr) { mAttribute = attr; } - void setEnd(s16 end) { mEnd = end; } - void setRate(f32 rate) { mRate = rate; } + u8 getState() const { return mState; } + bool checkState(u8 state) const { return mState & state; } + s16 getStart() const { return mStart; } void setStart(s16 start) { mStart = start; mFrame = start; } - void setFrame(f32 frame) { mFrame = frame; } + s16 getEnd() const { return mEnd; } + void setEnd(s16 end) { mEnd = end; } + s32 getLoop() { return mLoop; } void setLoop(s16 loop) { mLoop = loop; } - bool checkState(u8 state) const { return mState & state; } + f32 getRate() const { return mRate; } + void setRate(f32 rate) { mRate = rate; } + f32 getFrame() const { return mFrame; } + void setFrame(f32 frame) { mFrame = frame; } private: /* 0x04 */ u8 mAttribute; diff --git a/include/JSystem/J3DGraphAnimator/J3DJoint.h b/include/JSystem/J3DGraphAnimator/J3DJoint.h index 6a67e0a9400..42bc45d7cc6 100644 --- a/include/JSystem/J3DGraphAnimator/J3DJoint.h +++ b/include/JSystem/J3DGraphAnimator/J3DJoint.h @@ -14,12 +14,12 @@ public: /* 8000D948 */ virtual ~J3DMtxCalc(); /* 80014E90 */ virtual void setAnmTransform(J3DAnmTransform*); - /* 80014E9C */ virtual bool getAnmTransform(); + /* 80014E9C */ virtual J3DAnmTransform* getAnmTransform(); /* 80014E8C */ virtual void setAnmTransform(u8, J3DAnmTransform*); - /* 80014E94 */ virtual bool getAnmTransform(u8); + /* 80014E94 */ virtual J3DAnmTransform* getAnmTransform(u8); /* 80014EA4 */ virtual void setWeight(u8, f32); /* 80014EA8 */ virtual void getWeight(u8) const; - virtual void init(Vec const& param_0, Mtx*) = 0; + virtual void init(const Vec& param_0, const Mtx&) = 0; virtual void calc() = 0; static J3DMtxBuffer* getMtxBuffer() { return mMtxBuffer; } @@ -36,11 +36,11 @@ public: }; template -class J3DMtxCalcNoAnm : public J3DMtxCalcNoAnmBase, public A, public B { +class J3DMtxCalcNoAnm : public J3DMtxCalcNoAnmBase { public: J3DMtxCalcNoAnm() {} virtual ~J3DMtxCalcNoAnm() {} - virtual void init(Vec const& param_0, f32 const (¶m_1)[3][4]); + virtual void init(const Vec& param_0, const Mtx& param_1); virtual void calc(); }; @@ -93,11 +93,11 @@ private: }; // Size: 0x5C struct J3DMtxCalcJ3DSysInitMaya { - /* 8032ECAC */ static void init(Vec const&, f32 const (&)[3][4]); + /* 8032ECAC */ static void init(const Vec&, const Mtx& param_1); }; struct J3DMtxCalcJ3DSysInitBasic { - /* 8032EC28 */ static void init(Vec const&, f32 const (&)[3][4]); + /* 8032EC28 */ static void init(const Vec&, const Mtx& param_1); }; struct J3DMtxCalcCalcTransformSoftimage { diff --git a/include/JSystem/J3DGraphAnimator/J3DModel.h b/include/JSystem/J3DGraphAnimator/J3DModel.h index 69ad60894c0..a8048a1b2c6 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModel.h +++ b/include/JSystem/J3DGraphAnimator/J3DModel.h @@ -81,6 +81,7 @@ public: J3DMatPacket* getMatPacket(u16 idx) const { return &mMatPacket[idx]; } J3DShapePacket* getShapePacket(u16 idx) const { return &mShapePacket[idx]; } J3DMtxBuffer* getMtxBuffer() const { return mMtxBuffer; } + void setScaleFlag(int idx, u8 flag) { mMtxBuffer->setScaleFlag(idx, flag); } Mtx33* getBumpMtxPtr(int idx) const { return mMtxBuffer->getBumpMtxPtr(idx); } Mtx33* getNrmMtxPtr() const { return mMtxBuffer->getNrmMtxPtr(); } Mtx* getDrawMtxPtr() const { return mMtxBuffer->getDrawMtxPtr(); } diff --git a/include/JSystem/J3DGraphBase/J3DSys.h b/include/JSystem/J3DGraphBase/J3DSys.h index 914cc2d610c..085e3b74fa2 100644 --- a/include/JSystem/J3DGraphBase/J3DSys.h +++ b/include/JSystem/J3DGraphBase/J3DSys.h @@ -99,6 +99,9 @@ struct J3DSys { J3DMatPacket* getMatPacket() { return mMatPacket; } void setMaterialMode(u32 mode) { mMaterialMode = mode; } + void setCurrentMtxCalc(J3DMtxCalc * pCalc) { mCurrentMtxCalc = pCalc; } + J3DMtxCalc * getCurrentMtxCalc() const { return mCurrentMtxCalc; } + void setTexture(J3DTexture* pTex) { mTexture = pTex; } J3DTexture* getTexture() { return mTexture; } diff --git a/include/JSystem/JMath/JMath.h b/include/JSystem/JMath/JMath.h index aa0fbc541e2..e305ccc7448 100644 --- a/include/JSystem/JMath/JMath.h +++ b/include/JSystem/JMath/JMath.h @@ -5,6 +5,7 @@ void JMAMTXApplyScale(const Mtx, Mtx, f32, f32, f32); void JMAEulerToQuat(s16 param_0, s16 param_1, s16 param_2, Quaternion* param_3); +void JMAQuatLerp(const Quaternion*, const Quaternion*, f32, Quaternion*); inline f32 JMAFastReciprocal(f32 value) { return __fres(value); diff --git a/include/Z2AudioLib/Z2SoundObject.h b/include/Z2AudioLib/Z2SoundObject.h index 9394430d502..26f2829bcc5 100644 --- a/include/Z2AudioLib/Z2SoundObject.h +++ b/include/Z2AudioLib/Z2SoundObject.h @@ -60,7 +60,9 @@ public: /* 802BEBDC */ virtual void init(Vec*, u8); - /* 0x20 */ void* field_0x20; // JAUSoundAnimation* + void stopAnime() { animation_ = NULL; } + + /* 0x20 */ void* animation_; // JAUSoundAnimation* /* 0x24 */ int field_0x24; /* 0x28 */ float field_0x28; /* 0x2C */ float field_0x2c; @@ -68,7 +70,7 @@ public: /* 0x34 */ int field_0x34; /* 0x38 */ int field_0x38; /* 0x3C */ int field_0x3c; - /* 0x40 */ int field_0x40; + /* 0x40 */ int curSoundIndex_; /* 0x44 */ bool field_0x44; }; diff --git a/include/d/com/d_com_inf_game.h b/include/d/com/d_com_inf_game.h index fc30720ddce..c24fda060e9 100644 --- a/include/d/com/d_com_inf_game.h +++ b/include/d/com/d_com_inf_game.h @@ -3552,6 +3552,11 @@ inline void dComIfGd_setListIndScreen() { g_dComIfG_gameInfo.drawlist.setXluListP0(); } +inline void dComIfGd_setListZxlu() { + g_dComIfG_gameInfo.drawlist.setOpaListZxlu(); + g_dComIfG_gameInfo.drawlist.setXluListZxlu(); +} + inline J3DDrawBuffer* dComIfGd_getOpaListBG() { return g_dComIfG_gameInfo.drawlist.getOpaListBG(); } diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index bf130748553..c1ae36e561b 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -333,6 +333,8 @@ public: void setXluList2DScreen() { setXluDrawList(mDrawBuffers[DB_LIST_2D_SCREEN]); } void setXluListP0() { setXluDrawList(mDrawBuffers[DB_LIST_P0]); } void setOpaListP0() { setOpaDrawList(mDrawBuffers[DB_LIST_P0]); } + void setOpaListZxlu() { setOpaDrawList(mDrawBuffers[DB_LIST_Z_XLU]); } + void setXluListZxlu() { setXluDrawList(mDrawBuffers[DB_LIST_Z_XLU]); } void peekZdata() { mPeekZ.peekData(); } void entryZSortListZxlu(J3DPacket* i_packet, cXyz& param_1) { diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 5ccf6fd6238..6c8215cabdf 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -247,18 +247,22 @@ public: /* 0x4 */ mDoExt_invJntPacket* mpPackets; }; -class mDoExt_zelAnime : public Z2SoundObjAnime {}; +class mDoExt_zelAnime : public Z2SoundObjAnime { +public: + void* field_0x48; +}; class mDoExt_McaMorfCallBack1_c { public: virtual void execute(u16, J3DTransformInfo*) = 0; }; -class mDoExt_McaMorfCallBack2_c {}; +class mDoExt_McaMorfCallBack2_c { +public: + virtual void execute(u16) = 0; +}; -class mDoExt_morf_c { - // : public J3DMtxCalcNoAnm - // inheritance causing issues, fix later +class mDoExt_morf_c : public J3DMtxCalcNoAnm { public: /* 8000F950 */ mDoExt_morf_c(); /* 8000FB7C */ void setMorf(f32 i_morf); @@ -266,20 +270,26 @@ public: /* 8000FAE8 */ virtual ~mDoExt_morf_c(); - void setPlaySpeed(f32 speed) { mFrameCtrl.setRate(speed); } - void setFrame(f32 frame) { mFrameCtrl.setFrame((s16)frame); } - f32 getPlaySpeed() { return mFrameCtrl.getRate(); } - f32 getFrame() { return mFrameCtrl.getFrame(); } - u8 getPlayMode() { return mFrameCtrl.getAttribute(); } - bool isLoop() { return mFrameCtrl.checkState(2); } - f32 getEndFrame() { return mFrameCtrl.getEnd(); } - BOOL checkFrame(f32 frame) { return mFrameCtrl.checkPass(frame); } J3DAnmTransform* getAnm() { return mpAnm; } void changeAnm(J3DAnmTransform* anm) { mpAnm = anm; } - + u8 getPlayMode() { return mFrameCtrl.getAttribute(); } + void setPlayMode(int mode) { mFrameCtrl.setAttribute(mode); } bool isStop() { return mFrameCtrl.checkState(1) || mFrameCtrl.getRate() == 0.0f; } + bool isLoop() { return mFrameCtrl.checkState(2); } + f32 getStartFrame() { return mFrameCtrl.getStart(); } + void setStartFrame(f32 frame) { mFrameCtrl.setStart(frame); } + f32 getEndFrame() { return mFrameCtrl.getEnd(); } + void setEndFrame(f32 frame) { mFrameCtrl.setEnd(frame); } + f32 getLoopFrame() { return mFrameCtrl.getLoop(); } + void setLoopFrame(f32 frame) { mFrameCtrl.setLoop(frame); } + f32 getPlaySpeed() { return mFrameCtrl.getRate(); } + void setPlaySpeed(f32 speed) { mFrameCtrl.setRate(speed); } + f32 getFrame() { return mFrameCtrl.getFrame(); } + void setFrame(f32 frame) { mFrameCtrl.setFrame((s16)frame); } + void setFrameF(f32 frame) { mFrameCtrl.setFrame(frame); } + BOOL checkFrame(f32 frame) { return mFrameCtrl.checkPass(frame); } /* 0x04 */ J3DModel* mpModel; /* 0x08 */ J3DAnmTransform* mpAnm; @@ -329,7 +339,7 @@ public: /* 8000FC4C */ mDoExt_McaMorf(J3DModelData*, mDoExt_McaMorfCallBack1_c*, mDoExt_McaMorfCallBack2_c*, J3DAnmTransform*, int, f32, int, int, int, void*, u32, u32); - /* 8000FD94 */ void create(J3DModelData*, mDoExt_McaMorfCallBack1_c*, + /* 8000FD94 */ int create(J3DModelData*, mDoExt_McaMorfCallBack1_c*, mDoExt_McaMorfCallBack2_c*, J3DAnmTransform*, int, f32, int, int, int, void*, u32, u32); /* 8001037C */ void setAnm(J3DAnmTransform*, int, f32, f32, f32, f32, void*); @@ -386,9 +396,12 @@ public: /* 8000F848 */ void initOldFrameMorf(f32, u16, u16); /* 8000F8CC */ void decOldFrameMorfCounter(); + bool getOldFrameFlg() { return mOldFrameFlg; } + void onOldFrameFlg() { mOldFrameFlg = true; } f32 getOldFrameRate() { return mOldFrameRate; } J3DTransformInfo* getOldFrameTransInfo(int i) { return &mOldFrameTransInfo[i]; } u16 getOldFrameStartJoint() { return mOldFrameStartJoint; } + u16 getOldFrameEndJoint() { return mOldFrameEndJoint; } Quaternion* getOldFrameQuaternion(int i_no) { return &mOldFrameQuaternion[i_no]; } private: @@ -404,23 +417,39 @@ private: /* 0x20 */ Quaternion* mOldFrameQuaternion; }; // Size: 0x24 -struct mDoExt_MtxCalcAnmBlendTblOld - : public J3DMtxCalcNoAnm { - /* 80014EB0 */ virtual ~mDoExt_MtxCalcAnmBlendTblOld(); - /* 8000F4B0 */ virtual void calc(); +struct mDoExt_MtxCalcAnmBlendTbl : public J3DMtxCalcNoAnm { + mDoExt_MtxCalcAnmBlendTbl(int num, mDoExt_AnmRatioPack* anmRatio) { + mNum = num; + mAnmRatio = anmRatio; + for (int i = 0; i < mNum; i++) { + if (!mAnmRatio[i].getAnmTransform()) { + mAnmRatio[i].setRatio(0.0f); + } + } + } - /* 0x4 */ int mNum; - /* 0x8 */ mDoExt_AnmRatioPack* mAnmRatio; -}; // Size: 0xC - -struct mDoExt_MtxCalcAnmBlendTbl : public mDoExt_MtxCalcAnmBlendTblOld { /* 800D00BC */ J3DAnmTransform* getAnm(int); /* 80014F3C */ virtual ~mDoExt_MtxCalcAnmBlendTbl(); /* 8000F26C */ virtual void calc(); + /* 0x4 */ int mNum; + /* 0x8 */ mDoExt_AnmRatioPack* mAnmRatio; +}; // Size: 0x0C + +STATIC_ASSERT(sizeof(mDoExt_MtxCalcAnmBlendTbl) == 0x0C); + +struct mDoExt_MtxCalcAnmBlendTblOld : public mDoExt_MtxCalcAnmBlendTbl { + mDoExt_MtxCalcAnmBlendTblOld(mDoExt_MtxCalcOldFrame* oldFrame, int num, mDoExt_AnmRatioPack* anmRatio) : mDoExt_MtxCalcAnmBlendTbl(num, anmRatio) { + mOldFrame = oldFrame; + } + /* 80014EB0 */ virtual ~mDoExt_MtxCalcAnmBlendTblOld(); + /* 8000F4B0 */ virtual void calc(); + /* 0xC */ mDoExt_MtxCalcOldFrame* mOldFrame; -}; +}; // Size: 0x10 + +STATIC_ASSERT(sizeof(mDoExt_MtxCalcAnmBlendTblOld) == 0x10); class mDoExt_3Dline_c { public: diff --git a/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp b/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp index 41b921d7822..f2a6d16ef5f 100644 --- a/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp +++ b/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp @@ -122,7 +122,7 @@ void J3DJointTree::findImportantMtxIndex() { /* 80325CAC-80325D1C 3205EC 0070+00 1/0 0/0 0/0 .text * calc__12J3DJointTreeFP12J3DMtxBufferRC3VecRA3_A4_Cf */ void J3DJointTree::calc(J3DMtxBuffer* pMtxBuffer, Vec const& scale, f32 const (&mtx)[3][4]) { - getBasicMtxCalc()->init(scale, (Mtx*)mtx); + getBasicMtxCalc()->init(scale, mtx); J3DMtxCalc::setMtxBuffer(pMtxBuffer); J3DJoint* root = getRootNode(); diff --git a/libs/Z2AudioLib/Z2Creature.cpp b/libs/Z2AudioLib/Z2Creature.cpp index 8c1c24d5a29..dac809178b8 100644 --- a/libs/Z2AudioLib/Z2Creature.cpp +++ b/libs/Z2AudioLib/Z2Creature.cpp @@ -537,7 +537,7 @@ asm Z2Creature::~Z2Creature() { /* 802C04E8-802C0530 2BAE28 0048+00 4/2 2/2 0/0 .text deleteObject__10Z2CreatureFv */ void Z2Creature::deleteObject() { - mSoundObjAnime.field_0x20 = NULL; + mSoundObjAnime.animation_ = NULL; mSoundObjAnime.deleteObject(); mSoundObjSimple1.deleteObject(); mSoundObjSimple2.deleteObject(); diff --git a/rel/d/a/d_a_horse/d_a_horse.cpp b/rel/d/a/d_a_horse/d_a_horse.cpp index 7161594c5d2..3eb72ed72e4 100644 --- a/rel/d/a/d_a_horse/d_a_horse.cpp +++ b/rel/d/a/d_a_horse/d_a_horse.cpp @@ -3094,13 +3094,13 @@ void J3DMtxCalc::setAnmTransform(J3DAnmTransform* param_0) { } /* 80844B94-80844B9C 00CD54 0008+00 3/0 0/0 0/0 .text getAnmTransform__10J3DMtxCalcFUc */ -bool J3DMtxCalc::getAnmTransform(u8 param_0) { - return false; +J3DAnmTransform* J3DMtxCalc::getAnmTransform(u8 param_0) { + return NULL; } /* 80844B9C-80844BA4 00CD5C 0008+00 3/0 0/0 0/0 .text getAnmTransform__10J3DMtxCalcFv */ -bool J3DMtxCalc::getAnmTransform() { - return false; +J3DAnmTransform* J3DMtxCalc::getAnmTransform() { + return NULL; } /* 80844BA4-80844BA8 00CD64 0004+00 3/0 0/0 0/0 .text setWeight__10J3DMtxCalcFUcf */ diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index 34d993ad19b..0293f3eb2be 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -54,14 +54,35 @@ struct J3DMtxCalcNoAnm__template0 { /* 80015084 */ void func_80015084(void* _this); }; -struct J3DMtxCalcAnmBase { +struct J3DMtxCalcAnimationAdaptorBase { + J3DMtxCalcAnimationAdaptorBase() {} + void change() {} +}; + +template +struct J3DMtxCalcAnimationAdaptorDefault : public J3DMtxCalcAnimationAdaptorBase { + J3DMtxCalcAnimationAdaptorDefault(J3DAnmTransform* param_0) {} +}; + +struct J3DMtxCalcAnmBase /* : public J3DMtxCalc */ { + J3DMtxCalcAnmBase(J3DAnmTransform* param_0) { mAnmTransform = param_0; } /* 8000D8EC */ ~J3DMtxCalcAnmBase(); - /* 80014FB8 */ void getAnmTransform(); + /* 80014FB8 */ J3DAnmTransform* getAnmTransform(); /* 80014FC0 */ void setAnmTransform(J3DAnmTransform*); + + J3DAnmTransform* mAnmTransform; }; template -struct J3DMtxCalcAnimation {}; +struct J3DMtxCalcAnimation : public J3DMtxCalcAnmBase { + J3DMtxCalcAnimation(J3DAnmTransform* param_0) : J3DMtxCalcAnmBase(param_0), field_0x8(param_0) {} + ~J3DMtxCalcAnimation() {} + void setAnmTransform(J3DAnmTransform*) {} + void init(const Vec&, const Mtx&) {} + void calc() {} + + A0 field_0x8; +}; /* J3DMtxCalcAnimation, * J3DMtxCalcJ3DSysInitMaya> */ struct J3DMtxCalcAnimation__template0 { @@ -440,14 +461,62 @@ SECTION_SDATA2 static f32 lit_3847 = 1.0f; /* 8000D0AC-8000D320 0079EC 0274+00 5/5 0/0 0/0 .text * mDoExt_setJ3DData__FPA4_fPC16J3DTransformInfoUs */ +// matches with literals +#ifdef NONMATCHING +static void mDoExt_setJ3DData(Mtx mtx, const J3DTransformInfo* transformInfo, u16 param_2) { + bool local_28; + if (cM3d_IsZero(transformInfo->mScale.x - 1.0f) && cM3d_IsZero(transformInfo->mScale.y - 1.0f) && cM3d_IsZero(transformInfo->mScale.z - 1.0f)) { + j3dSys.getModel()->setScaleFlag(param_2, 1); + local_28 = true; + } else { + j3dSys.getModel()->setScaleFlag(param_2, 0); + local_28 = false; + } + mtx[0][3] = transformInfo->mTranslate.x; + mtx[1][3] = transformInfo->mTranslate.y; + mtx[2][3] = transformInfo->mTranslate.z; + + if (!local_28) { + mtx[0][0] *= transformInfo->mScale.x; + mtx[0][1] *= transformInfo->mScale.y; + mtx[0][2] *= transformInfo->mScale.z; + mtx[1][0] *= transformInfo->mScale.x; + mtx[1][1] *= transformInfo->mScale.y; + mtx[1][2] *= transformInfo->mScale.z; + mtx[2][0] *= transformInfo->mScale.x; + mtx[2][1] *= transformInfo->mScale.y; + mtx[2][2] *= transformInfo->mScale.z; + } + if (j3dSys.getModel()->getModelData()->getJointNodePointer(param_2)->getScaleCompensate() == 1) { + f32 x = 1.0f / J3DSys::mParentS.x; + f32 y = 1.0f / J3DSys::mParentS.y; + f32 z = 1.0f / J3DSys::mParentS.z; + mtx[0][0] *= x; + mtx[0][1] *= x; + mtx[0][2] *= x; + mtx[1][0] *= y; + mtx[1][1] *= y; + mtx[1][2] *= y; + mtx[2][0] *= z; + mtx[2][1] *= z; + mtx[2][2] *= z; + } + mDoMtx_concat(J3DSys::mCurrentMtx, mtx, J3DSys::mCurrentMtx); + j3dSys.getModel()->setAnmMtx(param_2, J3DSys::mCurrentMtx); + J3DSys::mParentS.x = transformInfo->mScale.x; + J3DSys::mParentS.y = transformInfo->mScale.y; + J3DSys::mParentS.z = transformInfo->mScale.z; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -static asm void mDoExt_setJ3DData(f32 (*param_0)[4], J3DTransformInfo const* param_1, u16 param_2) { +static asm void mDoExt_setJ3DData(Mtx mtx, const J3DTransformInfo* transformInfo, u16 param_2) { nofralloc #include "asm/m_Do/m_Do_ext/mDoExt_setJ3DData__FPA4_fPC16J3DTransformInfoUs.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80451B1C-80451B20 00011C 0004+00 22/22 0/0 0/0 .sdata2 @3876 */ @@ -1370,6 +1439,27 @@ SECTION_DATA extern void* __vt__10J3DMtxCalc[11 + 1 /* padding */] = { /* 8000D7DC-8000D8E4 00811C 0108+00 0/0 18/18 85/85 .text * init__13mDoExt_bckAnmFP15J3DAnmTransformiifssb */ +// J3DMtxCalcAnimation inheritance +#ifdef NOTIMPLEMENTED +int mDoExt_bckAnm::init(J3DAnmTransform* i_bck, int i_play, int i_attr, f32 i_rate, + s16 i_startF, s16 i_endF, bool i_modify) { + JUT_ASSERT(614, (i_modify || isCurrentSolidHeap()) && i_bck != 0); + mAnm = i_bck; + if (!i_modify) { + mpMtxCalc = new J3DMtxCalcAnimation, J3DMtxCalcJ3DSysInitMaya>(mAnm); + if (!mpMtxCalc) { + return 0; + } + } else { + mpMtxCalc->setAnmTransform(mAnm); + } + if (i_play) { + i_attr = i_attr < 0 ? mAnm->getAttribute() : i_attr; + return initPlay(mAnm->getFrameMax(), i_attr, i_rate, i_startF, i_endF); + } + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1379,6 +1469,7 @@ asm int mDoExt_bckAnm::init(J3DAnmTransform* i_bck, int i_play, int i_attr, f32 #include "asm/m_Do/m_Do_ext/init__13mDoExt_bckAnmFP15J3DAnmTransformiifssb.s" } #pragma pop +#endif /* 8000D8E4-8000D8EC -00001 0008+00 0/0 0/0 0/0 .text * setAnmTransform__114J3DMtxCalcAnimation<64J3DMtxCalcAnimationAdaptorDefault<27J3DMtxCalcCalcTransformMaya>,24J3DMtxCalcJ3DSysInitMaya>FP15J3DAnmTransform @@ -2034,16 +2125,7 @@ extern "C" asm void __dt__9J3DPacketFv() { /* 8000E6C8-8000E7C0 009008 00F8+00 1/1 0/0 0/0 .text entryJoint__21mDoExt_invisibleModelFP4cXyz */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { - nofralloc -#include "asm/m_Do/m_Do_ext/entryJoint__21mDoExt_invisibleModelFP4cXyz.s" -} -#pragma pop - -/* void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { +void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { J3DModelData* modelData = mModel->getModelData(); mDoExt_invJntPacket* packet = mpPackets; @@ -2061,32 +2143,39 @@ asm void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { packet++; } } -} */ +} /* 8000E7C0-8000E834 009100 0074+00 0/0 0/0 17/17 .text entryDL__21mDoExt_invisibleModelFP4cXyz */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void mDoExt_invisibleModel::entryDL(cXyz* param_0) { - nofralloc -#include "asm/m_Do/m_Do_ext/entryDL__21mDoExt_invisibleModelFP4cXyz.s" +void mDoExt_invisibleModel::entryDL(cXyz* param_0) { + J3DDrawBuffer* buffer0 = j3dSys.getDrawBuffer(0); + J3DDrawBuffer* buffer1 = j3dSys.getDrawBuffer(1); + dComIfGd_setListZxlu(); + mDoExt_modelEntryDL(mModel); + entryJoint(param_0); + j3dSys.setDrawBuffer(buffer0, 0); + j3dSys.setDrawBuffer(buffer1, 1); } -#pragma pop /* 8000E834-8000EA80 009174 024C+00 0/0 0/0 7/7 .text * mDoExt_setupShareTexture__FP12J3DModelDataP12J3DModelData */ #ifdef NONMATCHING void mDoExt_setupShareTexture(J3DModelData* i_modelData, J3DModelData* i_shareModelData) { + JUT_ASSERT(1547, i_modelData != 0 && i_shareModelData != 0); J3DTexture* texture = i_modelData->getTexture(); + JUT_ASSERT(1549, texture != 0); JUTNameTab* textureName = i_modelData->getTextureName(); + JUT_ASSERT(1551, textureName != 0); J3DTexture* shareTexture = i_shareModelData->getTexture(); + JUT_ASSERT(1553, shareTexture != 0); JUTNameTab* shareTextureName = i_shareModelData->getTextureName(); + JUT_ASSERT(1555, shareTextureName != 0) bool bvar = false; for (u16 i = 0; i < texture->getNum(); i++) { if (texture->getResTIMG(i)->imageOffset == 0) { for (u16 j = 0; j < shareTexture->getNum(); j++) { if (!strcmp(textureName->getName(i), shareTextureName->getName(j))) { + JUT_ASSERT(1564, shareTexture->getResTIMG(j)->imageOffset != 0); texture->setResTIMG(i, *shareTexture->getResTIMG(j)); bvar = true; } @@ -2100,6 +2189,7 @@ void mDoExt_setupShareTexture(J3DModelData* i_modelData, J3DModelData* i_shareMo for (u16 i = 0; i < i_modelData->getMaterialNum(); i++) { J3DMaterial* mat = i_modelData->getMaterialNodePointer(i); J3DTevBlock* tevBlock = mat->getTevBlock(); + JUT_ASSERT(1577, tevBlock != 0); J3DDisplayListObj* dlObj = mat->getSharedDisplayListObj(); BOOL ret = OSDisableInterrupts(); @@ -2463,6 +2553,47 @@ int mDoExt_resIDToIndex(JKRArchive* p_archive, u16 id) { /* 8000F26C-8000F4B0 009BAC 0244+00 1/0 0/0 0/0 .text calc__25mDoExt_MtxCalcAnmBlendTblFv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_MtxCalcAnmBlendTbl::calc() { + u16 jntNo = getJoint()->getJntNo(); + j3dSys.setCurrentMtxCalc(this); + if (mNum == 1) { + J3DTransformInfo info1; + mAnmRatio->getAnmTransform()->getTransform(jntNo, &info1); + J3DMtxCalcCalcTransformMaya::calcTransform(info1); + return; + } + J3DTransformInfo info2; + Quaternion quat1; + Quaternion quat2; + Quaternion quat3; + mAnmRatio->getAnmTransform()->getTransform(jntNo, &info2); + JMAEulerToQuat(info2.mRotation.x, info2.mRotation.y, info2.mRotation.z, &quat1); + quat3 = quat1; + for (int i = 1; i < mNum; i++) { + J3DAnmTransform* transform = mAnmRatio[i].getAnmTransform(); + if (transform) { + J3DTransformInfo info3; + transform->getTransform(jntNo, &info3); + f32 ratio = mAnmRatio[i].getRatio(); + f32 f30 = 1.0f - ratio; + JMAEulerToQuat(info3.mRotation.x, info3.mRotation.y, info3.mRotation.z, &quat2); + JMAQuatLerp(&quat1, &quat2, ratio, &quat3); + quat1 = quat3; + info2.mTranslate.x = info2.mTranslate.x * f30 + info3.mTranslate.x * ratio; + info2.mTranslate.y = info2.mTranslate.y * f30 + info3.mTranslate.y * ratio; + info2.mTranslate.z = info2.mTranslate.z * f30 + info3.mTranslate.z * ratio; + info2.mScale.x = info2.mScale.x * f30 + info3.mScale.x * ratio; + info2.mScale.y = info2.mScale.y * f30 + info3.mScale.y * ratio; + info2.mScale.z = info2.mScale.z * f30 + info3.mScale.z * ratio; + } + } + Mtx mtx; + MTXQuat(mtx, &quat3); + mDoExt_setJ3DData(mtx, &info2, jntNo); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2471,8 +2602,68 @@ asm void mDoExt_MtxCalcAnmBlendTbl::calc() { #include "asm/m_Do/m_Do_ext/calc__25mDoExt_MtxCalcAnmBlendTblFv.s" } #pragma pop +#endif /* 8000F4B0-8000F848 009DF0 0398+00 1/0 0/0 0/0 .text calc__28mDoExt_MtxCalcAnmBlendTblOldFv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_MtxCalcAnmBlendTblOld::calc() { + u16 jntNo = getJoint()->getJntNo(); + j3dSys.setCurrentMtxCalc(this); + J3DModelData* modelData = j3dSys.getModel()->getModelData(); + J3DTransformInfo info1; + Quaternion quat1; + Quaternion quat2; + Quaternion quat3; + mAnmRatio->getAnmTransform()->getTransform(jntNo, &info1); + JMAEulerToQuat(info1.mRotation.x, info1.mRotation.y, info1.mRotation.z, &quat1); + quat3 = quat1; + for (int i = 1; i < mNum; i++) { + if (mAnmRatio[i].getAnmTransform()) { + J3DAnmTransform* transform = mAnmRatio[i].getAnmTransform(); + J3DTransformInfo info2; + transform->getTransform(jntNo, &info2); + f32 ratio = mAnmRatio[i].getRatio(); + f32 f30 = 1.0f - ratio; + JMAEulerToQuat(info2.mRotation.x, info2.mRotation.y, info2.mRotation.z, &quat2); + JMAQuatLerp(&quat1, &quat2, ratio, &quat3); + quat1 = quat3; + info1.mTranslate.x = info1.mTranslate.x * f30 + info2.mTranslate.x * ratio; + info1.mTranslate.y = info1.mTranslate.y * f30 + info2.mTranslate.y * ratio; + info1.mTranslate.z = info1.mTranslate.z * f30 + info2.mTranslate.z * ratio; + info1.mScale.x = info1.mScale.x * f30 + info2.mScale.x * ratio; + info1.mScale.y = info1.mScale.y * f30 + info2.mScale.y * ratio; + info1.mScale.z = info1.mScale.z * f30 + info2.mScale.z * ratio; + } + } + + J3DTransformInfo* oldTransInfo = mOldFrame->getOldFrameTransInfo(jntNo); + Quaternion* oldQuat = mOldFrame->getOldFrameQuaternion(jntNo); + if (mOldFrame->getOldFrameFlg()) { + if (mOldFrame->getOldFrameRate() > 0.0f && mOldFrame->getOldFrameStartJoint() <= jntNo && mOldFrame->getOldFrameEndJoint() > jntNo) { + f32 oldFrameRate = mOldFrame->getOldFrameRate(); + f32 f31 = 1.0f - oldFrameRate; + JMAQuatLerp(oldQuat, &quat1, f31, &quat3); + info1.mTranslate.x = info1.mTranslate.x * f31 + oldTransInfo->mTranslate.x * oldFrameRate; + info1.mTranslate.y = info1.mTranslate.y * f31 + oldTransInfo->mTranslate.y * oldFrameRate; + info1.mTranslate.z = info1.mTranslate.z * f31 + oldTransInfo->mTranslate.z * oldFrameRate; + info1.mScale.x = info1.mScale.x * f31 + oldTransInfo->mScale.x * oldFrameRate; + info1.mScale.y = info1.mScale.y * f31 + oldTransInfo->mScale.y * oldFrameRate; + info1.mScale.z = info1.mScale.z * f31 + oldTransInfo->mScale.z * oldFrameRate; + } + } else if (jntNo == modelData->getJointNum() - 1) { + mOldFrame->onOldFrameFlg(); + } + Mtx mtx; + mDoMtx_quat(mtx, &quat3); + mDoExt_setJ3DData(mtx, &info1, jntNo); + *oldQuat = quat3; + *oldTransInfo = info1; + if (jntNo == modelData->getJointNum() - 1) { + mOldFrame->decOldFrameMorfCounter(); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2481,6 +2672,7 @@ asm void mDoExt_MtxCalcAnmBlendTblOld::calc() { #include "asm/m_Do/m_Do_ext/calc__28mDoExt_MtxCalcAnmBlendTblOldFv.s" } #pragma pop +#endif /* 8000F848-8000F8CC 00A188 0084+00 0/0 26/26 8/8 .text * initOldFrameMorf__22mDoExt_MtxCalcOldFrameFfUsUs */ @@ -2614,17 +2806,15 @@ asm void mDoExt_morf_c::frameUpdate() { /* 8000FC4C-8000FD10 00A58C 00C4+00 0/0 0/0 34/34 .text * __ct__14mDoExt_McaMorfFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiiPvUlUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm mDoExt_McaMorf::mDoExt_McaMorf(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, - mDoExt_McaMorfCallBack2_c* param_2, J3DAnmTransform* param_3, +mDoExt_McaMorf::mDoExt_McaMorf(J3DModelData* modelData, mDoExt_McaMorfCallBack1_c* callback1, + mDoExt_McaMorfCallBack2_c* callback2, J3DAnmTransform* anmTransform, int param_4, f32 param_5, int param_6, int param_7, int param_8, void* param_9, u32 param_10, u32 param_11) { - nofralloc -#include "asm/m_Do/m_Do_ext/func_8000FC4C.s" + field_0x50 = false; + field_0x51 = false; + field_0x52 = false; + create(modelData, callback1, callback2, anmTransform, param_4, param_5, param_6, param_7, param_8, param_9, param_10, param_11); } -#pragma pop /* 8000FD10-8000FD94 00A650 0084+00 1/0 0/0 0/0 .text __dt__14mDoExt_McaMorfFv */ #pragma push @@ -2644,10 +2834,89 @@ SECTION_SDATA2 static f32 lit_5939 = -1.0f; /* 8000FD94-80010074 00A6D4 02E0+00 1/1 0/0 0/0 .text * create__14mDoExt_McaMorfFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiiPvUlUl */ +// matches with literals +#ifdef NONMATCHING +int mDoExt_McaMorf::create(J3DModelData* modelData, mDoExt_McaMorfCallBack1_c* callback1, + mDoExt_McaMorfCallBack2_c* callback2, J3DAnmTransform* anmTransform, + int param_4, f32 param_5, int param_6, int param_7, int param_8, + void* param_9, u32 param_10, u32 param_11) { + mpModel = NULL; + mpSound = NULL; + mpTransformInfo = NULL; + mpQuat = NULL; + if (!modelData) { + return 0; + } + if (modelData->getMaterialNodePointer(0)->getSharedDisplayListObj() && param_10 == 0) { + if (param_10 = modelData->isLocked()) { + param_10 = 0x20000; + } else { + param_10 = 0x80000; + } + } + mpModel = mDoExt_J3DModel__create(modelData, param_10, param_11); + if (!mpModel) { + return 0; + } + if (param_10 != 0x80000) { + mDoExt_changeMaterial(mpModel); + } + if (param_9 == NULL && anmTransform) { + param_9 = ((mDoExt_transAnmBas*)anmTransform)->getBas(); + if (param_9) { + param_8 = 1; + } + } + if (param_8) { + mpSound = new mDoExt_zelAnime(); + if (!mpSound) { + goto cleanup; + } + } + setAnm(anmTransform, param_4, 0.0f, param_5, param_6, param_7, param_9); + mPrevMorf = -1.0f; + mpTransformInfo = new J3DTransformInfo[modelData->getJointNum()]; + if (!mpTransformInfo) { + goto cleanup; + } + mpQuat = new Quaternion[modelData->getJointNum()]; + if (!mpQuat) { + goto cleanup; + } + J3DTransformInfo* info = mpTransformInfo; + Quaternion* quat = mpQuat; + J3DModelData* r23 = mpModel->getModelData(); + u16 jointNum = r23->getJointNum(); + for (int i = 0; i < jointNum; i++) { + *info = r23->getJointNodePointer(i)->getTransformInfo(); + JMAEulerToQuat(info->mRotation.x, info->mRotation.y, info->mRotation.z, quat); + info++; + quat++; + } + mpCallback1 = callback1; + mpCallback2 = callback2; + return 1; + cleanup: + if (mpSound) { + mpSound->stopAnime(); + mpSound = NULL; + } + if (mpTransformInfo) { + mpTransformInfo = NULL; + } + if (mpQuat) { + mpQuat = NULL; + } + if (mpModel) { + mpModel = NULL; + } + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void mDoExt_McaMorf::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, +asm int mDoExt_McaMorf::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, mDoExt_McaMorfCallBack2_c* param_2, J3DAnmTransform* param_3, int param_4, f32 param_5, int param_6, int param_7, int param_8, void* param_9, u32 param_10, u32 param_11) { @@ -2655,8 +2924,76 @@ asm void mDoExt_McaMorf::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c #include "asm/m_Do/m_Do_ext/func_8000FD94.s" } #pragma pop +#endif /* 80010074-8001037C 00A9B4 0308+00 1/0 0/0 0/0 .text calc__14mDoExt_McaMorfFv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_McaMorf::calc() { + if (!mpModel) { + return; + } + u16 jntNo = getJoint()->getJntNo(); + j3dSys.setCurrentMtxCalc(this); + J3DTransformInfo info1; + J3DTransformInfo* infoPtr; + if (mpTransformInfo == NULL) { + infoPtr = &info1; + } else { + infoPtr = &mpTransformInfo[jntNo]; + } + Quaternion quat1; + Quaternion* quatPtr; + if (mpQuat == NULL) { + quatPtr = &quat1; + } else { + quatPtr = &mpQuat[jntNo]; + } + if (!mpAnm) { + *infoPtr = mpModel->getModelData()->getJointNodePointer(jntNo)->getTransformInfo(); + if (mpCallback1) { + mpCallback1->execute(jntNo, infoPtr); + } + JMAEulerToQuat(infoPtr->mRotation.x, infoPtr->mRotation.y, infoPtr->mRotation.z, quatPtr); + J3DMtxCalcCalcTransformMaya::calcTransform(*infoPtr); + } else if (mCurMorf >= 1.0f || !mpTransformInfo || !mpQuat) { + getTransform(jntNo, infoPtr); + if (mpCallback1) { + mpCallback1->execute(jntNo, infoPtr); + } + JMAEulerToQuat(infoPtr->mRotation.x, infoPtr->mRotation.y, infoPtr->mRotation.z, quatPtr); + J3DMtxCalcCalcTransformMaya::calcTransform(*infoPtr); + } else { + f32 f31; + if (field_0x52) { + f31 = 1.0f; + } else { + f31 = (mCurMorf - mPrevMorf) / (1.0f - mPrevMorf); + } + f32 f30 = 1.0f - f31; + J3DTransformInfo info2; + Quaternion quat2; + getTransform(jntNo, &info2); + if (mpCallback1) { + mpCallback1->execute(jntNo, &info2); + } + JMAEulerToQuat(info2.mRotation.x, info2.mRotation.y, info2.mRotation.z, &quat2); + JMAQuatLerp(quatPtr, &quat2, f31, quatPtr); + Mtx mtx; + mDoMtx_quat(mtx, quatPtr); + infoPtr->mTranslate.x = infoPtr->mTranslate.x * f30 + info2.mTranslate.x * f31; + infoPtr->mTranslate.y = infoPtr->mTranslate.y * f30 + info2.mTranslate.y * f31; + infoPtr->mTranslate.z = infoPtr->mTranslate.z * f30 + info2.mTranslate.z * f31; + infoPtr->mScale.x = infoPtr->mScale.x * f30 + info2.mScale.x * f31; + infoPtr->mScale.y = infoPtr->mScale.y * f30 + info2.mScale.y * f31; + infoPtr->mScale.z = infoPtr->mScale.z * f30 + info2.mScale.z * f31; + mDoExt_setJ3DData(mtx, infoPtr, jntNo); + } + if (mpCallback2) { + mpCallback2->execute(jntNo); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2665,9 +3002,50 @@ asm void mDoExt_McaMorf::calc() { #include "asm/m_Do/m_Do_ext/calc__14mDoExt_McaMorfFv.s" } #pragma pop +#endif /* 8001037C-800105C8 00ACBC 024C+00 1/1 1/1 29/29 .text * setAnm__14mDoExt_McaMorfFP15J3DAnmTransformiffffPv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_McaMorf::setAnm(J3DAnmTransform* param_0, int param_1, f32 param_2, f32 param_3, + f32 param_4, f32 param_5, void* param_6) { + mpAnm = param_0; + setStartFrame(param_4); + if (param_5 < 0.0f) { + if (!mpAnm) { + mFrameCtrl.init(0); + } else { + mFrameCtrl.init(mpAnm->getFrameMax()); + } + } else { + mFrameCtrl.init(param_5); + } + if (param_0 && param_1 < 0) { + param_1 = param_0->getAttribute(); + } + setPlayMode(param_1); + setPlaySpeed(param_3); + if (param_3 >= 0.0f) { + setFrame(param_4); + } else { + setFrame(getEndFrame()); + } + setLoopFrame(getFrame()); + setMorf(param_2); + if (mpSound) { + if (param_6 == NULL && param_0) { + param_6 = ((mDoExt_transAnmBas*)param_0)->getBas(); + } + mpSound->field_0x48 = param_6; + if (mpSound->field_0x48) { + mpSound->initAnime(param_6, getPlaySpeed() >= 0.0f, getLoopFrame(), 0.0f); + } else { + mpSound->stopAnime(); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2677,6 +3055,7 @@ asm void mDoExt_McaMorf::setAnm(J3DAnmTransform* param_0, int param_1, f32 param #include "asm/m_Do/m_Do_ext/setAnm__14mDoExt_McaMorfFP15J3DAnmTransformiffffPv.s" } #pragma pop +#endif /* 800105C8-80010680 00AF08 00B8+00 0/0 1/1 37/37 .text play__14mDoExt_McaMorfFP3VecUlSc */ @@ -3675,13 +4054,13 @@ void J3DMtxCalc::setAnmTransform(J3DAnmTransform* param_0) { /* 80014E94-80014E9C 00F7D4 0008+00 11/0 2/0 0/0 .text getAnmTransform__10J3DMtxCalcFUc */ -bool J3DMtxCalc::getAnmTransform(u8 param_0) { - return false; +J3DAnmTransform* J3DMtxCalc::getAnmTransform(u8 param_0) { + return NULL; } /* 80014E9C-80014EA4 00F7DC 0008+00 9/0 2/0 0/0 .text getAnmTransform__10J3DMtxCalcFv */ -bool J3DMtxCalc::getAnmTransform() { - return false; +J3DAnmTransform* J3DMtxCalc::getAnmTransform() { + return NULL; } /* 80014EA4-80014EA8 00F7E4 0004+00 11/0 2/0 0/0 .text setWeight__10J3DMtxCalcFUcf */ @@ -3726,7 +4105,7 @@ extern "C" asm void __dt__25mDoExt_MtxCalcAnmBlendTblFv() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void J3DMtxCalcAnmBase::getAnmTransform() { +asm J3DAnmTransform* J3DMtxCalcAnmBase::getAnmTransform() { nofralloc #include "asm/m_Do/m_Do_ext/getAnmTransform__17J3DMtxCalcAnmBaseFv.s" } @@ -3773,7 +4152,7 @@ void J3DMtxCalcNoAnm::ini /* 80015084-800150AC 00F9C4 0028+00 2/0 0/0 0/0 .text * calc__73J3DMtxCalcNoAnm<27J3DMtxCalcCalcTransformMaya,24J3DMtxCalcJ3DSysInitMaya>Fv */ void J3DMtxCalcNoAnm::calc() { - calcTransform(getJoint()->getTransformInfo()); + J3DMtxCalcCalcTransformMaya::calcTransform(getJoint()->getTransformInfo()); } /* 800150AC-8001513C 00F9EC 0090+00 1/0 0/0 0/0 .text