diff --git a/asm/Dolphin/gx/GXFifo.s b/asm/Dolphin/gx/GXFifo.s index d9fca0b7..95c3f567 100644 --- a/asm/Dolphin/gx/GXFifo.s +++ b/asm/Dolphin/gx/GXFifo.s @@ -345,8 +345,8 @@ lbl_803766F0: /* 80376718 00373678 7C 08 03 A6 */ mtlr r0 /* 8037671C 0037367C 4E 80 00 20 */ blr -.global __GXSaveCPUFifoAux -__GXSaveCPUFifoAux: +.global GXGetFifoPtrs +GXGetFifoPtrs: /* 80376720 00373680 80 0D AC 88 */ lwz r0, lbl_805A9848@sda21(r13) /* 80376724 00373684 7C 03 00 40 */ cmplw r3, r0 /* 80376728 00373688 40 82 00 18 */ bne lbl_80376740 @@ -829,4 +829,3 @@ lbl_80376DA0: /* 80376DB4 00373D14 38 21 00 18 */ addi r1, r1, 0x18 /* 80376DB8 00373D18 7C 08 03 A6 */ mtlr r0 /* 80376DBC 00373D1C 4E 80 00 20 */ blr - diff --git a/asm/Kyoto/CFrameDelayedKiller.s b/asm/Kyoto/CFrameDelayedKiller.s index 682a8fce..7fdc2191 100644 --- a/asm/Kyoto/CFrameDelayedKiller.s +++ b/asm/Kyoto/CFrameDelayedKiller.s @@ -125,8 +125,8 @@ sub_8036cb78: /* 8036CB88 00369AE8 90 03 00 08 */ stw r0, 8(r3) /* 8036CB8C 00369AEC 4E 80 00 20 */ blr -.global sub_8036cb90 -sub_8036cb90: +.global sub_8036cb90__19CFrameDelayedKillerFv +sub_8036cb90__19CFrameDelayedKillerFv: /* 8036CB90 00369AF0 94 21 FF E0 */ stwu r1, -0x20(r1) /* 8036CB94 00369AF4 7C 08 02 A6 */ mflr r0 /* 8036CB98 00369AF8 3C 60 80 54 */ lis r3, lbl_80540A4C@ha @@ -250,7 +250,7 @@ sub_8036cd20: /* 8036CD2C 00369C8C 93 E1 00 0C */ stw r31, 0xc(r1) /* 8036CD30 00369C90 3B E0 00 00 */ li r31, 0 lbl_8036CD34: -/* 8036CD34 00369C94 4B FF FE 5D */ bl sub_8036cb90 +/* 8036CD34 00369C94 4B FF FE 5D */ bl sub_8036cb90__19CFrameDelayedKillerFv /* 8036CD38 00369C98 3B FF 00 01 */ addi r31, r31, 1 /* 8036CD3C 00369C9C 2C 1F 00 02 */ cmpwi r31, 2 /* 8036CD40 00369CA0 41 80 FF F4 */ blt lbl_8036CD34 diff --git a/asm/Kyoto/Graphics/CCubeMoviePlayer.s b/asm/Kyoto/Graphics/CCubeMoviePlayer.s index 2d074fec..411b85c0 100644 --- a/asm/Kyoto/Graphics/CCubeMoviePlayer.s +++ b/asm/Kyoto/Graphics/CCubeMoviePlayer.s @@ -2456,7 +2456,7 @@ MyTHPGXYuv2RgbSetup__Fb: /* 8035D2EC 0035A24C 90 E1 00 68 */ stw r7, 0x68(r1) /* 8035D2F0 0035A250 90 C1 00 6C */ stw r6, 0x6c(r1) /* 8035D2F4 0035A254 90 01 00 70 */ stw r0, 0x70(r1) -/* 8035D2F8 0035A258 4B FA B5 85 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8035D2F8 0035A258 4B FA B5 85 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8035D2FC 0035A25C 38 60 00 00 */ li r3, 0 /* 8035D300 0035A260 38 80 00 01 */ li r4, 1 /* 8035D304 0035A264 38 A0 00 00 */ li r5, 0 @@ -2771,7 +2771,7 @@ MyTHPGXRestore__Fv: /* 8035D7BC 0035A71C 38 80 00 07 */ li r4, 7 /* 8035D7C0 0035A720 90 01 00 14 */ stw r0, 0x14(r1) /* 8035D7C4 0035A724 38 A0 00 00 */ li r5, 0 -/* 8035D7C8 0035A728 4B FA B0 B5 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8035D7C8 0035A728 4B FA B0 B5 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8035D7CC 0035A72C 38 60 00 00 */ li r3, 0 /* 8035D7D0 0035A730 38 80 00 01 */ li r4, 1 /* 8035D7D4 0035A734 38 A0 00 00 */ li r5, 0 diff --git a/asm/Kyoto/Graphics/CGX.s b/asm/Kyoto/Graphics/CGX.s index 30221a9c..5b6d1b6d 100644 --- a/asm/Kyoto/Graphics/CGX.s +++ b/asm/Kyoto/Graphics/CGX.s @@ -951,8 +951,8 @@ lbl_80308868: /* 80308874 003057D4 38 21 00 10 */ addi r1, r1, 0x10 /* 80308878 003057D8 4E 80 00 20 */ blr -.global SetZMode__3CGXFb10_GXCompareb -SetZMode__3CGXFb10_GXCompareb: +.global SetZMode__3CGXFUi10_GXCompareUi +SetZMode__3CGXFUi10_GXCompareUi: /* 8030887C 003057DC 94 21 FF F0 */ stwu r1, -0x10(r1) /* 80308880 003057E0 7C 08 02 A6 */ mflr r0 /* 80308884 003057E4 3C C0 80 5A */ lis r6, sGXState__3CGX@ha @@ -1465,4 +1465,3 @@ lbl_803D73B8: .4byte 0x00000003 .4byte 0x000000FF .4byte 0 - diff --git a/asm/Kyoto/Graphics/DolphinCGraphics.s b/asm/Kyoto/Graphics/DolphinCGraphics.s index 87d03ca3..c4e696c4 100644 --- a/asm/Kyoto/Graphics/DolphinCGraphics.s +++ b/asm/Kyoto/Graphics/DolphinCGraphics.s @@ -3159,7 +3159,7 @@ SetDepthWriteMode__9CGraphicsFb8ERglEnumb: /* 8030BAA0 00308A00 54 A5 06 3E */ clrlwi r5, r5, 0x18 /* 8030BAA4 00308A04 90 01 00 14 */ stw r0, 0x14(r1) /* 8030BAA8 00308A08 90 8D 9C 70 */ stw r4, mDepthFunc__9CGraphics@sda21(r13) -/* 8030BAAC 00308A0C 4B FF CD D1 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8030BAAC 00308A0C 4B FF CD D1 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8030BAB0 00308A10 80 01 00 14 */ lwz r0, 0x14(r1) /* 8030BAB4 00308A14 7C 08 03 A6 */ mtlr r0 /* 8030BAB8 00308A18 38 21 00 10 */ addi r1, r1, 0x10 @@ -3176,7 +3176,7 @@ EndScene__9CGraphicsFv: /* 8030BAD8 00308A38 93 E1 00 9C */ stw r31, 0x9c(r1) /* 8030BADC 00308A3C 93 C1 00 98 */ stw r30, 0x98(r1) /* 8030BAE0 00308A40 93 A1 00 94 */ stw r29, 0x94(r1) -/* 8030BAE4 00308A44 4B FF CD 99 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8030BAE4 00308A44 4B FF CD 99 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8030BAE8 00308A48 3B AD A8 0C */ addi r29, r13, mNumBreakpointsWaiting__9CGraphics@sda21 /* 8030BAEC 00308A4C 48 00 00 08 */ b lbl_8030BAF4 lbl_8030BAF0: @@ -3311,7 +3311,7 @@ lbl_8030BB40: /* 8030BCE8 00308C48 48 06 AE 45 */ bl GXGetGPFifo /* 8030BCEC 00308C4C 38 81 00 0C */ addi r4, r1, 0xc /* 8030BCF0 00308C50 38 A1 00 08 */ addi r5, r1, 8 -/* 8030BCF4 00308C54 48 06 AA 2D */ bl __GXSaveCPUFifoAux +/* 8030BCF4 00308C54 48 06 AA 2D */ bl GXGetFifoPtrs /* 8030BCF8 00308C58 80 61 00 08 */ lwz r3, 8(r1) /* 8030BCFC 00308C5C 48 06 AB 01 */ bl GXEnableBreakPt /* 8030BD00 00308C60 80 6D A8 00 */ lwz r3, mFrameCounter__9CGraphics@sda21(r13) @@ -3319,7 +3319,7 @@ lbl_8030BB40: /* 8030BD08 00308C68 38 03 00 01 */ addi r0, r3, 1 /* 8030BD0C 00308C6C 98 8D A8 14 */ stb r4, mLastFrameUsedAbove__9CGraphics@sda21(r13) /* 8030BD10 00308C70 90 0D A8 00 */ stw r0, mFrameCounter__9CGraphics@sda21(r13) -/* 8030BD14 00308C74 48 06 0E 7D */ bl sub_8036cb90 +/* 8030BD14 00308C74 48 06 0E 7D */ bl sub_8036cb90__19CFrameDelayedKillerFv /* 8030BD18 00308C78 80 01 00 A4 */ lwz r0, 0xa4(r1) /* 8030BD1C 00308C7C 83 E1 00 9C */ lwz r31, 0x9c(r1) /* 8030BD20 00308C80 83 C1 00 98 */ lwz r30, 0x98(r1) diff --git a/asm/Kyoto/Particles/CElementGen.s b/asm/Kyoto/Particles/CElementGen.s index bee5a2c6..70c83f4d 100644 --- a/asm/Kyoto/Particles/CElementGen.s +++ b/asm/Kyoto/Particles/CElementGen.s @@ -2197,7 +2197,7 @@ RenderParticlesIndirectTexture__11CElementGenFv: /* 80319408 00316368 38 60 00 01 */ li r3, 1 /* 8031940C 0031636C 38 80 00 03 */ li r4, 3 /* 80319410 00316370 38 A0 00 00 */ li r5, 0 -/* 80319414 00316374 4B FE F4 69 */ bl SetZMode__3CGXFb10_GXCompareb +/* 80319414 00316374 4B FE F4 69 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80319418 00316378 38 60 00 01 */ li r3, 1 /* 8031941C 0031637C 38 80 00 04 */ li r4, 4 /* 80319420 00316380 38 A0 00 01 */ li r5, 1 @@ -2208,7 +2208,7 @@ lbl_80319430: /* 80319430 00316390 54 65 E7 FE */ rlwinm r5, r3, 0x1c, 0x1f, 0x1f /* 80319434 00316394 38 60 00 01 */ li r3, 1 /* 80319438 00316398 38 80 00 03 */ li r4, 3 -/* 8031943C 0031639C 4B FE F4 41 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8031943C 0031639C 4B FE F4 41 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80319440 003163A0 38 60 00 01 */ li r3, 1 /* 80319444 003163A4 38 80 00 04 */ li r4, 4 /* 80319448 003163A8 38 A0 00 05 */ li r5, 5 diff --git a/asm/MetaRender/CCubeRenderer.s b/asm/MetaRender/CCubeRenderer.s index e6e6c005..02b8f1d5 100644 --- a/asm/MetaRender/CCubeRenderer.s +++ b/asm/MetaRender/CCubeRenderer.s @@ -939,7 +939,7 @@ lbl_802B6568: /* 802B6700 002B3660 38 60 00 00 */ li r3, 0 /* 802B6704 002B3664 38 80 00 07 */ li r4, 7 /* 802B6708 002B3668 38 A0 00 00 */ li r5, 0 -/* 802B670C 002B366C 48 05 21 71 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B670C 002B366C 48 05 21 71 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B6710 002B3670 38 60 00 00 */ li r3, 0 /* 802B6714 002B3674 48 0C 24 45 */ bl GXSetCullMode /* 802B6718 002B3678 38 60 00 01 */ li r3, 1 @@ -2684,7 +2684,7 @@ lbl_802B801C: /* 802B8030 002B4F90 38 80 00 03 */ li r4, 3 lbl_802B8034: /* 802B8034 002B4F94 54 A5 FF FE */ rlwinm r5, r5, 0x1f, 0x1f, 0x1f -/* 802B8038 002B4F98 48 05 08 45 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B8038 002B4F98 48 05 08 45 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B803C 002B4F9C 38 60 00 01 */ li r3, 1 /* 802B8040 002B4FA0 48 05 0C 51 */ bl SetNumTevStages__3CGXFUc /* 802B8044 002B4FA4 38 60 00 01 */ li r3, 1 @@ -2992,7 +2992,7 @@ DrawModelDisintegrate__13CCubeRendererFRC6CModelRC8CTextureRC6CColorPCfPCf: /* 802B84EC 002B544C 38 60 00 01 */ li r3, 1 /* 802B84F0 002B5450 38 80 00 03 */ li r4, 3 /* 802B84F4 002B5454 38 A0 00 01 */ li r5, 1 -/* 802B84F8 002B5458 48 05 03 85 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B84F8 002B5458 48 05 03 85 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B84FC 002B545C 7F A3 EB 78 */ mr r3, r29 /* 802B8500 002B5460 48 09 CC 21 */ bl UpdateLastFrame__6CModelFv /* 802B8504 002B5464 80 7D 00 28 */ lwz r3, 0x28(r29) @@ -3162,7 +3162,7 @@ sub_802b85cc: /* 802B877C 002B56DC 7C 00 00 34 */ cntlzw r0, r0 /* 802B8780 002B56E0 54 63 D9 7E */ srwi r3, r3, 5 /* 802B8784 002B56E4 54 05 D9 7E */ srwi r5, r0, 5 -/* 802B8788 002B56E8 48 05 00 F5 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B8788 002B56E8 48 05 00 F5 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B878C 002B56EC A0 1F 00 02 */ lhz r0, 2(r31) /* 802B8790 002B56F0 7F 83 E3 78 */ mr r3, r28 /* 802B8794 002B56F4 7F A4 EB 78 */ mr r4, r29 @@ -4515,7 +4515,7 @@ lbl_802B9A98: /* 802B9AC8 002B6A28 38 60 00 01 */ li r3, 1 /* 802B9ACC 002B6A2C 38 80 00 03 */ li r4, 3 /* 802B9AD0 002B6A30 38 A0 00 01 */ li r5, 1 -/* 802B9AD4 002B6A34 48 04 ED A9 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B9AD4 002B6A34 48 04 ED A9 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B9AD8 002B6A38 38 60 00 01 */ li r3, 1 /* 802B9ADC 002B6A3C 48 04 F1 B5 */ bl SetNumTevStages__3CGXFUc /* 802B9AE0 002B6A40 38 60 00 01 */ li r3, 1 @@ -4548,7 +4548,7 @@ lbl_802B9A98: /* 802B9B4C 002B6AAC 38 60 00 00 */ li r3, 0 /* 802B9B50 002B6AB0 38 80 00 07 */ li r4, 7 /* 802B9B54 002B6AB4 38 A0 00 00 */ li r5, 0 -/* 802B9B58 002B6AB8 48 04 ED 25 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B9B58 002B6AB8 48 04 ED 25 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B9B5C 002B6ABC 7F 43 D3 78 */ mr r3, r26 /* 802B9B60 002B6AC0 7F 64 DB 78 */ mr r4, r27 /* 802B9B64 002B6AC4 7F E6 FB 78 */ mr r6, r31 @@ -4558,7 +4558,7 @@ lbl_802B9A98: /* 802B9B74 002B6AD4 38 60 00 01 */ li r3, 1 /* 802B9B78 002B6AD8 38 80 00 03 */ li r4, 3 /* 802B9B7C 002B6ADC 38 A0 00 01 */ li r5, 1 -/* 802B9B80 002B6AE0 48 04 EC FD */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B9B80 002B6AE0 48 04 EC FD */ bl SetZMode__3CGXFUi10_GXCompareUi lbl_802B9B84: /* 802B9B84 002B6AE4 38 60 00 01 */ li r3, 1 /* 802B9B88 002B6AE8 38 80 00 00 */ li r4, 0 @@ -4586,7 +4586,7 @@ lbl_802B9B84: /* 802B9BE0 002B6B40 38 60 00 01 */ li r3, 1 /* 802B9BE4 002B6B44 38 80 00 04 */ li r4, 4 /* 802B9BE8 002B6B48 38 A0 00 00 */ li r5, 0 -/* 802B9BEC 002B6B4C 48 04 EC 91 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B9BEC 002B6B4C 48 04 EC 91 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B9BF0 002B6B50 7F 43 D3 78 */ mr r3, r26 /* 802B9BF4 002B6B54 7F 64 DB 78 */ mr r4, r27 /* 802B9BF8 002B6B58 7F E6 FB 78 */ mr r6, r31 @@ -4596,7 +4596,7 @@ lbl_802B9B84: /* 802B9C08 002B6B68 38 60 00 01 */ li r3, 1 /* 802B9C0C 002B6B6C 38 80 00 03 */ li r4, 3 /* 802B9C10 002B6B70 38 A0 00 01 */ li r5, 1 -/* 802B9C14 002B6B74 48 04 EC 69 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B9C14 002B6B74 48 04 EC 69 */ bl SetZMode__3CGXFUi10_GXCompareUi lbl_802B9C18: /* 802B9C18 002B6B78 80 61 03 28 */ lwz r3, 0x328(r1) /* 802B9C1C 002B6B7C 38 80 00 00 */ li r4, 0 @@ -4691,7 +4691,7 @@ lbl_802B9C18: /* 802B9D80 002B6CE0 38 60 00 00 */ li r3, 0 /* 802B9D84 002B6CE4 38 80 00 07 */ li r4, 7 /* 802B9D88 002B6CE8 38 A0 00 00 */ li r5, 0 -/* 802B9D8C 002B6CEC 48 04 EA F1 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802B9D8C 002B6CEC 48 04 EA F1 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802B9D90 002B6CF0 38 60 00 00 */ li r3, 0 /* 802B9D94 002B6CF4 48 0B ED C5 */ bl GXSetCullMode /* 802B9D98 002B6CF8 38 60 00 00 */ li r3, 0 @@ -5205,7 +5205,7 @@ DoThermalBlendHot__13CCubeRendererFv: /* 802BA4F8 002B7458 38 A0 00 01 */ li r5, 1 /* 802BA4FC 002B745C 83 E6 00 08 */ lwz r31, 8(r6) /* 802BA500 002B7460 83 C6 00 0C */ lwz r30, 0xc(r6) -/* 802BA504 002B7464 48 04 E3 79 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802BA504 002B7464 48 04 E3 79 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802BA508 002B7468 57 A3 04 3E */ clrlwi r3, r29, 0x10 /* 802BA50C 002B746C 57 84 04 3E */ clrlwi r4, r28, 0x10 /* 802BA510 002B7470 57 E5 04 3E */ clrlwi r5, r31, 0x10 @@ -5269,7 +5269,7 @@ DoThermalBlendHot__13CCubeRendererFv: /* 802BA5F8 002B7558 38 60 00 00 */ li r3, 0 /* 802BA5FC 002B755C 38 80 00 03 */ li r4, 3 /* 802BA600 002B7560 38 A0 00 00 */ li r5, 0 -/* 802BA604 002B7564 48 04 E2 79 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802BA604 002B7564 48 04 E2 79 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802BA608 002B7568 3C 60 80 3D */ lis r3, lbl_803D6654@ha /* 802BA60C 002B756C 38 63 66 54 */ addi r3, r3, lbl_803D6654@l /* 802BA610 002B7570 48 04 D8 19 */ bl SetVtxDescv__3CGXFPC14_GXVtxDescList @@ -5426,7 +5426,7 @@ DoThermalBlendCold__13CCubeRendererFv: /* 802BA860 002B77C0 38 A0 00 00 */ li r5, 0 /* 802BA864 002B77C4 83 C6 00 08 */ lwz r30, 8(r6) /* 802BA868 002B77C8 83 A6 00 0C */ lwz r29, 0xc(r6) -/* 802BA86C 002B77CC 48 04 E0 11 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802BA86C 002B77CC 48 04 E0 11 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802BA870 002B77D0 57 E3 04 3E */ clrlwi r3, r31, 0x10 /* 802BA874 002B77D4 57 64 04 3E */ clrlwi r4, r27, 0x10 /* 802BA878 002B77D8 57 C5 04 3E */ clrlwi r5, r30, 0x10 @@ -5664,7 +5664,7 @@ lbl_802BAA1C: /* 802BAC08 002B7B68 38 60 00 00 */ li r3, 0 /* 802BAC0C 002B7B6C 38 80 00 07 */ li r4, 7 /* 802BAC10 002B7B70 38 A0 00 00 */ li r5, 0 -/* 802BAC14 002B7B74 48 04 DC 69 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802BAC14 002B7B74 48 04 DC 69 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802BAC18 002B7B78 3C 60 80 3D */ lis r3, lbl_803D6624@ha /* 802BAC1C 002B7B7C 38 63 66 24 */ addi r3, r3, lbl_803D6624@l /* 802BAC20 002B7B80 48 04 D2 09 */ bl SetVtxDescv__3CGXFPC14_GXVtxDescList @@ -7128,7 +7128,7 @@ lbl_802BBEB8: /* 802BC198 002B90F8 38 60 00 00 */ li r3, 0 /* 802BC19C 002B90FC 38 80 00 07 */ li r4, 7 /* 802BC1A0 002B9100 38 A0 00 00 */ li r5, 0 -/* 802BC1A4 002B9104 48 04 C6 D9 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802BC1A4 002B9104 48 04 C6 D9 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802BC1A8 002B9108 38 60 00 00 */ li r3, 0 /* 802BC1AC 002B910C 48 0B C9 AD */ bl GXSetCullMode /* 802BC1B0 002B9110 38 60 00 A0 */ li r3, 0xa0 @@ -7332,7 +7332,7 @@ lbl_802BC424: /* 802BC4A0 002B9400 38 60 00 01 */ li r3, 1 /* 802BC4A4 002B9404 38 80 00 03 */ li r4, 3 /* 802BC4A8 002B9408 38 A0 00 01 */ li r5, 1 -/* 802BC4AC 002B940C 48 04 C3 D1 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802BC4AC 002B940C 48 04 C3 D1 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802BC4B0 002B9410 7F 63 DB 78 */ mr r3, r27 /* 802BC4B4 002B9414 38 80 00 01 */ li r4, 1 /* 802BC4B8 002B9418 48 0B D0 7D */ bl GXCopyTex @@ -7350,7 +7350,7 @@ lbl_802BC424: /* 802BC4E8 002B9448 7C 1B 03 78 */ mr r27, r0 /* 802BC4EC 002B944C 38 80 00 03 */ li r4, 3 /* 802BC4F0 002B9450 38 A0 00 01 */ li r5, 1 -/* 802BC4F4 002B9454 48 04 C3 89 */ bl SetZMode__3CGXFb10_GXCompareb +/* 802BC4F4 002B9454 48 04 C3 89 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 802BC4F8 002B9458 7F 63 DB 78 */ mr r3, r27 /* 802BC4FC 002B945C 57 E4 06 3E */ clrlwi r4, r31, 0x18 /* 802BC500 002B9460 48 0B D0 35 */ bl GXCopyTex diff --git a/asm/MetroidPrime/CFluidPlaneCPU.s b/asm/MetroidPrime/CFluidPlaneCPU.s index 3221f875..1e5beac9 100644 --- a/asm/MetroidPrime/CFluidPlaneCPU.s +++ b/asm/MetroidPrime/CFluidPlaneCPU.s @@ -2294,7 +2294,7 @@ lbl_8019B99C: /* 8019B99C 001988FC 38 60 00 01 */ li r3, 1 /* 8019B9A0 00198900 38 80 00 03 */ li r4, 3 /* 8019B9A4 00198904 38 A0 00 00 */ li r5, 0 -/* 8019B9A8 00198908 48 16 CE D5 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8019B9A8 00198908 48 16 CE D5 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8019B9AC 0019890C 38 60 00 07 */ li r3, 7 /* 8019B9B0 00198910 38 80 00 00 */ li r4, 0 /* 8019B9B4 00198914 38 A0 00 00 */ li r5, 0 diff --git a/asm/MetroidPrime/CFluidPlaneDoor.s b/asm/MetroidPrime/CFluidPlaneDoor.s index dfe85d46..7b0fc651 100644 --- a/asm/MetroidPrime/CFluidPlaneDoor.s +++ b/asm/MetroidPrime/CFluidPlaneDoor.s @@ -576,7 +576,7 @@ lbl_8019DBA4: /* 8019DBB4 0019AB14 38 60 00 01 */ li r3, 1 /* 8019DBB8 0019AB18 38 80 00 03 */ li r4, 3 /* 8019DBBC 0019AB1C 38 A0 00 00 */ li r5, 0 -/* 8019DBC0 0019AB20 48 16 AC BD */ bl SetZMode__3CGXFb10_GXCompareb +/* 8019DBC0 0019AB20 48 16 AC BD */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8019DBC4 0019AB24 38 60 00 07 */ li r3, 7 /* 8019DBC8 0019AB28 38 80 00 00 */ li r4, 0 /* 8019DBCC 0019AB2C 38 A0 00 00 */ li r5, 0 @@ -718,4 +718,3 @@ lbl_803D1300: .4byte 0 .4byte 0 .4byte 0 - diff --git a/asm/MetroidPrime/CNESEmulator.s b/asm/MetroidPrime/CNESEmulator.s index 9bf62a13..031e9919 100644 --- a/asm/MetroidPrime/CNESEmulator.s +++ b/asm/MetroidPrime/CNESEmulator.s @@ -387,7 +387,7 @@ sub_80293e2c: /* 80294044 00290FA4 38 60 00 01 */ li r3, 1 /* 80294048 00290FA8 38 80 00 07 */ li r4, 7 /* 8029404C 00290FAC 38 A0 00 00 */ li r5, 0 -/* 80294050 00290FB0 48 07 48 2D */ bl SetZMode__3CGXFb10_GXCompareb +/* 80294050 00290FB0 48 07 48 2D */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80294054 00290FB4 7F A4 EB 78 */ mr r4, r29 /* 80294058 00290FB8 38 60 00 00 */ li r3, 0 /* 8029405C 00290FBC 48 07 4B E9 */ bl SetTevKColor__3CGXF14_GXTevKColorIDRC8_GXColor diff --git a/asm/MetroidPrime/CProjectedShadow.s b/asm/MetroidPrime/CProjectedShadow.s index a62080dc..45bc8fe8 100644 --- a/asm/MetroidPrime/CProjectedShadow.s +++ b/asm/MetroidPrime/CProjectedShadow.s @@ -186,7 +186,7 @@ lbl_8029D928: /* 8029D930 0029A890 38 60 00 01 */ li r3, 1 /* 8029D934 0029A894 38 80 00 02 */ li r4, 2 /* 8029D938 0029A898 38 A0 00 00 */ li r5, 0 -/* 8029D93C 0029A89C 48 06 AF 41 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8029D93C 0029A89C 48 06 AF 41 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8029D940 0029A8A0 38 60 00 01 */ li r3, 1 /* 8029D944 0029A8A4 38 80 00 04 */ li r4, 4 /* 8029D948 0029A8A8 38 A0 00 05 */ li r5, 5 @@ -354,7 +354,7 @@ lbl_8029DB80: /* 8029DBC4 0029AB24 38 60 00 01 */ li r3, 1 /* 8029DBC8 0029AB28 38 80 00 03 */ li r4, 3 /* 8029DBCC 0029AB2C 38 A0 00 01 */ li r5, 1 -/* 8029DBD0 0029AB30 48 06 AC AD */ bl SetZMode__3CGXFb10_GXCompareb +/* 8029DBD0 0029AB30 48 06 AC AD */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8029DBD4 0029AB34 38 60 00 07 */ li r3, 7 /* 8029DBD8 0029AB38 38 80 00 00 */ li r4, 0 /* 8029DBDC 0029AB3C 38 A0 00 00 */ li r5, 0 @@ -716,7 +716,7 @@ RenderShadowBuffer__16CProjectedShadowFR13CStateManagerRC10CModelDataRC12CTransf /* 8029E13C 0029B09C 38 60 00 01 */ li r3, 1 /* 8029E140 0029B0A0 38 80 00 03 */ li r4, 3 /* 8029E144 0029B0A4 38 A0 00 01 */ li r5, 1 -/* 8029E148 0029B0A8 48 06 A7 35 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8029E148 0029B0A8 48 06 A7 35 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8029E14C 0029B0AC 57 A5 04 3E */ clrlwi r5, r29, 0x10 /* 8029E150 0029B0B0 57 86 04 3E */ clrlwi r6, r28, 0x10 /* 8029E154 0029B0B4 38 60 00 00 */ li r3, 0 diff --git a/asm/MetroidPrime/CRainSplashGenerator.s b/asm/MetroidPrime/CRainSplashGenerator.s index 015d1f64..26f65c9c 100644 --- a/asm/MetroidPrime/CRainSplashGenerator.s +++ b/asm/MetroidPrime/CRainSplashGenerator.s @@ -442,7 +442,7 @@ DoDraw__20CRainSplashGeneratorCFRC12CTransform4f: /* 8026A2A0 00267200 38 60 00 01 */ li r3, 1 /* 8026A2A4 00267204 38 80 00 03 */ li r4, 3 /* 8026A2A8 00267208 38 A0 00 00 */ li r5, 0 -/* 8026A2AC 0026720C 48 09 E5 D1 */ bl SetZMode__3CGXFb10_GXCompareb +/* 8026A2AC 0026720C 48 09 E5 D1 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8026A2B0 00267210 80 8D 9C 68 */ lwz r4, kEnvPassthru__9CGraphics@sda21(r13) /* 8026A2B4 00267214 38 60 00 00 */ li r3, 0 /* 8026A2B8 00267218 48 0A 00 01 */ bl SetTevOp__9CGraphicsF12ERglTevStageRCQ213CTevCombiners8CTevPass @@ -1328,4 +1328,3 @@ lbl_803D5410: # ROM: 0x3D2410 .asciz "??(??)" .balign 4 - diff --git a/asm/MetroidPrime/CWorldTransManager.s b/asm/MetroidPrime/CWorldTransManager.s index df02726a..5bb15a87 100644 --- a/asm/MetroidPrime/CWorldTransManager.s +++ b/asm/MetroidPrime/CWorldTransManager.s @@ -1052,7 +1052,7 @@ lbl_80209B80: /* 80209BD8 00206B38 38 60 00 01 */ li r3, 1 /* 80209BDC 00206B3C 38 80 00 03 */ li r4, 3 /* 80209BE0 00206B40 38 A0 00 01 */ li r5, 1 -/* 80209BE4 00206B44 48 0F EC 99 */ bl SetZMode__3CGXFb10_GXCompareb +/* 80209BE4 00206B44 48 0F EC 99 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80209BE8 00206B48 57 E3 04 3E */ clrlwi r3, r31, 0x10 /* 80209BEC 00206B4C 57 C4 04 3E */ clrlwi r4, r30, 0x10 /* 80209BF0 00206B50 38 A0 00 04 */ li r5, 4 @@ -1158,7 +1158,7 @@ lbl_80209B80: /* 80209D80 00206CE0 38 60 00 00 */ li r3, 0 /* 80209D84 00206CE4 38 80 00 07 */ li r4, 7 /* 80209D88 00206CE8 38 A0 00 00 */ li r5, 0 -/* 80209D8C 00206CEC 48 0F EA F1 */ bl SetZMode__3CGXFb10_GXCompareb +/* 80209D8C 00206CEC 48 0F EA F1 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80209D90 00206CF0 38 60 00 A0 */ li r3, 0xa0 /* 80209D94 00206CF4 38 80 00 00 */ li r4, 0 /* 80209D98 00206CF8 38 A0 00 04 */ li r5, 4 diff --git a/asm/MetroidPrime/Player/CMorphBallShadow.s b/asm/MetroidPrime/Player/CMorphBallShadow.s index 852f289d..5d65b274 100644 --- a/asm/MetroidPrime/Player/CMorphBallShadow.s +++ b/asm/MetroidPrime/Player/CMorphBallShadow.s @@ -320,7 +320,7 @@ lbl_80295F84: /* 80295F90 00292EF0 38 80 00 02 */ li r4, 2 /* 80295F94 00292EF4 90 01 00 14 */ stw r0, 0x14(r1) /* 80295F98 00292EF8 38 A0 00 00 */ li r5, 0 -/* 80295F9C 00292EFC 48 07 28 E1 */ bl SetZMode__3CGXFb10_GXCompareb +/* 80295F9C 00292EFC 48 07 28 E1 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80295FA0 00292F00 38 60 00 01 */ li r3, 1 /* 80295FA4 00292F04 38 80 00 04 */ li r4, 4 /* 80295FA8 00292F08 38 A0 00 05 */ li r5, 5 @@ -718,7 +718,7 @@ lbl_802963B0: /* 8029658C 002934EC 38 60 00 01 */ li r3, 1 /* 80296590 002934F0 38 80 00 07 */ li r4, 7 /* 80296594 002934F4 38 A0 00 01 */ li r5, 1 -/* 80296598 002934F8 48 07 22 E5 */ bl SetZMode__3CGXFb10_GXCompareb +/* 80296598 002934F8 48 07 22 E5 */ bl SetZMode__3CGXFUi10_GXCompareUi /* 8029659C 002934FC 38 60 00 00 */ li r3, 0 /* 802965A0 00293500 48 07 54 D1 */ bl SetCullMode__9CGraphicsF12ERglCullMode /* 802965A4 00293504 3C 60 80 5A */ lis r3, sIdentity__12CTransform4f@ha @@ -808,7 +808,7 @@ lbl_802963B0: /* 802966F4 00293654 38 60 00 01 */ li r3, 1 /* 802966F8 00293658 38 80 00 03 */ li r4, 3 /* 802966FC 0029365C 38 A0 00 01 */ li r5, 1 -/* 80296700 00293660 48 07 21 7D */ bl SetZMode__3CGXFb10_GXCompareb +/* 80296700 00293660 48 07 21 7D */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80296704 00293664 48 07 62 79 */ bl DisableAllLights__9CGraphicsFv /* 80296708 00293668 38 60 00 01 */ li r3, 1 /* 8029670C 0029366C 48 0A F0 DD */ bl SetRenderModelBlack__10CCubeModelFb @@ -975,7 +975,7 @@ lbl_80296888: /* 80296974 002938D4 38 60 00 01 */ li r3, 1 /* 80296978 002938D8 38 80 00 03 */ li r4, 3 /* 8029697C 002938DC 38 A0 00 01 */ li r5, 1 -/* 80296980 002938E0 48 07 1E FD */ bl SetZMode__3CGXFb10_GXCompareb +/* 80296980 002938E0 48 07 1E FD */ bl SetZMode__3CGXFUi10_GXCompareUi /* 80296984 002938E4 38 61 01 A0 */ addi r3, r1, 0x1a0 /* 80296988 002938E8 48 07 5D C5 */ bl SetViewPointMatrix__9CGraphicsFRC12CTransform4f /* 8029698C 002938EC 38 61 00 94 */ addi r3, r1, 0x94 diff --git a/asm/Weapons/CDecal.s b/asm/Weapons/CDecal.s index 087e4114..3ce4b237 100644 --- a/asm/Weapons/CDecal.s +++ b/asm/Weapons/CDecal.s @@ -1190,4 +1190,3 @@ lbl_803D6550: .4byte 0x00000001 .4byte 0x000000FF .4byte 0 - diff --git a/include/Kyoto/CFrameDelayedKiller.hpp b/include/Kyoto/CFrameDelayedKiller.hpp index a869b089..ff7a4f92 100644 --- a/include/Kyoto/CFrameDelayedKiller.hpp +++ b/include/Kyoto/CFrameDelayedKiller.hpp @@ -7,6 +7,8 @@ class CFrameDelayedKiller { public: static void Initialize(); static void ShutDown(); + + static void sub_8036cb90(); }; #endif // _CFRAMEDELAYEDKILLER diff --git a/include/Kyoto/Graphics/CGX.hpp b/include/Kyoto/Graphics/CGX.hpp index 5f0e5984..e216cf6f 100644 --- a/include/Kyoto/Graphics/CGX.hpp +++ b/include/Kyoto/Graphics/CGX.hpp @@ -107,7 +107,8 @@ public: GXChannelID color); static void SetBlendMode(GXBlendMode mode, GXBlendFactor srcFac, GXBlendFactor dstFac, GXLogicOp op); - static void SetZMode(bool compareEnable, GXCompare func, bool updateEnable); + // TODO: GXBool doesn't work, why? + static void SetZMode(uint compareEnable, GXCompare func, uint updateEnable); static void SetAlphaCompare(GXCompare comp0, uchar ref0, GXAlphaOp op, GXCompare comp1, uchar ref1); static void SetTevIndirect(GXTevStageID stageId, GXIndTexStageID indStage, GXIndTexFormat fmt, diff --git a/include/Kyoto/Graphics/CGraphics.hpp b/include/Kyoto/Graphics/CGraphics.hpp index 59388438..f65a767a 100644 --- a/include/Kyoto/Graphics/CGraphics.hpp +++ b/include/Kyoto/Graphics/CGraphics.hpp @@ -7,6 +7,7 @@ #include "Kyoto/Graphics/CColor.hpp" #include "Kyoto/Graphics/CLight.hpp" #include "Kyoto/Graphics/CTevCombiners.hpp" +#include "Kyoto/Math/CMatrix4f.hpp" #include "Kyoto/Math/CTransform4f.hpp" #include "Kyoto/Math/CVector3f.hpp" @@ -158,8 +159,10 @@ struct CViewport { }; class COsContext; +class CTexture; class CTimeProvider; +// TODO typedef struct { float x; float y; @@ -189,6 +192,11 @@ public: , x14_near(near) , x18_far(far) {} + bool IsPerspective() const { return x0_persp; } + float GetLeft() const { return x4_left; } + float GetRight() const { return x8_right; } + float GetTop() const { return xc_top; } + float GetBottom() const { return x10_bottom; } float GetNear() const { return x14_near; } float GetFar() const { return x18_far; } @@ -212,20 +220,26 @@ public: static void LoadLight(ERglLight light, const CLight& info); static void SetLightState(uchar lights); static void SetViewMatrix(); + static void SetScissor(int left, int bottom, int width, int height); + static void ClearBackAndDepthBuffers(); static void SetIdentityViewPointMatrix(); static void SetIdentityModelMatrix(); static void SetViewport(int left, int bottom, int width, int height); static void SetPerspective(float fovy, float aspect, float znear, float zfar); static void SetCopyClear(const CColor& color, float depth); + static void SetClearColor(const CColor& color); static void SetDepthRange(float near, float far); static void FlushProjection(); static void SetDefaultVtxAttrFmt(); + static CMatrix4f GetPerspectiveProjectionMatrix(); + static CMatrix4f CalculatePerspectiveMatrix(float fovy, float aspect, float znear, float zfar); static bool IsBeginSceneClearFb(); static void SetIsBeginSceneClearFb(bool); static void BeginScene(); static void EndScene(); + static void SwapBuffers(); static void SetTevOp(ERglTevStage stage, const CTevCombiners::CTevPass& pass); static void StreamBegin(ERglPrimitive primitive); static void StreamColor(uint color); @@ -234,7 +248,13 @@ public: static void StreamVertex(float, float, float); static void StreamVertex(const CVector3f& vtx); static void StreamVertex(const float*); + static void StreamNormal(const float*); static void StreamEnd(); + static void Render2D(const CTexture& tex, int x, int y, int w, int h, const CColor& col); + static void DrawPrimitive(ERglPrimitive primitive, const float* pos, const CVector3f& normal, const CColor& col, int numVerts); + + static void VideoPreCallback(u32 retraceCount); + static void VideoPostCallback(u32 retraceCount); static const CViewport& GetViewport() { return mViewport; } static const CVector3f& GetViewPoint() { return mViewPoint; } @@ -252,11 +272,13 @@ public: static void SetFog(ERglFogMode mode, float startz, float endz, const CColor& color); static void SetModelMatrix(const CTransform4f& xf); - static void SetAlphaCompare(ERglAlphaFunc comp0, u8 ref0, ERglAlphaOp op, ERglAlphaFunc comp1, - u8 ref1); + static void SetAlphaCompare(ERglAlphaFunc comp0, uchar ref0, ERglAlphaOp op, ERglAlphaFunc comp1, + uchar ref1); static void SetDepthWriteMode(bool test, ERglEnum comp, bool write); - static void SetBlendMode(ERglBlendMode, ERglBlendFactor, ERglBlendFactor, ERglLogicOp); - static void SetCullMode(ERglCullMode); + static void SetBlendMode(ERglBlendMode mode, ERglBlendFactor src, ERglBlendFactor dst, + ERglLogicOp op); + static void SetCullMode(ERglCullMode cullMode); + static void SetTevStates(uchar); // Screen Position static void sub_80309564(uint* stretch, uint* xOffset, uint* yOffset); diff --git a/include/Kyoto/Math/CMatrix4f.hpp b/include/Kyoto/Math/CMatrix4f.hpp index 337181b2..df1b0aa9 100644 --- a/include/Kyoto/Math/CMatrix4f.hpp +++ b/include/Kyoto/Math/CMatrix4f.hpp @@ -4,6 +4,10 @@ #include "types.h" class CMatrix4f { +public: + CMatrix4f(float, float, float, float, float, float, float, float, float, float, float, float, + float, float, float, float); + private: float m00; float m01; diff --git a/include/Kyoto/Math/CRelAngle.hpp b/include/Kyoto/Math/CRelAngle.hpp index 6016072f..bdb86f16 100644 --- a/include/Kyoto/Math/CRelAngle.hpp +++ b/include/Kyoto/Math/CRelAngle.hpp @@ -43,6 +43,9 @@ CHECK_SIZEOF(CRelAngle, 0x4) // __mi__FRC9CRelAngleRC9CRelAngle // __pl__FRC9CRelAngleRC9CRelAngle // __dv__FRC9CRelAnglef +// static inline CRelAngle operator/(const CRelAngle& ang, float f) { +// return CRelAngle::FromRadians(ang.AsRadians() / f); +// } static inline float sine(const CRelAngle& angle) { return sin(angle.AsRadians()); } static inline float cosine(const CRelAngle& angle) { return cos(angle.AsRadians()); } diff --git a/include/dolphin/gx/GXFifo.h b/include/dolphin/gx/GXFifo.h index 36b9c31a..85d61685 100644 --- a/include/dolphin/gx/GXFifo.h +++ b/include/dolphin/gx/GXFifo.h @@ -11,6 +11,8 @@ typedef struct { u8 pad[128]; } GXFifoObj; +typedef void (*GXBreakPtCallback)(void); + void GXInitFifoBase(GXFifoObj* fifo, void* base, u32 size); void GXInitFifoPtrs(GXFifoObj* fifo, void* readPtr, void* writePtr); void GXGetFifoPtrs(GXFifoObj* fifo, void** readPtr, void** writePtr); @@ -24,6 +26,9 @@ void GXGetFifoStatus(GXFifoObj* fifo, GXBool* overhi, GXBool* underlow, u32* fif void GXGetGPStatus(GXBool* overhi, GXBool* underlow, GXBool* readIdle, GXBool* cmdIdle, GXBool* brkpt); void GXInitFifoLimits(GXFifoObj* fifo, u32 hiWaterMark, u32 loWaterMark); +GXBreakPtCallback GXSetBreakPtCallback(GXBreakPtCallback cb); +void GXEnableBreakPt(void* breakPt); +void GXDisableBreakPt(void); #ifdef __cplusplus } diff --git a/include/dolphin/vifuncs.h b/include/dolphin/vifuncs.h index 37ea70c6..955ab031 100644 --- a/include/dolphin/vifuncs.h +++ b/include/dolphin/vifuncs.h @@ -3,11 +3,15 @@ #include +#include + #ifdef __cplusplus extern "C" { #endif u32 VIGetNextField(void); +VIRetraceCallback VISetPreRetraceCallback(VIRetraceCallback callback); +VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback); #ifdef __cplusplus } diff --git a/include/dolphin/vitypes.h b/include/dolphin/vitypes.h new file mode 100644 index 00000000..f4e29305 --- /dev/null +++ b/include/dolphin/vitypes.h @@ -0,0 +1,16 @@ +#ifndef _DOLPHIN_VITYPES +#define _DOLPHIN_VITYPES + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*VIRetraceCallback)(u32 retraceCount); + +#ifdef __cplusplus +} +#endif + +#endif // _DOLPHIN_VITYPES diff --git a/libc/math.h b/libc/math.h index b75eb4fb..ee57a4aa 100644 --- a/libc/math.h +++ b/libc/math.h @@ -72,6 +72,7 @@ double sin(double x); double cos(double x); double atan(double x); double atan2(double y, double x); +double tan(double x); _MATH_INLINE float fabsf(float x) { return (float)fabs((double)x); } _MATH_INLINE float sinf(float x) { return (float)sin((double)x); } diff --git a/src/Kyoto/Graphics/CGX.cpp b/src/Kyoto/Graphics/CGX.cpp index c1d1129f..6a3d0e65 100644 --- a/src/Kyoto/Graphics/CGX.cpp +++ b/src/Kyoto/Graphics/CGX.cpp @@ -177,9 +177,10 @@ void CGX::SetBlendMode(GXBlendMode mode, GXBlendFactor srcFac, GXBlendFactor dst } } -void CGX::SetZMode(bool compareEnable, GXCompare func, bool updateEnable) { - // ?? - uchar flags = compareEnable | MaskAndShiftLeft(updateEnable, 0xFF, 1) | (func & 0xFF) << 2; +// TODO: GXBool doesn't work, why? +void CGX::SetZMode(uint compareEnable, GXCompare func, uint updateEnable) { + uchar flags = MaskAndShiftLeft(compareEnable, 0xFF, 0) | MaskAndShiftLeft(updateEnable, 0xFF, 1) | + MaskAndShiftLeft(func, 0xFF, 2); if (flags != sGXState.x52_zmode) { sGXState.x52_zmode = flags; GXSetZMode(compareEnable, func, updateEnable); diff --git a/src/Kyoto/Graphics/DolphinCGraphics.cpp b/src/Kyoto/Graphics/DolphinCGraphics.cpp index 311f27a7..a2f29837 100644 --- a/src/Kyoto/Graphics/DolphinCGraphics.cpp +++ b/src/Kyoto/Graphics/DolphinCGraphics.cpp @@ -2,8 +2,11 @@ #include "Kyoto/Basics/COsContext.hpp" #include "Kyoto/Basics/CStopwatch.hpp" +#include "Kyoto/CFrameDelayedKiller.hpp" #include "Kyoto/Graphics/CGX.hpp" #include "Kyoto/Graphics/CGraphicsSys.hpp" +#include "Kyoto/Graphics/CTexture.hpp" +#include "Kyoto/Math/CRelAngle.hpp" #include "dolphin/vi.h" @@ -250,7 +253,7 @@ bool CGraphics::mIsGXModelMatrixIdentity = true; bool CGraphics::mFirstFrame = true; bool CGraphics::mUseVideoFilter = true; float CGraphics::mBrightness = 1.f; -Vec2 CGraphics::mBrightnessRange = {0.f, 2.f}; +// Vec2 CGraphics::mBrightnessRange = {0.f, 2.f}; bool CGraphics::Startup(const COsContext& osContext, uint fifoSize, void* fifoBase) { mpFifo = fifoBase; @@ -384,6 +387,7 @@ void CGraphics::EnableLight(ERglLight light) { static inline GXLightID get_hw_light_index(ERglLight light) { #if NONMATCHING + // one instruction, no branches return static_cast< GXLightID >((light << 1) & (GX_MAX_LIGHT - 1)); #else if (light == kLight0) { @@ -527,19 +531,18 @@ void CGraphics::SetViewPointMatrix(const CTransform4f& xf) { void CGraphics::SetIdentityViewPointMatrix() { mViewMatrix = CTransform4f::Identity(); MTXIdentity(mGXViewPointMatrix); - mGXViewPointMatrix[2][2] = 0.0; - mGXViewPointMatrix[1][1] = 0.0; - mGXViewPointMatrix[1][2] = 1.0; - mGXViewPointMatrix[2][1] = -1.0; + mGXViewPointMatrix[2][2] = 0.f; + mGXViewPointMatrix[1][1] = 0.f; + mGXViewPointMatrix[1][2] = 1.f; + mGXViewPointMatrix[2][1] = -1.f; mViewPoint = CVector3f::Zero(); SetViewMatrix(); } -// TODO: non-matching void CGraphics::SetModelMatrix(const CTransform4f& xf) { if (&xf == &CTransform4f::Identity()) { if (!mIsGXModelMatrixIdentity) { - mModelMatrix = CTransform4f::Identity(); + mModelMatrix = xf; mIsGXModelMatrixIdentity = true; SetViewMatrix(); } @@ -570,3 +573,294 @@ void CGraphics::SetIdentityModelMatrix() { SetViewMatrix(); } } + +void CGraphics::SetOrtho(float left, float right, float top, float bottom, float znear, + float zfar) { + mProj = CProjectionState(false, left, right, top, bottom, znear, zfar); + FlushProjection(); +} + +// TODO non-matching (regswaps) +void CGraphics::SetPerspective(float fovy, float aspect, float znear, float zfar) { + float t = tan(CRelAngle::FromDegrees(fovy).AsRadians() / 2.f); + float top = znear * 2.f * t * 0.5f; + float right = aspect * 2.f * znear * t * 0.5f; + mProj = CProjectionState(true, -right, right, top, -top, znear, zfar); + FlushProjection(); +} + +CMatrix4f CGraphics::GetPerspectiveProjectionMatrix() { +#if NONMATCHING + // construct in place + return CMatrix4f( +#else + CMatrix4f mtx( +#endif + // clang-format off + (mProj.GetNear() * 2.f) / (mProj.GetRight() - mProj.GetLeft()), + -(mProj.GetRight() + mProj.GetLeft()) / (mProj.GetRight() - mProj.GetLeft()), + 0.f, + 0.f, + 0.f, + -(mProj.GetTop() + mProj.GetBottom()) / (mProj.GetTop() - mProj.GetBottom()), + (mProj.GetNear() * 2.f) / (mProj.GetTop() - mProj.GetBottom()), + 0.f, + 0.f, + (mProj.GetFar() + mProj.GetNear()) / (mProj.GetFar() - mProj.GetNear()), + 0.f, + -(mProj.GetFar() * 2.f * mProj.GetNear()) / (mProj.GetFar() - mProj.GetNear()), + 0.f, + 1.f, + 0.f, + 0.f + // clang-format on + ); +#if !NONMATCHING + return mtx; +#endif +} + +CMatrix4f CGraphics::CalculatePerspectiveMatrix(float fovy, float aspect, float znear, float zfar) { + float t = tan(CRelAngle::FromDegrees(fovy).AsRadians() / 2.f); + float right = aspect * 2.f * znear * t * 0.5f; + float left = -right; + float top = znear * 2.f * t * 0.5f; + float bottom = -top; +#if NONMATCHING + // construct in place + return CMatrix4f( +#else + CMatrix4f mtx( +#endif + // clang-format off + (2.f * znear) / (right - left), + -(right + left) / (right - left), + 0.f, + 0.f, + 0.f, + -(top + bottom) / (top - bottom), + (2.f * znear) / (top - bottom), + 0.f, + 0.f, + (zfar + znear) / (zfar - znear), + 0.f, + -(2.f * zfar * znear) / (zfar - znear), + 0.f, + 1.f, + 0.f, + 0.f + // clang-format on + ); +#if !NONMATCHING + return mtx; +#endif +} + +void CGraphics::SetViewport(int left, int bottom, int width, int height) { + mViewport.mLeft = left; + mViewport.mTop = mRenderModeObj.efbHeight - (bottom + height); + mViewport.mWidth = width; + mViewport.mHeight = height; + mViewport.mHalfWidth = static_cast< float >(width / 2); + mViewport.mHalfHeight = static_cast< float >(height / 2); + GXSetViewport(static_cast< float >(mViewport.mLeft), static_cast< float >(mViewport.mTop), + static_cast< float >(mViewport.mWidth), static_cast< float >(mViewport.mHeight), + mDepthNear, mDepthFar); +} + +void CGraphics::SetScissor(int left, int bottom, int width, int height) { + GXSetScissor(left, mRenderModeObj.efbHeight - (bottom + height), width, height); +} + +void CGraphics::SetAmbientColor(const CColor& color) { + CGX::SetChanAmbColor(CGX::Channel0, color.GetGXColor()); + CGX::SetChanAmbColor(CGX::Channel1, color.GetGXColor()); +} + +void CGraphics::SetCopyClear(const CColor& color, float depth) { + mClearColor = color; + mClearDepthValue = static_cast< u32 >(depth * GX_MAX_Z24); + GXSetCopyClear(color.GetGXColor(), mClearDepthValue); +} + +void CGraphics::SetClearColor(const CColor& color) { + mClearColor = color; + GXSetCopyClear(color.GetGXColor(), mClearDepthValue); +} + +void CGraphics::ClearBackAndDepthBuffers() { + GXInvalidateTexAll(); + if (mRenderModeObj.field_rendering) { + GXSetViewportJitter(0.f, 0.f, static_cast< float >(mRenderModeObj.fbWidth), + static_cast< float >(mRenderModeObj.xfbHeight), 0.f, 1.f, VIGetNextField()); + } else { + GXSetViewport(0.f, 0.f, static_cast< float >(mRenderModeObj.fbWidth), + static_cast< float >(mRenderModeObj.xfbHeight), 0.f, 1.f); + } + GXInvalidateVtxCache(); +} + +void CGraphics::BeginScene() { ClearBackAndDepthBuffers(); } + +void CGraphics::SwapBuffers() { + GXDisableBreakPt(); + mFlippingState = 1; +} + +void CGraphics::VideoPreCallback(u32 retraceCount) { + if (mNumBreakpointsWaiting != 0 && mFlippingState == 1) { + if (mFirstFrame) { + VISetBlack(GX_FALSE); + mFirstFrame = false; + } + VISetNextFrameBuffer(mpCurrenFrameBuf); + VIFlush(); + void* frameBuf = mpCurrenFrameBuf == mpFrameBuf1 ? mpFrameBuf2 : mpFrameBuf1; + mFlippingState = 2; + mpCurrenFrameBuf = frameBuf; + } +} + +void CGraphics::VideoPostCallback(u32 retraceCount) { + if (mNumBreakpointsWaiting != 0) { + if (mFlippingState == 2) { + --mNumBreakpointsWaiting; + mFlippingState = 0; + CStopwatch& timer = sFPSTimer; + float elapsed = timer.GetElapsedTime(); + mLastFramesPerSecond = mFramesPerSecond; + mFramesPerSecond = 1.f / elapsed; + timer.Reset(); + mInterruptLastFrameUsedAbove = VIGetNextField() == 1; + } + } +} + +void CGraphics::EndScene() { + CGX::SetZMode(true, GX_LEQUAL, true); + volatile int& numBreakPt = const_cast< volatile int& >(mNumBreakpointsWaiting); + while (numBreakPt > 0) { + OSYieldThread(); + } + ++mNumBreakpointsWaiting; + void*& frameBuf = mpCurrenFrameBuf; + float brightness = CMath::Clamp(0.f, mBrightness, 2.f); + static const u8 copyFilter[7] = {0x00, 0x00, 0x15, 0x16, 0x15, 0x00, 0x00}; + const u8* inFilter = mUseVideoFilter ? mRenderModeObj.vfilter : copyFilter; + u8 vfilter[7]; + for (int i = 0; i < 7; i++) { + vfilter[i] = static_cast< u8 >(static_cast< float >(inFilter[i]) * brightness); + } + GXSetCopyFilter(mRenderModeObj.aa, mRenderModeObj.sample_pattern, true, vfilter); + GXCopyDisp(frameBuf, mIsBeginSceneClearFb ? GX_TRUE : GX_FALSE); + GXSetCopyFilter(mRenderModeObj.aa, mRenderModeObj.sample_pattern, + mUseVideoFilter ? GX_TRUE : GX_FALSE, mRenderModeObj.vfilter); + GXSetBreakPtCallback(SwapBuffers); + VISetPreRetraceCallback(VideoPreCallback); + VISetPostRetraceCallback(VideoPostCallback); + GXFlush(); + GXFifoObj* fifo = GXGetGPFifo(); + void* readPtr; + void* writePtr; + GXGetFifoPtrs(fifo, &readPtr, &writePtr); + GXEnableBreakPt(writePtr); + mLastFrameUsedAbove = mInterruptLastFrameUsedAbove; + ++mFrameCounter; + CFrameDelayedKiller::sub_8036cb90(); +} + +void CGraphics::SetDepthWriteMode(bool test, ERglEnum comp, bool write) { + mDepthFunc = comp; + CGX::SetZMode(static_cast< uchar >(test), static_cast< GXCompare >(comp), + static_cast< uchar >(write)); +} + +void CGraphics::SetCullMode(ERglCullMode cullMode) { + mCullMode = cullMode; + GXSetCullMode(static_cast< GXCullMode >(cullMode)); +} + +void CGraphics::SetBlendMode(ERglBlendMode mode, ERglBlendFactor src, ERglBlendFactor dst, + ERglLogicOp op) { + CGX::SetBlendMode(static_cast< GXBlendMode >(mode), static_cast< GXBlendFactor >(src), + static_cast< GXBlendFactor >(dst), static_cast< GXLogicOp >(op)); +} + +void CGraphics::SetAlphaCompare(ERglAlphaFunc comp0, uchar ref0, ERglAlphaOp op, + ERglAlphaFunc comp1, uchar ref1) { + CGX::SetAlphaCompare(static_cast< GXCompare >(comp0), static_cast< uchar >(ref0), + static_cast< GXAlphaOp >(op), static_cast< GXCompare >(comp1), + static_cast< uchar >(ref1)); +} + +static const GXVtxDescList skPosColorTexDirect[] = { + {GX_VA_POS, GX_DIRECT}, + {GX_VA_CLR0, GX_DIRECT}, + {GX_VA_TEX0, GX_DIRECT}, + {GX_VA_NULL, GX_DIRECT}, +}; + +// TODO non-matching (regswaps) +void CGraphics::Render2D(const CTexture& tex, int x, int y, int w, int h, const CColor& col) { + Mtx44 proj; + MTXOrtho(proj, mViewport.mHeight / 2, -mViewport.mHeight / 2, -mViewport.mWidth / 2, + mViewport.mWidth / 2, -1.f, -10.f); + GXSetProjection(proj, GX_ORTHOGRAPHIC); + uint c = col.GetColor_u32(); + + Mtx mtx; + MTXIdentity(mtx); + GXLoadPosMtxImm(mtx, GX_PNMTX0); + + float x1 = x - mViewport.mWidth / 2; + float y1 = y - mViewport.mHeight / 2; + float x2 = x1 + w; + float y2 = y1 + h; + + // Save state + setup + CGX::SetVtxDescv(skPosColorTexDirect); + SetTevStates(6); + mLightsWereOn = mLightActive; + if (mLightActive != 0) { + DisableAllLights(); + } + ERglCullMode cullMode = mCullMode; + SetCullMode(kCM_None); + tex.Load(GX_TEXMAP0, CTexture::kCM_Repeat); + + // Draw + CGX::Begin(GX_TRIANGLESTRIP, GX_VTXFMT0, 4); + GXPosition3f32(x1, y1, 1.f); + GXColor1u32(c); + GXTexCoord2f32(0.f, 0.f); + GXPosition3f32(x2, y1, 1.f); + GXColor1u32(c); + GXTexCoord2f32(1.f, 0.f); + GXPosition3f32(x1, y2, 1.f); + GXColor1u32(c); + GXTexCoord2f32(0.f, 1.f); + GXPosition3f32(x2, y2, 1.f); + GXColor1u32(c); + GXTexCoord2f32(1.f, 1.f); + CGX::End(); + + // Restore state + if (mLightsWereOn != 0) { + SetLightState(mLightsWereOn); + } + FlushProjection(); + mIsGXModelMatrixIdentity = false; + SetModelMatrix(mModelMatrix); + SetCullMode(cullMode); +} + +void CGraphics::DrawPrimitive(ERglPrimitive primitive, const float* pos, const CVector3f& normal, + const CColor& col, int numVerts) { + StreamBegin(primitive); + StreamNormal(reinterpret_cast< const float* >(&normal)); + StreamColor(col); + for (int i = 0; i < numVerts; ++i) { + StreamVertex(pos + i * 3); + } + StreamEnd(); +}