From fd5f4fa193d5e75cf5d4895c88e90d14527d3259 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 12 Jan 2023 12:37:45 -0800 Subject: [PATCH] Add CVirtualBone and CSkinRules Former-commit-id: 7764f30c5ba2f8e232d989fa86a904348b418a85 --- asm/Kyoto/Animation/DolphinCSkinRules.s | 71 ++++++++++-- asm/Kyoto/Animation/DolphinCVirtualBone.s | 101 ++++-------------- configure.py | 4 +- include/Kyoto/Animation/CPoseAsTransforms.hpp | 26 +++++ include/Kyoto/Animation/CSkinRules.hpp | 18 ++++ include/Kyoto/Animation/CVirtualBone.hpp | 34 ++++++ include/Kyoto/Graphics/CModel.hpp | 4 + include/MetroidPrime/CPoseAsTransforms.hpp | 3 +- src/Kyoto/Animation/DolphinCSkinRules.cpp | 29 +++++ src/Kyoto/Animation/DolphinCVirtualBone.cpp | 51 +++++++++ 10 files changed, 251 insertions(+), 90 deletions(-) create mode 100644 include/Kyoto/Animation/CPoseAsTransforms.hpp create mode 100644 include/Kyoto/Animation/CSkinRules.hpp create mode 100644 include/Kyoto/Animation/CVirtualBone.hpp create mode 100644 src/Kyoto/Animation/DolphinCSkinRules.cpp create mode 100644 src/Kyoto/Animation/DolphinCVirtualBone.cpp diff --git a/asm/Kyoto/Animation/DolphinCSkinRules.s b/asm/Kyoto/Animation/DolphinCSkinRules.s index 8c7d7874..eb89f7e3 100644 --- a/asm/Kyoto/Animation/DolphinCSkinRules.s +++ b/asm/Kyoto/Animation/DolphinCSkinRules.s @@ -510,7 +510,7 @@ lbl_80353EC8: /* 80353ED8 00350E38 7C 9A 2A 14 */ add r4, r26, r5 /* 80353EDC 00350E3C 7C BB 2A 14 */ add r5, r27, r5 /* 80353EE0 00350E40 7F E6 FB 78 */ mr r6, r31 -/* 80353EE4 00350E44 48 00 0A 0D */ bl sub_803548f0 +/* 80353EE4 00350E44 48 00 0A 0D */ bl BuildNormals__12CVirtualBoneCFPC9CVector3fP9CVector3fi /* 80353EE8 00350E48 7F BD FA 14 */ add r29, r29, r31 /* 80353EEC 00350E4C 3B DE 00 74 */ addi r30, r30, 0x74 /* 80353EF0 00350E50 3B 9C 00 01 */ addi r28, r28, 1 @@ -686,7 +686,7 @@ lbl_80354138: /* 8035413C 0035109C 7F 84 E3 78 */ mr r4, r28 /* 80354140 003510A0 7F C5 F3 78 */ mr r5, r30 /* 80354144 003510A4 7C 60 D2 14 */ add r3, r0, r26 -/* 80354148 003510A8 48 00 09 91 */ bl sub_80354ad8 +/* 80354148 003510A8 48 00 09 91 */ bl BuildAccumulatedTransform__12CVirtualBoneCFRC17CPoseAsTransformsPC9CVector3f /* 8035414C 003510AC 3B 5A 00 74 */ addi r26, r26, 0x74 /* 80354150 003510B0 3B BD 00 01 */ addi r29, r29, 1 lbl_80354154: @@ -814,10 +814,10 @@ __ct__10CSkinRulesFR12CInputStream: /* 803542EC 0035124C 7C 7E 1B 78 */ mr r30, r3 /* 803542F0 00351250 48 00 00 51 */ bl "__ct__Q24rstl49vector<12CVirtualBone,Q24rstl17rmemory_allocator>FR12CInputStreamRCQ24rstl17rmemory_allocator" /* 803542F4 00351254 7F E3 FB 78 */ mr r3, r31 -/* 803542F8 00351258 48 00 02 45 */ bl sub_8035453c +/* 803542F8 00351258 48 00 02 45 */ bl StreamFloatToShort__FR12CInputStream /* 803542FC 0035125C 90 7E 00 10 */ stw r3, 0x10(r30) /* 80354300 00351260 7F E3 FB 78 */ mr r3, r31 -/* 80354304 00351264 48 00 02 39 */ bl sub_8035453c +/* 80354304 00351264 48 00 02 39 */ bl StreamFloatToShort__FR12CInputStream /* 80354308 00351268 90 7E 00 14 */ stw r3, 0x14(r30) /* 8035430C 0035126C 7F C3 F3 78 */ mr r3, r30 /* 80354310 00351270 80 1E 00 04 */ lwz r0, 4(r30) @@ -981,8 +981,8 @@ lbl_803544BC: /* 80354534 00351494 38 21 00 10 */ addi r1, r1, 0x10 /* 80354538 00351498 4E 80 00 20 */ blr -.global sub_8035453c -sub_8035453c: +.global StreamFloatToShort__FR12CInputStream +StreamFloatToShort__FR12CInputStream: /* 8035453C 0035149C 94 21 FC D0 */ stwu r1, -0x330(r1) /* 80354540 003514A0 7C 08 02 A6 */ mflr r0 /* 80354544 003514A4 90 01 03 34 */ stw r0, 0x334(r1) @@ -1119,6 +1119,65 @@ lbl_803546F0: /* 80354704 00351664 38 21 00 30 */ addi r1, r1, 0x30 /* 80354708 00351668 4E 80 00 20 */ blr +.global sub_8035470c +sub_8035470c: +/* 8035470C 0035166C 94 21 FF E0 */ stwu r1, -0x20(r1) +/* 80354710 00351670 7C 08 02 A6 */ mflr r0 +/* 80354714 00351674 90 01 00 24 */ stw r0, 0x24(r1) +/* 80354718 00351678 93 E1 00 1C */ stw r31, 0x1c(r1) +/* 8035471C 0035167C 93 C1 00 18 */ stw r30, 0x18(r1) +/* 80354720 00351680 7C BE 2B 78 */ mr r30, r5 +/* 80354724 00351684 93 A1 00 14 */ stw r29, 0x14(r1) +/* 80354728 00351688 7C 9D 23 78 */ mr r29, r4 +/* 8035472C 0035168C 83 E3 00 00 */ lwz r31, 0(r3) +/* 80354730 00351690 48 00 00 78 */ b lbl_803547A8 +lbl_80354734: +/* 80354734 00351694 28 1E 00 00 */ cmplwi r30, 0 +/* 80354738 00351698 41 82 00 68 */ beq lbl_803547A0 +/* 8035473C 0035169C 80 1F 00 00 */ lwz r0, 0(r31) +/* 80354740 003516A0 38 9E 00 04 */ addi r4, r30, 4 +/* 80354744 003516A4 38 7F 00 04 */ addi r3, r31, 4 +/* 80354748 003516A8 90 1E 00 00 */ stw r0, 0(r30) +/* 8035474C 003516AC 80 1E 00 00 */ lwz r0, 0(r30) +/* 80354750 003516B0 7C 09 03 A6 */ mtctr r0 +/* 80354754 003516B4 2C 00 00 00 */ cmpwi r0, 0 +/* 80354758 003516B8 40 81 00 28 */ ble lbl_80354780 +lbl_8035475C: +/* 8035475C 003516BC 28 04 00 00 */ cmplwi r4, 0 +/* 80354760 003516C0 41 82 00 14 */ beq lbl_80354774 +/* 80354764 003516C4 88 03 00 00 */ lbz r0, 0(r3) +/* 80354768 003516C8 98 04 00 00 */ stb r0, 0(r4) +/* 8035476C 003516CC C0 03 00 04 */ lfs f0, 4(r3) +/* 80354770 003516D0 D0 04 00 04 */ stfs f0, 4(r4) +lbl_80354774: +/* 80354774 003516D4 38 84 00 08 */ addi r4, r4, 8 +/* 80354778 003516D8 38 63 00 08 */ addi r3, r3, 8 +/* 8035477C 003516DC 42 00 FF E0 */ bdnz lbl_8035475C +lbl_80354780: +/* 80354780 003516E0 80 1F 00 1C */ lwz r0, 0x1c(r31) +/* 80354784 003516E4 38 7E 00 20 */ addi r3, r30, 0x20 +/* 80354788 003516E8 38 9F 00 20 */ addi r4, r31, 0x20 +/* 8035478C 003516EC 90 1E 00 1C */ stw r0, 0x1c(r30) +/* 80354790 003516F0 4B FB E3 E5 */ bl __ct__12CTransform4fFRC12CTransform4f +/* 80354794 003516F4 38 7E 00 50 */ addi r3, r30, 0x50 +/* 80354798 003516F8 38 9F 00 50 */ addi r4, r31, 0x50 +/* 8035479C 003516FC 4B FB B8 89 */ bl __ct__9CMatrix3fFRC9CMatrix3f +lbl_803547A0: +/* 803547A0 00351700 3B DE 00 74 */ addi r30, r30, 0x74 +/* 803547A4 00351704 3B FF 00 74 */ addi r31, r31, 0x74 +lbl_803547A8: +/* 803547A8 00351708 80 1D 00 00 */ lwz r0, 0(r29) +/* 803547AC 0035170C 7C 1F 00 40 */ cmplw r31, r0 +/* 803547B0 00351710 40 82 FF 84 */ bne lbl_80354734 +/* 803547B4 00351714 80 01 00 24 */ lwz r0, 0x24(r1) +/* 803547B8 00351718 7F C3 F3 78 */ mr r3, r30 +/* 803547BC 0035171C 83 E1 00 1C */ lwz r31, 0x1c(r1) +/* 803547C0 00351720 83 C1 00 18 */ lwz r30, 0x18(r1) +/* 803547C4 00351724 83 A1 00 14 */ lwz r29, 0x14(r1) +/* 803547C8 00351728 7C 08 03 A6 */ mtlr r0 +/* 803547CC 0035172C 38 21 00 20 */ addi r1, r1, 0x20 +/* 803547D0 00351730 4E 80 00 20 */ blr + .section .rodata .balign 8 .global lbl_803D8300 diff --git a/asm/Kyoto/Animation/DolphinCVirtualBone.s b/asm/Kyoto/Animation/DolphinCVirtualBone.s index 93448cc3..21974846 100644 --- a/asm/Kyoto/Animation/DolphinCVirtualBone.s +++ b/asm/Kyoto/Animation/DolphinCVirtualBone.s @@ -3,67 +3,8 @@ .section .text, "ax" -.global sub_8035470c -sub_8035470c: -/* 8035470C 0035166C 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 80354710 00351670 7C 08 02 A6 */ mflr r0 -/* 80354714 00351674 90 01 00 24 */ stw r0, 0x24(r1) -/* 80354718 00351678 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 8035471C 0035167C 93 C1 00 18 */ stw r30, 0x18(r1) -/* 80354720 00351680 7C BE 2B 78 */ mr r30, r5 -/* 80354724 00351684 93 A1 00 14 */ stw r29, 0x14(r1) -/* 80354728 00351688 7C 9D 23 78 */ mr r29, r4 -/* 8035472C 0035168C 83 E3 00 00 */ lwz r31, 0(r3) -/* 80354730 00351690 48 00 00 78 */ b lbl_803547A8 -lbl_80354734: -/* 80354734 00351694 28 1E 00 00 */ cmplwi r30, 0 -/* 80354738 00351698 41 82 00 68 */ beq lbl_803547A0 -/* 8035473C 0035169C 80 1F 00 00 */ lwz r0, 0(r31) -/* 80354740 003516A0 38 9E 00 04 */ addi r4, r30, 4 -/* 80354744 003516A4 38 7F 00 04 */ addi r3, r31, 4 -/* 80354748 003516A8 90 1E 00 00 */ stw r0, 0(r30) -/* 8035474C 003516AC 80 1E 00 00 */ lwz r0, 0(r30) -/* 80354750 003516B0 7C 09 03 A6 */ mtctr r0 -/* 80354754 003516B4 2C 00 00 00 */ cmpwi r0, 0 -/* 80354758 003516B8 40 81 00 28 */ ble lbl_80354780 -lbl_8035475C: -/* 8035475C 003516BC 28 04 00 00 */ cmplwi r4, 0 -/* 80354760 003516C0 41 82 00 14 */ beq lbl_80354774 -/* 80354764 003516C4 88 03 00 00 */ lbz r0, 0(r3) -/* 80354768 003516C8 98 04 00 00 */ stb r0, 0(r4) -/* 8035476C 003516CC C0 03 00 04 */ lfs f0, 4(r3) -/* 80354770 003516D0 D0 04 00 04 */ stfs f0, 4(r4) -lbl_80354774: -/* 80354774 003516D4 38 84 00 08 */ addi r4, r4, 8 -/* 80354778 003516D8 38 63 00 08 */ addi r3, r3, 8 -/* 8035477C 003516DC 42 00 FF E0 */ bdnz lbl_8035475C -lbl_80354780: -/* 80354780 003516E0 80 1F 00 1C */ lwz r0, 0x1c(r31) -/* 80354784 003516E4 38 7E 00 20 */ addi r3, r30, 0x20 -/* 80354788 003516E8 38 9F 00 20 */ addi r4, r31, 0x20 -/* 8035478C 003516EC 90 1E 00 1C */ stw r0, 0x1c(r30) -/* 80354790 003516F0 4B FB E3 E5 */ bl __ct__12CTransform4fFRC12CTransform4f -/* 80354794 003516F4 38 7E 00 50 */ addi r3, r30, 0x50 -/* 80354798 003516F8 38 9F 00 50 */ addi r4, r31, 0x50 -/* 8035479C 003516FC 4B FB B8 89 */ bl __ct__9CMatrix3fFRC9CMatrix3f -lbl_803547A0: -/* 803547A0 00351700 3B DE 00 74 */ addi r30, r30, 0x74 -/* 803547A4 00351704 3B FF 00 74 */ addi r31, r31, 0x74 -lbl_803547A8: -/* 803547A8 00351708 80 1D 00 00 */ lwz r0, 0(r29) -/* 803547AC 0035170C 7C 1F 00 40 */ cmplw r31, r0 -/* 803547B0 00351710 40 82 FF 84 */ bne lbl_80354734 -/* 803547B4 00351714 80 01 00 24 */ lwz r0, 0x24(r1) -/* 803547B8 00351718 7F C3 F3 78 */ mr r3, r30 -/* 803547BC 0035171C 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 803547C0 00351720 83 C1 00 18 */ lwz r30, 0x18(r1) -/* 803547C4 00351724 83 A1 00 14 */ lwz r29, 0x14(r1) -/* 803547C8 00351728 7C 08 03 A6 */ mtlr r0 -/* 803547CC 0035172C 38 21 00 20 */ addi r1, r1, 0x20 -/* 803547D0 00351730 4E 80 00 20 */ blr - -.global PSMTXROMultVecArrayGathered -PSMTXROMultVecArrayGathered: +.global PSMTXROMultS16VecArrayGathered__FPA3_fPCUsPVvUl +PSMTXROMultS16VecArrayGathered__FPA3_fPCUsPVvUl: /* 803547D4 00351734 7D 6B 5A 78 */ xor r11, r11, r11 /* 803547D8 00351738 39 6B 00 60 */ addi r11, r11, 0x60 /* 803547DC 0035173C 94 21 FF C0 */ stwu r1, -0x40(r1) @@ -138,8 +79,8 @@ lbl_803548D4: /* 803548E8 00351848 38 21 00 40 */ addi r1, r1, 0x40 /* 803548EC 0035184C 4E 80 00 20 */ blr -.global sub_803548f0 -sub_803548f0: +.global BuildNormals__12CVirtualBoneCFPC9CVector3fP9CVector3fi +BuildNormals__12CVirtualBoneCFPC9CVector3fP9CVector3fi: /* 803548F0 00351850 94 21 FF D0 */ stwu r1, -0x30(r1) /* 803548F4 00351854 7C 08 02 A6 */ mflr r0 /* 803548F8 00351858 90 01 00 34 */ stw r0, 0x34(r1) @@ -215,14 +156,14 @@ lbl_803549D8: /* 803549F0 00351950 D0 01 00 10 */ stfs f0, 0x10(r1) /* 803549F4 00351954 4B FB E8 85 */ bl __ct__12CTransform4fFRC9CMatrix3fRC9CVector3f /* 803549F8 00351958 38 61 00 50 */ addi r3, r1, 0x50 -/* 803549FC 0035195C 48 00 04 79 */ bl nullsub_22 +/* 803549FC 0035195C 48 00 04 79 */ bl TransformToMtx__FRC12CTransform4f /* 80354A00 00351960 38 81 00 20 */ addi r4, r1, 0x20 /* 80354A04 00351964 48 02 8C CD */ bl PSMTXReorder /* 80354A08 00351968 7F C4 F3 78 */ mr r4, r30 /* 80354A0C 0035196C 7F 85 E3 78 */ mr r5, r28 /* 80354A10 00351970 7F A6 EB 78 */ mr r6, r29 /* 80354A14 00351974 38 61 00 20 */ addi r3, r1, 0x20 -/* 80354A18 00351978 4B FF FD BD */ bl PSMTXROMultVecArrayGathered +/* 80354A18 00351978 4B FF FD BD */ bl PSMTXROMultS16VecArrayGathered__FPA3_fPCUsPVvUl lbl_80354A1C: /* 80354A1C 0035197C BB 61 00 8C */ lmw r27, 0x8c(r1) /* 80354A20 00351980 80 01 00 A4 */ lwz r0, 0xa4(r1) @@ -264,14 +205,14 @@ lbl_80354A94: /* 80354A9C 003519FC 48 00 00 28 */ b lbl_80354AC4 lbl_80354AA0: /* 80354AA0 00351A00 38 7B 00 20 */ addi r3, r27, 0x20 -/* 80354AA4 00351A04 48 00 03 D1 */ bl nullsub_22 +/* 80354AA4 00351A04 48 00 03 D1 */ bl TransformToMtx__FRC12CTransform4f /* 80354AA8 00351A08 38 81 00 14 */ addi r4, r1, 0x14 /* 80354AAC 00351A0C 48 02 8C 25 */ bl PSMTXReorder /* 80354AB0 00351A10 7F C4 F3 78 */ mr r4, r30 /* 80354AB4 00351A14 7F 85 E3 78 */ mr r5, r28 /* 80354AB8 00351A18 7F A6 EB 78 */ mr r6, r29 /* 80354ABC 00351A1C 38 61 00 14 */ addi r3, r1, 0x14 -/* 80354AC0 00351A20 4B FF FD 15 */ bl PSMTXROMultVecArrayGathered +/* 80354AC0 00351A20 4B FF FD 15 */ bl PSMTXROMultS16VecArrayGathered__FPA3_fPCUsPVvUl lbl_80354AC4: /* 80354AC4 00351A24 BB 61 00 4C */ lmw r27, 0x4c(r1) /* 80354AC8 00351A28 80 01 00 64 */ lwz r0, 0x64(r1) @@ -279,8 +220,8 @@ lbl_80354AC4: /* 80354AD0 00351A30 38 21 00 60 */ addi r1, r1, 0x60 /* 80354AD4 00351A34 4E 80 00 20 */ blr -.global sub_80354ad8 -sub_80354ad8: +.global BuildAccumulatedTransform__12CVirtualBoneCFRC17CPoseAsTransformsPC9CVector3f +BuildAccumulatedTransform__12CVirtualBoneCFRC17CPoseAsTransformsPC9CVector3f: /* 80354AD8 00351A38 94 21 FF F0 */ stwu r1, -0x10(r1) /* 80354ADC 00351A3C 7C 08 02 A6 */ mflr r0 /* 80354AE0 00351A40 90 01 00 14 */ stw r0, 0x14(r1) @@ -288,7 +229,7 @@ sub_80354ad8: /* 80354AE8 00351A48 7C 9F 23 78 */ mr r31, r4 /* 80354AEC 00351A4C 93 C1 00 08 */ stw r30, 8(r1) /* 80354AF0 00351A50 7C 7E 1B 78 */ mr r30, r3 -/* 80354AF4 00351A54 48 00 00 35 */ bl sub_80354b28 +/* 80354AF4 00351A54 48 00 00 35 */ bl BuildFinalPosMatrix__12CVirtualBoneCFRC17CPoseAsTransformsPC9CVector3f /* 80354AF8 00351A58 7F E3 FB 78 */ mr r3, r31 /* 80354AFC 00351A5C 38 9E 00 04 */ addi r4, r30, 4 /* 80354B00 00351A60 48 01 44 9D */ bl GetRotation__17CPoseAsTransformsCFRC6CSegId @@ -302,8 +243,8 @@ sub_80354ad8: /* 80354B20 00351A80 38 21 00 10 */ addi r1, r1, 0x10 /* 80354B24 00351A84 4E 80 00 20 */ blr -.global sub_80354b28 -sub_80354b28: +.global BuildFinalPosMatrix__12CVirtualBoneCFRC17CPoseAsTransformsPC9CVector3f +BuildFinalPosMatrix__12CVirtualBoneCFRC17CPoseAsTransformsPC9CVector3f: /* 80354B28 00351A88 94 21 FF 40 */ stwu r1, -0xc0(r1) /* 80354B2C 00351A8C 7C 08 02 A6 */ mflr r0 /* 80354B30 00351A90 90 01 00 C4 */ stw r0, 0xc4(r1) @@ -339,7 +280,7 @@ lbl_80354B84: /* 80354BA0 00351B00 38 7D 00 20 */ addi r3, r29, 0x20 /* 80354BA4 00351B04 1C 00 00 0C */ mulli r0, r0, 0xc /* 80354BA8 00351B08 7C BF 02 14 */ add r5, r31, r0 -/* 80354BAC 00351B0C 48 00 02 81 */ bl TransformFromMatrixData +/* 80354BAC 00351B0C 48 00 02 81 */ bl TransformFromMatrixDelta__FP12CTransform4fPC9CMatrix3fPC9CVector3f /* 80354BB0 00351B10 48 00 01 A4 */ b lbl_80354D54 lbl_80354BB4: /* 80354BB4 00351B14 3B 9D 00 04 */ addi r28, r29, 4 @@ -365,7 +306,7 @@ lbl_80354BB4: /* 80354C04 00351B64 1C 00 00 0C */ mulli r0, r0, 0xc /* 80354C08 00351B68 7C BF 2A 14 */ add r5, r31, r5 /* 80354C0C 00351B6C 7C FF 02 14 */ add r7, r31, r0 -/* 80354C10 00351B70 48 00 01 71 */ bl Transform2FromMatrixData +/* 80354C10 00351B70 48 00 01 71 */ bl Transform2FromMatrixData__FP12CTransform4fPC9CMatrix3fPC9CVector3ffPC9CMatrix3fPC9CVector3ff /* 80354C14 00351B74 48 00 01 40 */ b lbl_80354D54 lbl_80354C18: /* 80354C18 00351B78 3B 9D 00 04 */ addi r28, r29, 4 @@ -461,8 +402,8 @@ lbl_80354D54: /* 80354D78 00351CD8 38 21 00 C0 */ addi r1, r1, 0xc0 /* 80354D7C 00351CDC 4E 80 00 20 */ blr -.global Transform2FromMatrixData -Transform2FromMatrixData: +.global Transform2FromMatrixData__FP12CTransform4fPC9CMatrix3fPC9CVector3ffPC9CMatrix3fPC9CVector3ff +Transform2FromMatrixData__FP12CTransform4fPC9CMatrix3fPC9CVector3ffPC9CMatrix3fPC9CVector3ff: /* 80354D80 00351CE0 FC 80 08 90 */ fmr f4, f1 /* 80354D84 00351CE4 E0 04 00 00 */ psq_l f0, 0(r4), 0, qr0 /* 80354D88 00351CE8 E0 A5 00 00 */ psq_l f5, 0(r5), 0, qr0 @@ -507,8 +448,8 @@ Transform2FromMatrixData: /* 80354E24 00351D84 F0 A3 00 28 */ psq_st f5, 40(r3), 0, qr0 /* 80354E28 00351D88 4E 80 00 20 */ blr -.global TransformFromMatrixData -TransformFromMatrixData: +.global TransformFromMatrixDelta__FP12CTransform4fPC9CMatrix3fPC9CVector3f +TransformFromMatrixDelta__FP12CTransform4fPC9CMatrix3fPC9CVector3f: /* 80354E2C 00351D8C E0 05 00 00 */ psq_l f0, 0(r5), 0, qr0 /* 80354E30 00351D90 E0 24 80 08 */ psq_l f1, 8(r4), 1, qr0 /* 80354E34 00351D94 E0 64 80 14 */ psq_l f3, 20(r4), 1, qr0 @@ -528,8 +469,8 @@ TransformFromMatrixData: /* 80354E6C 00351DCC F0 A3 00 28 */ psq_st f5, 40(r3), 0, qr0 /* 80354E70 00351DD0 4E 80 00 20 */ blr -.global nullsub_22 -nullsub_22: +.global TransformToMtx__FRC12CTransform4f +TransformToMtx__FRC12CTransform4f: /* 80354E74 00351DD4 4E 80 00 20 */ blr .global __ct__12CVirtualBoneFR12CInputStream diff --git a/configure.py b/configure.py index ee80cb1c..aba395ed 100755 --- a/configure.py +++ b/configure.py @@ -659,8 +659,8 @@ LIBS = [ ["Kyoto/Alloc/CSmallAllocPool", True], ["Kyoto/Alloc/CGameAllocator", False], "Kyoto/Animation/DolphinCSkinnedModel", - "Kyoto/Animation/DolphinCSkinRules", - "Kyoto/Animation/DolphinCVirtualBone", + ["Kyoto/Animation/DolphinCSkinRules", False], + ["Kyoto/Animation/DolphinCVirtualBone", False], "Kyoto/Graphics/DolphinCModel", ["Kyoto/Text/CStringTable", True], "Kyoto/Particles/CEmitterElement", diff --git a/include/Kyoto/Animation/CPoseAsTransforms.hpp b/include/Kyoto/Animation/CPoseAsTransforms.hpp new file mode 100644 index 00000000..63873ac4 --- /dev/null +++ b/include/Kyoto/Animation/CPoseAsTransforms.hpp @@ -0,0 +1,26 @@ +#ifndef _CPOSEASTRANSFORMS +#define _CPOSEASTRANSFORMS + +#include "types.h" + +#include "MetroidPrime/TGameTypes.hpp" + +#include "Kyoto/Math/CTransform4f.hpp" + +#include "rstl/reserved_vector.hpp" +#include "rstl/single_ptr.hpp" + +class CPoseAsTransforms { +public: + const CMatrix3f& GetRotation(const CSegId& id) const; +private: + CSegId x0_nextId; + CSegId x1_count; + // TODO TSegIdMapVariableSize + rstl::reserved_vector< rstl::pair< CSegId, CSegId >, 100 > x4_links; + rstl::single_ptr< CTransform4f > xd0_transformArr; + CSegId xd4_lastInserted; +}; +CHECK_SIZEOF(CPoseAsTransforms, 0xd8) + +#endif // _CPOSEASTRANSFORMS diff --git a/include/Kyoto/Animation/CSkinRules.hpp b/include/Kyoto/Animation/CSkinRules.hpp new file mode 100644 index 00000000..94fa83b8 --- /dev/null +++ b/include/Kyoto/Animation/CSkinRules.hpp @@ -0,0 +1,18 @@ +#ifndef _CSKINRULES +#define _CSKINRULES + +#include "Kyoto/Animation/CVirtualBone.hpp" + +class CInputStream; +class CSkinRules { +public: + CSkinRules(CInputStream& in); + ~CSkinRules(); + +private: + rstl::vector x0_virtualBones; + uint x10_vertexCount; + uint x14_normalCount; +}; + +#endif // _CSKINRULES diff --git a/include/Kyoto/Animation/CVirtualBone.hpp b/include/Kyoto/Animation/CVirtualBone.hpp new file mode 100644 index 00000000..055ef529 --- /dev/null +++ b/include/Kyoto/Animation/CVirtualBone.hpp @@ -0,0 +1,34 @@ +#ifndef _CVIRTUALBONE +#define _CVIRTUALBONE + +#include "Kyoto/Animation/CSegId.hpp" +#include "Kyoto/Math/CMatrix3f.hpp" +#include "Kyoto/Math/CTransform4f.hpp" + +struct SSkinWeighting { + CSegId x0_id; + float x4_weight; + explicit SSkinWeighting(CInputStream& in) : x0_id(in), x4_weight(in.ReadFloat()) {} +}; + +class CPoseAsTransforms; +class CVirtualBone { +public: + explicit CVirtualBone(CInputStream& in); + const rstl::reserved_vector< SSkinWeighting, 3 >& GetWeights() const { return x0_weights; } + uint GetVertexCount() const { return x1c_vertexCount; } + + void BuildPoints(const ushort*, volatile void*, int) const; + void BuildNormals(const ushort*, volatile void*, int) const; + void BuildNormals(const CVector3f*, CVector3f*, int) const; + void BuildAccumulatedTransform(const CPoseAsTransforms& pose, const CVector3f* points) const; + void BuildFinalPosMatrix(const CPoseAsTransforms& pose, const CVector3f* points) const; + +private: + rstl::reserved_vector< SSkinWeighting, 3 > x0_weights; + uint x1c_vertexCount; + mutable CTransform4f x20_xf; + mutable CMatrix3f x50_rotation; +}; + +#endif // _CVIRTUALBONE diff --git a/include/Kyoto/Graphics/CModel.hpp b/include/Kyoto/Graphics/CModel.hpp index b2a09173..940645b2 100644 --- a/include/Kyoto/Graphics/CModel.hpp +++ b/include/Kyoto/Graphics/CModel.hpp @@ -4,10 +4,14 @@ class CModelFlags; class CModel { + static uint sTotalMemory; public: void Touch(int) const; void Draw(const CModelFlags&) const; bool IsLoaded(int matIdx) const; + + static void AddToTotal(uint amt) { sTotalMemory += amt; } + static void RemoveFromTotal(uint amt) { sTotalMemory -= amt; } }; #endif // _CMODEL diff --git a/include/MetroidPrime/CPoseAsTransforms.hpp b/include/MetroidPrime/CPoseAsTransforms.hpp index 79366412..df0b825b 100644 --- a/include/MetroidPrime/CPoseAsTransforms.hpp +++ b/include/MetroidPrime/CPoseAsTransforms.hpp @@ -3,14 +3,13 @@ #include "types.h" -#include "MetroidPrime/TGameTypes.hpp" - #include "Kyoto/Math/CTransform4f.hpp" #include "rstl/reserved_vector.hpp" #include "rstl/single_ptr.hpp" class CPoseAsTransforms { +public: private: CSegId x0_nextId; CSegId x1_count; diff --git a/src/Kyoto/Animation/DolphinCSkinRules.cpp b/src/Kyoto/Animation/DolphinCSkinRules.cpp new file mode 100644 index 00000000..389c1e77 --- /dev/null +++ b/src/Kyoto/Animation/DolphinCSkinRules.cpp @@ -0,0 +1,29 @@ +#include "Kyoto/Animation/CSkinRules.hpp" +#include "Kyoto/Graphics/CModel.hpp" +#include "rstl/math.hpp" + +int StreamFloatToShort(CInputStream& in) { + int result = in.ReadLong(); + if (result == -1) { + return in.ReadLong(); + } + uchar junk[780]; + for (int i = 0; i < (result * 3);) { + int iVar2 = rstl::min_val(((result * 3) - i), 192); + in.Get(junk, iVar2 * 4); + i += iVar2; + } + return result; +} + +CSkinRules::CSkinRules(CInputStream& in) +: x0_virtualBones(in) +, x10_vertexCount(StreamFloatToShort(in)) +, x14_normalCount(StreamFloatToShort(in)) { + + CModel::AddToTotal(x0_virtualBones.size() * sizeof(CVirtualBone) + sizeof(CSkinRules)); +} + +CSkinRules::~CSkinRules() { + CModel::RemoveFromTotal(x0_virtualBones.size() * sizeof(CVirtualBone) + sizeof(CSkinRules)); +} diff --git a/src/Kyoto/Animation/DolphinCVirtualBone.cpp b/src/Kyoto/Animation/DolphinCVirtualBone.cpp new file mode 100644 index 00000000..80859f87 --- /dev/null +++ b/src/Kyoto/Animation/DolphinCVirtualBone.cpp @@ -0,0 +1,51 @@ +#include "Kyoto/Animation/CVirtualBone.hpp" +#include "Kyoto/Animation/CPoseAsTransforms.hpp" + +#include "rstl/math.hpp" + +static rstl::reserved_vector< SSkinWeighting, 3 > StreamInSkinWeighting(CInputStream& in) { + rstl::reserved_vector< SSkinWeighting, 3 > weights; + int weightCount = in.Get< uint >(); + + if (weightCount > 3) { + for (int i = 0; i < 3; ++i) { + weights.push_back(SSkinWeighting(in)); + } + + for (int i = 3; i < weightCount; ++i) { + SSkinWeighting tmp(in); + } + } else { + for (int i = 0; i < weightCount; ++i) { + weights.push_back(SSkinWeighting(in)); + } + } + return weights; +} + +CVirtualBone::CVirtualBone(CInputStream& in) +: x0_weights(StreamInSkinWeighting(in)) +, x1c_vertexCount(in.ReadLong()) +, x20_xf(CTransform4f::Identity()) +, x50_rotation(CMatrix3f::Identity()) {} + +ConstMtxPtr TransformToMtx(const CTransform4f& xf) { return xf.GetCStyleMatrix(); } + +void TransformFromMatrixDelta(register CTransform4f* xf, register const CMatrix3f* rot, + register const CVector3f* point) { +} + +void Transform2FromMatrixData(register CTransform4f* r3, register const CMatrix3f* r4, + register const CVector3f* r5, register float _f1, + register const CMatrix3f* r6, register const CVector3f* r7, + register float _f2) { +} + + +void CVirtualBone::BuildFinalPosMatrix(const CPoseAsTransforms&, const CVector3f*) const { + +} +void CVirtualBone::BuildAccumulatedTransform(const CPoseAsTransforms& pose, const CVector3f* points) const { + BuildFinalPosMatrix(pose, points); + x50_rotation = pose.GetRotation(x0_weights[0].x0_id); +}