From e66c902b3091aabbae813d3a3164f59fdc39da98 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 31 Dec 2022 10:44:40 -0800 Subject: [PATCH] J3DMtxBuffer start --- ...cViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f.s | 47 ------- ...create__12J3DMtxBufferFP12J3DModelDataUl.s | 78 ------------ .../initialize__12J3DMtxBufferFv.s | 18 --- .../JSystem/J3DGraphAnimator/J3DModelData.h | 4 +- .../JSystem/J3DGraphAnimator/J3DMtxBuffer.h | 10 +- .../JSystem/J3DGraphAnimator/J3DMtxBuffer.cpp | 117 ++++++++++++++---- 6 files changed, 98 insertions(+), 176 deletions(-) delete mode 100644 asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f.s delete mode 100644 asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/create__12J3DMtxBufferFP12J3DModelDataUl.s delete mode 100644 asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/initialize__12J3DMtxBufferFv.s diff --git a/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f.s b/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f.s deleted file mode 100644 index 67f8323807a..00000000000 --- a/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f.s +++ /dev/null @@ -1,47 +0,0 @@ -lbl_80327048: -/* 80327048 94 21 FF C0 */ stwu r1, -0x40(r1) -/* 8032704C 7C 08 02 A6 */ mflr r0 -/* 80327050 90 01 00 44 */ stw r0, 0x44(r1) -/* 80327054 C0 05 00 00 */ lfs f0, 0(r5) -/* 80327058 C0 64 00 00 */ lfs f3, 0(r4) -/* 8032705C EC 00 00 F2 */ fmuls f0, f0, f3 -/* 80327060 D0 01 00 08 */ stfs f0, 8(r1) -/* 80327064 C0 05 00 04 */ lfs f0, 4(r5) -/* 80327068 C0 44 00 04 */ lfs f2, 4(r4) -/* 8032706C EC 00 00 B2 */ fmuls f0, f0, f2 -/* 80327070 D0 01 00 0C */ stfs f0, 0xc(r1) -/* 80327074 C0 05 00 08 */ lfs f0, 8(r5) -/* 80327078 C0 24 00 08 */ lfs f1, 8(r4) -/* 8032707C EC 00 00 72 */ fmuls f0, f0, f1 -/* 80327080 D0 01 00 10 */ stfs f0, 0x10(r1) -/* 80327084 C0 05 00 0C */ lfs f0, 0xc(r5) -/* 80327088 D0 01 00 14 */ stfs f0, 0x14(r1) -/* 8032708C C0 05 00 10 */ lfs f0, 0x10(r5) -/* 80327090 EC 00 00 F2 */ fmuls f0, f0, f3 -/* 80327094 D0 01 00 18 */ stfs f0, 0x18(r1) -/* 80327098 C0 05 00 14 */ lfs f0, 0x14(r5) -/* 8032709C EC 00 00 B2 */ fmuls f0, f0, f2 -/* 803270A0 D0 01 00 1C */ stfs f0, 0x1c(r1) -/* 803270A4 C0 05 00 18 */ lfs f0, 0x18(r5) -/* 803270A8 EC 00 00 72 */ fmuls f0, f0, f1 -/* 803270AC D0 01 00 20 */ stfs f0, 0x20(r1) -/* 803270B0 C0 05 00 1C */ lfs f0, 0x1c(r5) -/* 803270B4 D0 01 00 24 */ stfs f0, 0x24(r1) -/* 803270B8 C0 05 00 20 */ lfs f0, 0x20(r5) -/* 803270BC EC 00 00 F2 */ fmuls f0, f0, f3 -/* 803270C0 D0 01 00 28 */ stfs f0, 0x28(r1) -/* 803270C4 C0 05 00 24 */ lfs f0, 0x24(r5) -/* 803270C8 EC 00 00 B2 */ fmuls f0, f0, f2 -/* 803270CC D0 01 00 2C */ stfs f0, 0x2c(r1) -/* 803270D0 C0 05 00 28 */ lfs f0, 0x28(r5) -/* 803270D4 EC 00 00 72 */ fmuls f0, f0, f1 -/* 803270D8 D0 01 00 30 */ stfs f0, 0x30(r1) -/* 803270DC C0 05 00 2C */ lfs f0, 0x2c(r5) -/* 803270E0 D0 01 00 34 */ stfs f0, 0x34(r1) -/* 803270E4 38 81 00 08 */ addi r4, r1, 8 -/* 803270E8 7C C5 33 78 */ mr r5, r6 -/* 803270EC 48 01 F3 F9 */ bl PSMTXConcat -/* 803270F0 80 01 00 44 */ lwz r0, 0x44(r1) -/* 803270F4 7C 08 03 A6 */ mtlr r0 -/* 803270F8 38 21 00 40 */ addi r1, r1, 0x40 -/* 803270FC 4E 80 00 20 */ blr diff --git a/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/create__12J3DMtxBufferFP12J3DModelDataUl.s b/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/create__12J3DMtxBufferFP12J3DModelDataUl.s deleted file mode 100644 index 3c3e261809e..00000000000 --- a/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/create__12J3DMtxBufferFP12J3DModelDataUl.s +++ /dev/null @@ -1,78 +0,0 @@ -lbl_80326258: -/* 80326258 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 8032625C 7C 08 02 A6 */ mflr r0 -/* 80326260 90 01 00 24 */ stw r0, 0x24(r1) -/* 80326264 39 61 00 20 */ addi r11, r1, 0x20 -/* 80326268 48 03 BF 71 */ bl _savegpr_28 -/* 8032626C 7C 7C 1B 78 */ mr r28, r3 -/* 80326270 7C 9D 23 78 */ mr r29, r4 -/* 80326274 7C BE 2B 78 */ mr r30, r5 -/* 80326278 93 C3 00 2C */ stw r30, 0x2c(r3) -/* 8032627C 38 1D 00 10 */ addi r0, r29, 0x10 -/* 80326280 90 03 00 00 */ stw r0, 0(r3) -/* 80326284 48 00 00 E1 */ bl createAnmMtx__12J3DMtxBufferFP12J3DModelData -/* 80326288 2C 03 00 00 */ cmpwi r3, 0 -/* 8032628C 41 82 00 08 */ beq lbl_80326294 -/* 80326290 48 00 00 BC */ b lbl_8032634C -lbl_80326294: -/* 80326294 7F 83 E3 78 */ mr r3, r28 -/* 80326298 7F A4 EB 78 */ mr r4, r29 -/* 8032629C 48 00 01 55 */ bl createWeightEnvelopeMtx__12J3DMtxBufferFP12J3DModelData -/* 803262A0 7C 7F 1B 79 */ or. r31, r3, r3 -/* 803262A4 41 82 00 08 */ beq lbl_803262AC -/* 803262A8 48 00 00 A4 */ b lbl_8032634C -lbl_803262AC: -/* 803262AC 80 7D 00 08 */ lwz r3, 8(r29) -/* 803262B0 54 60 C7 FF */ rlwinm. r0, r3, 0x18, 0x1f, 0x1f -/* 803262B4 41 82 00 10 */ beq lbl_803262C4 -/* 803262B8 7F 83 E3 78 */ mr r3, r28 -/* 803262BC 48 00 01 D1 */ bl setNoUseDrawMtx__12J3DMtxBufferFv -/* 803262C0 48 00 00 44 */ b lbl_80326304 -lbl_803262C4: -/* 803262C4 54 60 06 F6 */ rlwinm r0, r3, 0, 0x1b, 0x1b -/* 803262C8 2C 00 00 10 */ cmpwi r0, 0x10 -/* 803262CC 41 82 00 14 */ beq lbl_803262E0 -/* 803262D0 40 80 00 20 */ bge lbl_803262F0 -/* 803262D4 2C 00 00 00 */ cmpwi r0, 0 -/* 803262D8 41 82 00 18 */ beq lbl_803262F0 -/* 803262DC 48 00 00 14 */ b lbl_803262F0 -lbl_803262E0: -/* 803262E0 7F 83 E3 78 */ mr r3, r28 -/* 803262E4 48 00 01 A9 */ bl setNoUseDrawMtx__12J3DMtxBufferFv -/* 803262E8 7C 7F 1B 78 */ mr r31, r3 -/* 803262EC 48 00 00 18 */ b lbl_80326304 -lbl_803262F0: -/* 803262F0 7F 83 E3 78 */ mr r3, r28 -/* 803262F4 7F A4 EB 78 */ mr r4, r29 -/* 803262F8 7F C5 F3 78 */ mr r5, r30 -/* 803262FC 48 00 01 BD */ bl createDoubleDrawMtx__12J3DMtxBufferFP12J3DModelDataUl -/* 80326300 7C 7F 1B 78 */ mr r31, r3 -lbl_80326304: -/* 80326304 2C 1F 00 00 */ cmpwi r31, 0 -/* 80326308 41 82 00 0C */ beq lbl_80326314 -/* 8032630C 7F E3 FB 78 */ mr r3, r31 -/* 80326310 48 00 00 3C */ b lbl_8032634C -lbl_80326314: -/* 80326314 80 1D 00 08 */ lwz r0, 8(r29) -/* 80326318 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b -/* 8032631C 41 82 00 10 */ beq lbl_8032632C -/* 80326320 38 00 00 00 */ li r0, 0 -/* 80326324 B0 1D 00 0C */ sth r0, 0xc(r29) -/* 80326328 48 00 00 20 */ b lbl_80326348 -lbl_8032632C: -/* 8032632C 7F 83 E3 78 */ mr r3, r28 -/* 80326330 7F A4 EB 78 */ mr r4, r29 -/* 80326334 7F C5 F3 78 */ mr r5, r30 -/* 80326338 48 00 03 2D */ bl createBumpMtxArray__12J3DMtxBufferFP12J3DModelDataUl -/* 8032633C 7C 7F 1B 79 */ or. r31, r3, r3 -/* 80326340 41 82 00 08 */ beq lbl_80326348 -/* 80326344 48 00 00 08 */ b lbl_8032634C -lbl_80326348: -/* 80326348 7F E3 FB 78 */ mr r3, r31 -lbl_8032634C: -/* 8032634C 39 61 00 20 */ addi r11, r1, 0x20 -/* 80326350 48 03 BE D5 */ bl _restgpr_28 -/* 80326354 80 01 00 24 */ lwz r0, 0x24(r1) -/* 80326358 7C 08 03 A6 */ mtlr r0 -/* 8032635C 38 21 00 20 */ addi r1, r1, 0x20 -/* 80326360 4E 80 00 20 */ blr diff --git a/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/initialize__12J3DMtxBufferFv.s b/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/initialize__12J3DMtxBufferFv.s deleted file mode 100644 index abf86008a74..00000000000 --- a/asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/initialize__12J3DMtxBufferFv.s +++ /dev/null @@ -1,18 +0,0 @@ -lbl_80326214: -/* 80326214 38 80 00 00 */ li r4, 0 -/* 80326218 90 83 00 00 */ stw r4, 0(r3) -/* 8032621C 90 83 00 04 */ stw r4, 4(r3) -/* 80326220 90 83 00 08 */ stw r4, 8(r3) -/* 80326224 90 83 00 0C */ stw r4, 0xc(r3) -/* 80326228 90 83 00 10 */ stw r4, 0x10(r3) -/* 8032622C 90 83 00 14 */ stw r4, 0x14(r3) -/* 80326230 90 83 00 18 */ stw r4, 0x18(r3) -/* 80326234 90 83 00 1C */ stw r4, 0x1c(r3) -/* 80326238 90 83 00 20 */ stw r4, 0x20(r3) -/* 8032623C 90 83 00 24 */ stw r4, 0x24(r3) -/* 80326240 90 83 00 28 */ stw r4, 0x28(r3) -/* 80326244 38 00 00 01 */ li r0, 1 -/* 80326248 90 03 00 2C */ stw r0, 0x2c(r3) -/* 8032624C 90 83 00 30 */ stw r4, 0x30(r3) -/* 80326250 90 83 00 34 */ stw r4, 0x34(r3) -/* 80326254 4E 80 00 20 */ blr diff --git a/include/JSystem/J3DGraphAnimator/J3DModelData.h b/include/JSystem/J3DGraphAnimator/J3DModelData.h index 85c00949454..1bc947fab48 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModelData.h +++ b/include/JSystem/J3DGraphAnimator/J3DModelData.h @@ -42,8 +42,10 @@ public: void* getVtxPosArray() const { return mVertexData.getVtxPosArray(); } void* getVtxNrmArray() const { return mVertexData.getVtxNrmArray(); } GXColor* getVtxColorArray(u8 idx) const { return mVertexData.getVtxColorArray(idx); } - bool checkFlag(u32 flag) const { return !!(mFlags & flag); } + bool checkFlag(u32 flag) const { return (mFlags & flag) ? true : false; } + u32 getFlag() const { return mFlags; } u16 checkBumpFlag() const { return mbHasBumpArray; } + void setBumpFlag(u32 flag) { mbHasBumpArray = flag; } bool checkBBoardFlag() const { return mbHasBillboard == 1; } bool isLocked() { return mMaterialTable.isLocked(); } void entryTexMtxAnimator(J3DAnmTextureSRTKey* anm) { mMaterialTable.entryTexMtxAnimator(anm); } diff --git a/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h b/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h index 5ce09d7fedb..a226ec5cbe5 100644 --- a/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h +++ b/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h @@ -14,11 +14,11 @@ public: /* 80326214 */ void initialize(); /* 80326258 */ s32 create(J3DModelData*, u32); - /* 80326364 */ void createAnmMtx(J3DModelData*); - /* 803263F0 */ void createWeightEnvelopeMtx(J3DModelData*); - /* 8032648C */ void setNoUseDrawMtx(); - /* 803264B8 */ void createDoubleDrawMtx(J3DModelData*, u32); - /* 80326664 */ void createBumpMtxArray(J3DModelData*, u32); + /* 80326364 */ s32 createAnmMtx(J3DModelData*); + /* 803263F0 */ s32 createWeightEnvelopeMtx(J3DModelData*); + /* 8032648C */ s32 setNoUseDrawMtx(); + /* 803264B8 */ s32 createDoubleDrawMtx(J3DModelData*, u32); + /* 80326664 */ s32 createBumpMtxArray(J3DModelData*, u32); /* 803268D4 */ void calcWeightEnvelopeMtx(); /* 80326ACC */ void calcDrawMtx(u32, Vec const&, f32 const (&)[3][4]); /* 80326D3C */ void calcNrmMtx(); diff --git a/libs/JSystem/J3DGraphAnimator/J3DMtxBuffer.cpp b/libs/JSystem/J3DGraphAnimator/J3DMtxBuffer.cpp index b1549a97fe5..26e7595b1bd 100644 --- a/libs/JSystem/J3DGraphAnimator/J3DMtxBuffer.cpp +++ b/libs/JSystem/J3DGraphAnimator/J3DMtxBuffer.cpp @@ -6,6 +6,7 @@ #include "JSystem/J3DGraphAnimator/J3DMtxBuffer.h" #include "dol2asm.h" #include "dolphin/types.h" +#include "mtx/mtx.h" // // Forward References: @@ -55,31 +56,82 @@ extern "C" void _restgpr_29(); // /* 80326214-80326258 320B54 0044+00 0/0 1/1 0/0 .text initialize__12J3DMtxBufferFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DMtxBuffer::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/initialize__12J3DMtxBufferFv.s" +void J3DMtxBuffer::initialize() { + mJointTree = NULL; + mScaleFlagArray = NULL; + mEnvScaleFlag = NULL; + mpAnmMtx = NULL; + mpWeightEnvMtx = NULL; + mpOldDrawMtxArr = NULL; + mpDrawMtxArr = NULL; + mpOldNrmMtxArr = NULL; + mpNrmMtxArr = NULL; + field_0x24 = NULL; // mpOldBumpMtxArr? + mpBumpMtxArr = NULL; + mFlags = 1; + mCurrentViewNo = 0; + mUserAnmMtx = NULL; } -#pragma pop /* 80326258-80326364 320B98 010C+00 0/0 1/1 0/0 .text create__12J3DMtxBufferFP12J3DModelDataUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm s32 J3DMtxBuffer::create(J3DModelData* param_0, u32 param_1) { - nofralloc -#include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/create__12J3DMtxBufferFP12J3DModelDataUl.s" +enum { + J3DMdlDataFlag_ConcatView = 0x10, + J3DMdlDataFlag_NoAnimation = 0x100, +}; + +static inline u32 getMdlDataFlag_MtxLoadType(u32 flag) { + return flag & 0x10; +} + +s32 J3DMtxBuffer::create(J3DModelData* p_modelData, u32 flag) { + s32 ret; + + mFlags = flag; + mJointTree = &p_modelData->getJointTree(); + + ret = createAnmMtx(p_modelData); + if (ret != kJ3DError_Success) + return ret; + + ret = createWeightEnvelopeMtx(p_modelData); + if (ret != kJ3DError_Success) + return ret; + + if (p_modelData->checkFlag(J3DMdlDataFlag_NoAnimation)) { + setNoUseDrawMtx(); + } else { + switch (getMdlDataFlag_MtxLoadType(p_modelData->getFlag())) { + case J3DMdlDataFlag_ConcatView: + ret = setNoUseDrawMtx(); + break; + case 0: + default: + ret = createDoubleDrawMtx(p_modelData, flag); + break; + } + } + + if (ret != kJ3DError_Success) + return ret; + + if (p_modelData->getFlag() & J3DMdlDataFlag_ConcatView) { + p_modelData->setBumpFlag(0); + } else { + ret = createBumpMtxArray(p_modelData, flag); + + if (ret != kJ3DError_Success) + return ret; + } + + return ret; } -#pragma pop /* 80326364-803263F0 320CA4 008C+00 1/1 0/0 0/0 .text createAnmMtx__12J3DMtxBufferFP12J3DModelData */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void J3DMtxBuffer::createAnmMtx(J3DModelData* param_0) { +asm s32 J3DMtxBuffer::createAnmMtx(J3DModelData* param_0) { nofralloc #include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/createAnmMtx__12J3DMtxBufferFP12J3DModelData.s" } @@ -90,7 +142,7 @@ asm void J3DMtxBuffer::createAnmMtx(J3DModelData* param_0) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void J3DMtxBuffer::createWeightEnvelopeMtx(J3DModelData* param_0) { +asm s32 J3DMtxBuffer::createWeightEnvelopeMtx(J3DModelData* param_0) { nofralloc #include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/createWeightEnvelopeMtx__12J3DMtxBufferFP12J3DModelData.s" } @@ -114,7 +166,7 @@ Mtx33* J3DMtxBuffer::sNoUseNrmMtxPtr = &J3DMtxBuffer::sNoUseNrmMtx; #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void J3DMtxBuffer::setNoUseDrawMtx() { +asm s32 J3DMtxBuffer::setNoUseDrawMtx() { nofralloc #include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/setNoUseDrawMtx__12J3DMtxBufferFv.s" } @@ -125,7 +177,7 @@ asm void J3DMtxBuffer::setNoUseDrawMtx() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void J3DMtxBuffer::createDoubleDrawMtx(J3DModelData* param_0, u32 param_1) { +asm s32 J3DMtxBuffer::createDoubleDrawMtx(J3DModelData* param_0, u32 param_1) { nofralloc #include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/createDoubleDrawMtx__12J3DMtxBufferFP12J3DModelDataUl.s" } @@ -136,7 +188,7 @@ asm void J3DMtxBuffer::createDoubleDrawMtx(J3DModelData* param_0, u32 param_1) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void J3DMtxBuffer::createBumpMtxArray(J3DModelData* param_0, u32 param_1) { +asm s32 J3DMtxBuffer::createBumpMtxArray(J3DModelData* param_0, u32 param_1) { nofralloc #include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/createBumpMtxArray__12J3DMtxBufferFP12J3DModelDataUl.s" } @@ -203,12 +255,23 @@ asm void J3DMtxBuffer::calcBBoardMtx() { /* 80327048-80327100 321988 00B8+00 1/1 1/1 0/0 .text * J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DCalcViewBaseMtx(f32 (*param_0)[4], Vec const& param_1, f32 const (¶m_2)[3][4], - f32 (*param_3)[4]) { - nofralloc -#include "asm/JSystem/J3DGraphAnimator/J3DMtxBuffer/J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f.s" +void J3DCalcViewBaseMtx(Mtx view, Vec const& scale, const Mtx& base, Mtx dst) { + Mtx m; + + m[0][0] = base[0][0] * scale.x; + m[0][1] = base[0][1] * scale.y; + m[0][2] = base[0][2] * scale.z; + m[0][3] = base[0][3]; + + m[1][0] = base[1][0] * scale.x; + m[1][1] = base[1][1] * scale.y; + m[1][2] = base[1][2] * scale.z; + m[1][3] = base[1][3]; + + m[2][0] = base[2][0] * scale.x; + m[2][1] = base[2][1] * scale.y; + m[2][2] = base[2][2] * scale.z; + m[2][3] = base[2][3]; + + PSMTXConcat(view, m, dst); } -#pragma pop