From 0ff72d731be2c03d9626289dc679299b2496fa0d Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Fri, 30 Dec 2022 14:09:21 -0800 Subject: [PATCH] J3DJointTree OK --- .../findImportantMtxIndex__12J3DJointTreeFv.s | 51 ----- .../J3DJointTree/func_80325A9C.s | 97 -------- include/JSystem/J3DGraphAnimator/J3DJoint.h | 1 + .../JSystem/J3DGraphAnimator/J3DJointTree.h | 19 +- include/JSystem/J3DGraphBase/J3DShape.h | 1 + .../JSystem/J3DGraphAnimator/J3DJointTree.cpp | 212 ++++++++---------- 6 files changed, 113 insertions(+), 268 deletions(-) delete mode 100644 asm/JSystem/J3DGraphAnimator/J3DJointTree/findImportantMtxIndex__12J3DJointTreeFv.s delete mode 100644 asm/JSystem/J3DGraphAnimator/J3DJointTree/func_80325A9C.s diff --git a/asm/JSystem/J3DGraphAnimator/J3DJointTree/findImportantMtxIndex__12J3DJointTreeFv.s b/asm/JSystem/J3DGraphAnimator/J3DJointTree/findImportantMtxIndex__12J3DJointTreeFv.s deleted file mode 100644 index df12b637195..00000000000 --- a/asm/JSystem/J3DGraphAnimator/J3DJointTree/findImportantMtxIndex__12J3DJointTreeFv.s +++ /dev/null @@ -1,51 +0,0 @@ -lbl_80325C00: -/* 80325C00 A0 E3 00 1E */ lhz r7, 0x1e(r3) -/* 80325C04 38 80 00 00 */ li r4, 0 -/* 80325C08 38 A0 00 00 */ li r5, 0 -/* 80325C0C A0 03 00 36 */ lhz r0, 0x36(r3) -/* 80325C10 81 03 00 24 */ lwz r8, 0x24(r3) -/* 80325C14 81 23 00 28 */ lwz r9, 0x28(r3) -/* 80325C18 81 43 00 30 */ lwz r10, 0x30(r3) -/* 80325C1C 39 80 00 00 */ li r12, 0 -/* 80325C20 48 00 00 18 */ b lbl_80325C38 -lbl_80325C24: -/* 80325C24 55 8B 0B FC */ rlwinm r11, r12, 1, 0xf, 0x1e -/* 80325C28 80 C3 00 3C */ lwz r6, 0x3c(r3) -/* 80325C2C 7C C6 5A 2E */ lhzx r6, r6, r11 -/* 80325C30 7C CA 5B 2E */ sthx r6, r10, r11 -/* 80325C34 39 8C 00 01 */ addi r12, r12, 1 -lbl_80325C38: -/* 80325C38 55 86 04 3E */ clrlwi r6, r12, 0x10 -/* 80325C3C 7C 06 00 40 */ cmplw r6, r0 -/* 80325C40 41 80 FF E4 */ blt lbl_80325C24 -/* 80325C44 39 60 00 00 */ li r11, 0 -/* 80325C48 48 00 00 58 */ b lbl_80325CA0 -lbl_80325C4C: -/* 80325C4C 80 C3 00 20 */ lwz r6, 0x20(r3) -/* 80325C50 55 60 04 3E */ clrlwi r0, r11, 0x10 -/* 80325C54 7C 06 00 AE */ lbzx r0, r6, r0 -/* 80325C58 38 C0 00 00 */ li r6, 0 -/* 80325C5C C0 22 CA 18 */ lfs f1, lit_903(r2) -/* 80325C60 7C 09 03 A6 */ mtctr r0 -/* 80325C64 2C 00 00 00 */ cmpwi r0, 0 -/* 80325C68 40 81 00 24 */ ble lbl_80325C8C -lbl_80325C6C: -/* 80325C6C 7C 09 2C 2E */ lfsx f0, r9, r5 -/* 80325C70 FC 01 00 40 */ fcmpo cr0, f1, f0 -/* 80325C74 40 80 00 0C */ bge lbl_80325C80 -/* 80325C78 FC 20 00 90 */ fmr f1, f0 -/* 80325C7C 7C C8 22 2E */ lhzx r6, r8, r4 -lbl_80325C80: -/* 80325C80 38 84 00 02 */ addi r4, r4, 2 -/* 80325C84 38 A5 00 04 */ addi r5, r5, 4 -/* 80325C88 42 00 FF E4 */ bdnz lbl_80325C6C -lbl_80325C8C: -/* 80325C8C A0 03 00 36 */ lhz r0, 0x36(r3) -/* 80325C90 7C 0B 02 14 */ add r0, r11, r0 -/* 80325C94 54 00 08 3C */ slwi r0, r0, 1 -/* 80325C98 7C CA 03 2E */ sthx r6, r10, r0 -/* 80325C9C 39 6B 00 01 */ addi r11, r11, 1 -lbl_80325CA0: -/* 80325CA0 7C 0B 38 00 */ cmpw r11, r7 -/* 80325CA4 41 80 FF A8 */ blt lbl_80325C4C -/* 80325CA8 4E 80 00 20 */ blr diff --git a/asm/JSystem/J3DGraphAnimator/J3DJointTree/func_80325A9C.s b/asm/JSystem/J3DGraphAnimator/J3DJointTree/func_80325A9C.s deleted file mode 100644 index c26fb3c0645..00000000000 --- a/asm/JSystem/J3DGraphAnimator/J3DJointTree/func_80325A9C.s +++ /dev/null @@ -1,97 +0,0 @@ -lbl_80325A9C: -/* 80325A9C 94 21 FF D0 */ stwu r1, -0x30(r1) -/* 80325AA0 7C 08 02 A6 */ mflr r0 -/* 80325AA4 90 01 00 34 */ stw r0, 0x34(r1) -/* 80325AA8 39 61 00 30 */ addi r11, r1, 0x30 -/* 80325AAC 48 03 C7 19 */ bl _savegpr_23 -/* 80325AB0 7C 77 1B 78 */ mr r23, r3 -/* 80325AB4 7C 98 23 78 */ mr r24, r4 -/* 80325AB8 7C B9 2B 78 */ mr r25, r5 -/* 80325ABC 7C DA 33 78 */ mr r26, r6 -/* 80325AC0 7C FB 3B 78 */ mr r27, r7 -/* 80325AC4 7F 1F C3 78 */ mr r31, r24 -lbl_80325AC8: -/* 80325AC8 3B C0 00 00 */ li r30, 0 -/* 80325ACC 3B A0 00 00 */ li r29, 0 -/* 80325AD0 3B 80 00 00 */ li r28, 0 -/* 80325AD4 80 99 00 00 */ lwz r4, 0(r25) -/* 80325AD8 A0 04 00 00 */ lhz r0, 0(r4) -/* 80325ADC 28 00 00 12 */ cmplwi r0, 0x12 -/* 80325AE0 41 81 00 A0 */ bgt lbl_80325B80 -/* 80325AE4 3C 60 80 3D */ lis r3, lit_871@ha /* 0x803CECA8@ha */ -/* 80325AE8 38 63 EC A8 */ addi r3, r3, lit_871@l /* 0x803CECA8@l */ -/* 80325AEC 54 00 10 3A */ slwi r0, r0, 2 -/* 80325AF0 7C 03 00 2E */ lwzx r0, r3, r0 -/* 80325AF4 7C 09 03 A6 */ mtctr r0 -/* 80325AF8 4E 80 04 20 */ bctr -/* 80325AFC 38 04 00 04 */ addi r0, r4, 4 -/* 80325B00 90 19 00 00 */ stw r0, 0(r25) -/* 80325B04 7E E3 BB 78 */ mr r3, r23 -/* 80325B08 7F E4 FB 78 */ mr r4, r31 -/* 80325B0C 7F 25 CB 78 */ mr r5, r25 -/* 80325B10 7F 46 D3 78 */ mr r6, r26 -/* 80325B14 7F 67 DB 78 */ mr r7, r27 -/* 80325B18 4B FF FF 85 */ bl makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable -/* 80325B1C 48 00 00 64 */ b lbl_80325B80 -/* 80325B20 38 04 00 04 */ addi r0, r4, 4 -/* 80325B24 90 19 00 00 */ stw r0, 0(r25) -/* 80325B28 48 00 00 C0 */ b lbl_80325BE8 -/* 80325B2C 48 00 00 BC */ b lbl_80325BE8 -/* 80325B30 80 77 00 18 */ lwz r3, 0x18(r23) -/* 80325B34 38 04 00 04 */ addi r0, r4, 4 -/* 80325B38 90 19 00 00 */ stw r0, 0(r25) -/* 80325B3C A0 04 00 02 */ lhz r0, 2(r4) -/* 80325B40 54 00 10 3A */ slwi r0, r0, 2 -/* 80325B44 7F C3 00 2E */ lwzx r30, r3, r0 -/* 80325B48 48 00 00 38 */ b lbl_80325B80 -/* 80325B4C 38 04 00 04 */ addi r0, r4, 4 -/* 80325B50 90 19 00 00 */ stw r0, 0(r25) -/* 80325B54 A0 04 00 02 */ lhz r0, 2(r4) -/* 80325B58 80 7A 00 08 */ lwz r3, 8(r26) -/* 80325B5C 54 00 10 3A */ slwi r0, r0, 2 -/* 80325B60 7F A3 00 2E */ lwzx r29, r3, r0 -/* 80325B64 48 00 00 1C */ b lbl_80325B80 -/* 80325B68 38 04 00 04 */ addi r0, r4, 4 -/* 80325B6C 90 19 00 00 */ stw r0, 0(r25) -/* 80325B70 A0 04 00 02 */ lhz r0, 2(r4) -/* 80325B74 80 7B 00 08 */ lwz r3, 8(r27) -/* 80325B78 54 00 10 3A */ slwi r0, r0, 2 -/* 80325B7C 7F 83 00 2E */ lwzx r28, r3, r0 -lbl_80325B80: -/* 80325B80 28 1E 00 00 */ cmplwi r30, 0 -/* 80325B84 41 82 00 28 */ beq lbl_80325BAC -/* 80325B88 7F DF F3 78 */ mr r31, r30 -/* 80325B8C 28 18 00 00 */ cmplwi r24, 0 -/* 80325B90 40 82 00 0C */ bne lbl_80325B9C -/* 80325B94 93 D7 00 10 */ stw r30, 0x10(r23) -/* 80325B98 4B FF FF 30 */ b lbl_80325AC8 -lbl_80325B9C: -/* 80325B9C 7F 03 C3 78 */ mr r3, r24 -/* 80325BA0 7F C4 F3 78 */ mr r4, r30 -/* 80325BA4 48 00 95 99 */ bl appendChild__8J3DJointFP8J3DJoint -/* 80325BA8 4B FF FF 20 */ b lbl_80325AC8 -lbl_80325BAC: -/* 80325BAC 28 1D 00 00 */ cmplwi r29, 0 -/* 80325BB0 41 82 00 20 */ beq lbl_80325BD0 -/* 80325BB4 80 18 00 58 */ lwz r0, 0x58(r24) -/* 80325BB8 28 00 00 00 */ cmplwi r0, 0 -/* 80325BBC 41 82 00 08 */ beq lbl_80325BC4 -/* 80325BC0 90 1D 00 04 */ stw r0, 4(r29) -lbl_80325BC4: -/* 80325BC4 93 B8 00 58 */ stw r29, 0x58(r24) -/* 80325BC8 93 1D 00 0C */ stw r24, 0xc(r29) -/* 80325BCC 4B FF FE FC */ b lbl_80325AC8 -lbl_80325BD0: -/* 80325BD0 28 1C 00 00 */ cmplwi r28, 0 -/* 80325BD4 41 82 FE F4 */ beq lbl_80325AC8 -/* 80325BD8 80 78 00 58 */ lwz r3, 0x58(r24) -/* 80325BDC 93 83 00 08 */ stw r28, 8(r3) -/* 80325BE0 90 7C 00 04 */ stw r3, 4(r28) -/* 80325BE4 4B FF FE E4 */ b lbl_80325AC8 -lbl_80325BE8: -/* 80325BE8 39 61 00 30 */ addi r11, r1, 0x30 -/* 80325BEC 48 03 C6 25 */ bl _restgpr_23 -/* 80325BF0 80 01 00 34 */ lwz r0, 0x34(r1) -/* 80325BF4 7C 08 03 A6 */ mtlr r0 -/* 80325BF8 38 21 00 30 */ addi r1, r1, 0x30 -/* 80325BFC 4E 80 00 20 */ blr diff --git a/include/JSystem/J3DGraphAnimator/J3DJoint.h b/include/JSystem/J3DGraphAnimator/J3DJoint.h index 94ce45c74d7..dcb89894acf 100644 --- a/include/JSystem/J3DGraphAnimator/J3DJoint.h +++ b/include/JSystem/J3DGraphAnimator/J3DJoint.h @@ -69,6 +69,7 @@ public: private: friend struct J3DJointFactory; + friend class J3DJointTree; /* 0x00 */ void* mCallBackUserData; /* 0x04 */ J3DJointCallBack mCallBack; diff --git a/include/JSystem/J3DGraphAnimator/J3DJointTree.h b/include/JSystem/J3DGraphAnimator/J3DJointTree.h index 4937fdae320..80513fb4de3 100644 --- a/include/JSystem/J3DGraphAnimator/J3DJointTree.h +++ b/include/JSystem/J3DGraphAnimator/J3DJointTree.h @@ -6,7 +6,11 @@ #include "dolphin/mtx/mtxvec.h" #include "dolphin/types.h" -struct J3DModelHierarchy {}; +struct J3DModelHierarchy { + /* 0x0 */ u16 mType; + /* 0x2 */ u16 mValue; +}; + struct J3DMaterialTable; struct J3DDrawMtxData { @@ -32,6 +36,11 @@ public: /* 80325D24 */ virtual ~J3DJointTree(); u16 getWEvlpMtxNum() const { return mWEvlpMtxNum; } + u8 getWEvlpMixMtxNum(u16 idx) const { return mWEvlpMixMtxNum[idx]; } + u16 * getWEvlpMixIndex() const { return mWEvlpMixIndex; } + f32 * getWEvlpMixWeight() const { return mWEvlpMixWeight; } + u16 * getWEvlpImportantMtxIndex() const { return mWEvlpImportantMtxIdx; } + u16 getDrawFullWgtMtxNum() const { return mDrawMtxData.mDrawFullWgtMtxNum; } u16 getJointNum() const { return mJointNum; } u16 getDrawMtxNum() const { return mDrawMtxData.mEntryNum; } JUTNameTab* getJointName() const { return mJointName; } @@ -49,11 +58,11 @@ private: /* 0x18 */ J3DJoint** mJointNodePointer; /* 0x1C */ u16 mJointNum; /* 0x1E */ u16 mWEvlpMtxNum; - /* 0x20 */ u32 mWEvlpMixMtxNum; - /* 0x24 */ s32 mWEvlpMixIndex; - /* 0x28 */ s32 mWEvlpMixWeight; + /* 0x20 */ u8* mWEvlpMixMtxNum; + /* 0x24 */ u16* mWEvlpMixIndex; + /* 0x28 */ f32* mWEvlpMixWeight; /* 0x2C */ Mtx* mInvJointMtx; - /* 0x30 */ s32 mWEvlpImportantMtxIdx; + /* 0x30 */ u16* mWEvlpImportantMtxIdx; /* 0x34 */ J3DDrawMtxData mDrawMtxData; /* 0x40 */ u32 field_0x40; /* 0x44 */ JUTNameTab* mJointName; diff --git a/include/JSystem/J3DGraphBase/J3DShape.h b/include/JSystem/J3DGraphBase/J3DShape.h index 85cf0da8e97..372dacc9766 100644 --- a/include/JSystem/J3DGraphBase/J3DShape.h +++ b/include/JSystem/J3DGraphBase/J3DShape.h @@ -113,6 +113,7 @@ public: private: friend struct J3DShapeFactory; + friend class J3DJointTree; /* 0x04 */ J3DMaterial* mMaterial; /* 0x08 */ u16 mIndex; diff --git a/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp b/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp index 56ce30c90d3..e757921fe42 100644 --- a/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp +++ b/libs/JSystem/J3DGraphAnimator/J3DJointTree.cpp @@ -4,101 +4,11 @@ // #include "JSystem/J3DGraphAnimator/J3DJointTree.h" +#include "JSystem/J3DGraphAnimator/J3DMaterialAttach.h" +#include "JSystem/J3DGraphAnimator/J3DShapeTable.h" #include "dol2asm.h" #include "dolphin/types.h" -// -// Forward References: -// - -extern "C" void __ct__12J3DJointTreeFv(); -extern "C" void -makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable(); -extern "C" void findImportantMtxIndex__12J3DJointTreeFv(); -extern "C" void calc__12J3DJointTreeFP12J3DMtxBufferRC3VecRA3_A4_Cf(); -extern "C" void setMtxBuffer__10J3DMtxCalcFP12J3DMtxBuffer(); -extern "C" void __dt__12J3DJointTreeFv(); - -// -// External References: -// - -extern "C" void __dl__FPv(); -extern "C" void __ct__14J3DDrawMtxDataFv(); -extern "C" void __dt__14J3DDrawMtxDataFv(); -extern "C" void appendChild__8J3DJointFP8J3DJoint(); -extern "C" void recursiveCalc__8J3DJointFv(); -extern "C" void _savegpr_23(); -extern "C" void _restgpr_23(); -extern "C" u8 mMtxBuffer__10J3DMtxCalc[4]; -extern "C" u8 mCurrentMtxCalc__8J3DJoint[4 + 4 /* padding */]; - -// -// Declarations: -// - -/* ############################################################################################## */ -/* 803CECA8-803CECF4 -00001 004C+00 1/1 0/0 0/0 .data @871 */ -SECTION_DATA static void* lit_871[19] = { - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0x90), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0x60), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0x84), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xE4), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0x94), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xB0), - (void*)(((char*) - makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable) + - 0xCC), -}; - /* 80325A18-80325A9C 320358 0084+00 0/0 1/1 0/0 .text __ct__12J3DJointTreeFv */ J3DJointTree::J3DJointTree() : mHierarchy(NULL), mFlags(0), mModelDataType(0), mRootNode(NULL), mBasicMtxCalc(NULL), @@ -109,33 +19,105 @@ J3DJointTree::J3DJointTree() /* 80325A9C-80325C00 3203DC 0164+00 1/0 2/2 0/0 .text * makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DJointTree::makeHierarchy(J3DJoint* param_0, J3DModelHierarchy const** param_1, - J3DMaterialTable* param_2, J3DShapeTable* param_3) { - nofralloc -#include "asm/JSystem/J3DGraphAnimator/J3DJointTree/func_80325A9C.s" -} -#pragma pop +void J3DJointTree::makeHierarchy(J3DJoint* pJoint, J3DModelHierarchy const** pHierarchy, + J3DMaterialTable* pMaterialTable, J3DShapeTable* pShapeTable) { + enum { + kTypeEnd = 0x00, + kTypeBeginChild = 0x01, + kTypeEndChild = 0x02, + kTypeJoint = 0x10, + kTypeMaterial = 0x11, + kTypeShape = 0x12, + }; -/* ############################################################################################## */ -/* 80456418-80456420 004A18 0004+04 1/1 0/0 0/0 .sdata2 @903 */ -SECTION_SDATA2 static f32 lit_903[1 + 1 /* padding */] = { - -1.0f / 10.0f, - /* padding */ - 0.0f, -}; + J3DJoint * curJoint = pJoint; + + while (true) { + J3DJoint * newJoint = NULL; + J3DMaterial * newMaterial = NULL; + J3DShape * newShape = NULL; + const J3DModelHierarchy * inf = *pHierarchy; + u16 val; + + switch (inf->mType) { + case kTypeBeginChild: + *pHierarchy = inf + 1; + makeHierarchy(curJoint, pHierarchy, pMaterialTable, pShapeTable); + break; + case kTypeEndChild: + *pHierarchy = inf + 1; + return; + case kTypeEnd: + return; + case kTypeJoint: + { + J3DJoint ** jointNodePointer = mJointNodePointer; + *pHierarchy = inf + 1; + newJoint = jointNodePointer[inf->mValue]; + } + break; + case kTypeMaterial: + *pHierarchy = inf + 1; + val = inf->mValue; + newMaterial = pMaterialTable->getMaterialNodePointer(val); + break; + case kTypeShape: + *pHierarchy = inf + 1; + val = inf->mValue; + newShape = pShapeTable->getShapeNodePointer(val); + break; + } + + if (newJoint != NULL) { + curJoint = newJoint; + if (pJoint == NULL) + mRootNode = newJoint; + else + pJoint->appendChild(newJoint); + } else if (newMaterial != NULL) { + if (pJoint->getMesh() != NULL) + newMaterial->mNext = pJoint->getMesh(); + pJoint->mMesh = newMaterial; + newMaterial->mJoint = pJoint; + } else if (newShape != NULL) { + newMaterial = pJoint->getMesh(); + newMaterial->mShape = newShape; + newShape->mMaterial = newMaterial; + } + } +} /* 80325C00-80325CAC 320540 00AC+00 0/0 2/2 0/0 .text findImportantMtxIndex__12J3DJointTreeFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DJointTree::findImportantMtxIndex() { - nofralloc -#include "asm/JSystem/J3DGraphAnimator/J3DJointTree/findImportantMtxIndex__12J3DJointTreeFv.s" +void J3DJointTree::findImportantMtxIndex() { + const s32 wEvlpMtxNum = getWEvlpMtxNum(); + u32 tableIdx = 0; + const u16 drawFullWgtMtxNum = getDrawFullWgtMtxNum(); + const u16 * wEvlpMixIndex = getWEvlpMixIndex(); + const f32 * wEvlpMixWeight = getWEvlpMixWeight(); + u16 * wEvlpImportantMtxIdx = getWEvlpImportantMtxIndex(); + + // Rigid matrices are easy. + for (u16 i = 0; i < drawFullWgtMtxNum; i++) + wEvlpImportantMtxIdx[i] = mDrawMtxData.mDrawMtxIndex[i]; + + // For envelope matrices, we need to find the matrix with the most contribution. + for (s32 i = 0; i < wEvlpMtxNum; i++) { + s32 mixNum = getWEvlpMixMtxNum(i); + u16 bestIdx = 0; + f32 bestWeight = -0.1f; + + for (s32 j = 0; j < mixNum; j++) { + if (bestWeight < wEvlpMixWeight[tableIdx]) { + bestWeight = wEvlpMixWeight[tableIdx]; + bestIdx = wEvlpMixIndex[tableIdx]; + } + + tableIdx++; + } + + wEvlpImportantMtxIdx[i + mDrawMtxData.mDrawFullWgtMtxNum] = bestIdx; + } } -#pragma pop /* 80325CAC-80325D1C 3205EC 0070+00 1/0 0/0 0/0 .text * calc__12J3DJointTreeFP12J3DMtxBufferRC3VecRA3_A4_Cf */