From a997bb00bc2c8b08b260ef619a09885855dc4a3f Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Sun, 13 Aug 2023 21:08:32 -0700 Subject: [PATCH] d_drawlist (#1881) --- ...3cBgS_ShdwDrawP10cBgD_Vtx_tiiiP8cM3dGPla.s | 125 -- include/SSystem/SComponent/c_bg_s_shdw_draw.h | 2 + include/SSystem/SComponent/c_m3d_g_aab.h | 4 +- include/SSystem/SComponent/c_m3d_g_pla.h | 2 +- include/d/d_drawlist.h | 7 + include/d/s/d_s_play.h | 2 - include/m_Do/m_Do_lib.h | 1 + include/m_Do/m_Do_mtx.h | 4 + libs/SSystem/SComponent/c_m3d.cpp | 24 +- src/d/bg/d_bg_w.cpp | 12 +- src/d/d_drawlist.cpp | 1012 ++++++++++++++++- 11 files changed, 998 insertions(+), 197 deletions(-) delete mode 100644 asm/d/d_drawlist/psdRealCallBack__FP13cBgS_ShdwDrawP10cBgD_Vtx_tiiiP8cM3dGPla.s diff --git a/asm/d/d_drawlist/psdRealCallBack__FP13cBgS_ShdwDrawP10cBgD_Vtx_tiiiP8cM3dGPla.s b/asm/d/d_drawlist/psdRealCallBack__FP13cBgS_ShdwDrawP10cBgD_Vtx_tiiiP8cM3dGPla.s deleted file mode 100644 index 492c2b94522..00000000000 --- a/asm/d/d_drawlist/psdRealCallBack__FP13cBgS_ShdwDrawP10cBgD_Vtx_tiiiP8cM3dGPla.s +++ /dev/null @@ -1,125 +0,0 @@ -lbl_80054688: -/* 80054688 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 8005468C 7C 08 02 A6 */ mflr r0 -/* 80054690 90 01 00 24 */ stw r0, 0x24(r1) -/* 80054694 39 61 00 20 */ addi r11, r1, 0x20 -/* 80054698 48 30 DB 39 */ bl _savegpr_26 -/* 8005469C 7C 7A 1B 78 */ mr r26, r3 -/* 800546A0 7C 9B 23 78 */ mr r27, r4 -/* 800546A4 7C BC 2B 78 */ mr r28, r5 -/* 800546A8 7C DD 33 78 */ mr r29, r6 -/* 800546AC 7C FE 3B 78 */ mr r30, r7 -/* 800546B0 7D 1F 43 78 */ mr r31, r8 -/* 800546B4 80 63 00 38 */ lwz r3, 0x38(r3) -/* 800546B8 7F E4 FB 78 */ mr r4, r31 -/* 800546BC 48 2F 2A D9 */ bl PSVECDotProduct -/* 800546C0 C0 02 86 50 */ lfs f0, lit_5061(r2) -/* 800546C4 FC 01 00 40 */ fcmpo cr0, f1, f0 -/* 800546C8 40 80 01 70 */ bge lbl_80054838 -/* 800546CC 80 7A 00 34 */ lwz r3, 0x34(r26) -/* 800546D0 C0 3F 00 08 */ lfs f1, 8(r31) -/* 800546D4 C0 03 00 08 */ lfs f0, 8(r3) -/* 800546D8 EC 61 00 32 */ fmuls f3, f1, f0 -/* 800546DC C0 3F 00 00 */ lfs f1, 0(r31) -/* 800546E0 C0 03 00 00 */ lfs f0, 0(r3) -/* 800546E4 EC 41 00 32 */ fmuls f2, f1, f0 -/* 800546E8 C0 3F 00 04 */ lfs f1, 4(r31) -/* 800546EC C0 03 00 04 */ lfs f0, 4(r3) -/* 800546F0 EC 01 00 32 */ fmuls f0, f1, f0 -/* 800546F4 EC 02 00 2A */ fadds f0, f2, f0 -/* 800546F8 EC 23 00 2A */ fadds f1, f3, f0 -/* 800546FC C0 1F 00 0C */ lfs f0, 0xc(r31) -/* 80054700 EC 21 00 2A */ fadds f1, f1, f0 -/* 80054704 C0 02 86 54 */ lfs f0, lit_5062(r2) -/* 80054708 FC 01 00 40 */ fcmpo cr0, f1, f0 -/* 8005470C 40 81 01 2C */ ble lbl_80054838 -/* 80054710 38 7A 00 20 */ addi r3, r26, 0x20 -/* 80054714 1C 1C 00 0C */ mulli r0, r28, 0xc -/* 80054718 7C 9B 02 14 */ add r4, r27, r0 -/* 8005471C 1C 1D 00 0C */ mulli r0, r29, 0xc -/* 80054720 7C BB 02 14 */ add r5, r27, r0 -/* 80054724 1C 1E 00 0C */ mulli r0, r30, 0xc -/* 80054728 7C DB 02 14 */ add r6, r27, r0 -/* 8005472C C0 44 00 04 */ lfs f2, 4(r4) -/* 80054730 C0 3A 00 18 */ lfs f1, 0x18(r26) -/* 80054734 FC 02 08 40 */ fcmpo cr0, f2, f1 -/* 80054738 40 80 00 1C */ bge lbl_80054754 -/* 8005473C C0 05 00 04 */ lfs f0, 4(r5) -/* 80054740 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 80054744 40 80 00 10 */ bge lbl_80054754 -/* 80054748 C0 06 00 04 */ lfs f0, 4(r6) -/* 8005474C FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 80054750 41 80 00 C0 */ blt lbl_80054810 -lbl_80054754: -/* 80054754 C0 23 00 04 */ lfs f1, 4(r3) -/* 80054758 FC 02 08 40 */ fcmpo cr0, f2, f1 -/* 8005475C 40 81 00 1C */ ble lbl_80054778 -/* 80054760 C0 05 00 04 */ lfs f0, 4(r5) -/* 80054764 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 80054768 40 81 00 10 */ ble lbl_80054778 -/* 8005476C C0 06 00 04 */ lfs f0, 4(r6) -/* 80054770 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 80054774 41 81 00 9C */ bgt lbl_80054810 -lbl_80054778: -/* 80054778 C0 44 00 00 */ lfs f2, 0(r4) -/* 8005477C C0 3A 00 14 */ lfs f1, 0x14(r26) -/* 80054780 FC 02 08 40 */ fcmpo cr0, f2, f1 -/* 80054784 40 80 00 1C */ bge lbl_800547A0 -/* 80054788 C0 05 00 00 */ lfs f0, 0(r5) -/* 8005478C FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 80054790 40 80 00 10 */ bge lbl_800547A0 -/* 80054794 C0 06 00 00 */ lfs f0, 0(r6) -/* 80054798 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 8005479C 41 80 00 74 */ blt lbl_80054810 -lbl_800547A0: -/* 800547A0 C0 23 00 00 */ lfs f1, 0(r3) -/* 800547A4 FC 02 08 40 */ fcmpo cr0, f2, f1 -/* 800547A8 40 81 00 1C */ ble lbl_800547C4 -/* 800547AC C0 05 00 00 */ lfs f0, 0(r5) -/* 800547B0 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 800547B4 40 81 00 10 */ ble lbl_800547C4 -/* 800547B8 C0 06 00 00 */ lfs f0, 0(r6) -/* 800547BC FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 800547C0 41 81 00 50 */ bgt lbl_80054810 -lbl_800547C4: -/* 800547C4 C0 44 00 08 */ lfs f2, 8(r4) -/* 800547C8 C0 3A 00 1C */ lfs f1, 0x1c(r26) -/* 800547CC FC 02 08 40 */ fcmpo cr0, f2, f1 -/* 800547D0 40 80 00 1C */ bge lbl_800547EC -/* 800547D4 C0 05 00 08 */ lfs f0, 8(r5) -/* 800547D8 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 800547DC 40 80 00 10 */ bge lbl_800547EC -/* 800547E0 C0 06 00 08 */ lfs f0, 8(r6) -/* 800547E4 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 800547E8 41 80 00 28 */ blt lbl_80054810 -lbl_800547EC: -/* 800547EC C0 23 00 08 */ lfs f1, 8(r3) -/* 800547F0 FC 02 08 40 */ fcmpo cr0, f2, f1 -/* 800547F4 40 81 00 24 */ ble lbl_80054818 -/* 800547F8 C0 05 00 08 */ lfs f0, 8(r5) -/* 800547FC FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 80054800 40 81 00 18 */ ble lbl_80054818 -/* 80054804 C0 06 00 08 */ lfs f0, 8(r6) -/* 80054808 FC 00 08 40 */ fcmpo cr0, f0, f1 -/* 8005480C 40 81 00 0C */ ble lbl_80054818 -lbl_80054810: -/* 80054810 38 60 00 01 */ li r3, 1 -/* 80054814 48 00 00 28 */ b lbl_8005483C -lbl_80054818: -/* 80054818 80 7A 00 3C */ lwz r3, 0x3c(r26) -/* 8005481C 7F 64 DB 78 */ mr r4, r27 -/* 80054820 57 85 04 3E */ clrlwi r5, r28, 0x10 -/* 80054824 57 A6 04 3E */ clrlwi r6, r29, 0x10 -/* 80054828 57 C7 04 3E */ clrlwi r7, r30, 0x10 -/* 8005482C 7F E8 FB 78 */ mr r8, r31 -/* 80054830 4B FF FA 59 */ bl set__18dDlst_shadowPoly_cFP10cBgD_Vtx_tUsUsUsP8cM3dGPla -/* 80054834 48 00 00 08 */ b lbl_8005483C -lbl_80054838: -/* 80054838 38 60 00 01 */ li r3, 1 -lbl_8005483C: -/* 8005483C 39 61 00 20 */ addi r11, r1, 0x20 -/* 80054840 48 30 D9 DD */ bl _restgpr_26 -/* 80054844 80 01 00 24 */ lwz r0, 0x24(r1) -/* 80054848 7C 08 03 A6 */ mtlr r0 -/* 8005484C 38 21 00 20 */ addi r1, r1, 0x20 -/* 80054850 4E 80 00 20 */ blr diff --git a/include/SSystem/SComponent/c_bg_s_shdw_draw.h b/include/SSystem/SComponent/c_bg_s_shdw_draw.h index b6938b93688..6a4fe439e21 100644 --- a/include/SSystem/SComponent/c_bg_s_shdw_draw.h +++ b/include/SSystem/SComponent/c_bg_s_shdw_draw.h @@ -18,6 +18,8 @@ public: void Set(cXyz&, cXyz&); void SetCallback(cBgS_ShdwDraw_Callback); + cM3dGAab* GetBndP() { return &mM3dGAab; } + private: /* 0x14 */ cM3dGAab mM3dGAab; /* 0x30 */ cBgS_ShdwDraw_Callback mCallbackFun; diff --git a/include/SSystem/SComponent/c_m3d_g_aab.h b/include/SSystem/SComponent/c_m3d_g_aab.h index d268ceb5d69..f7658e1e4eb 100644 --- a/include/SSystem/SComponent/c_m3d_g_aab.h +++ b/include/SSystem/SComponent/c_m3d_g_aab.h @@ -25,8 +25,8 @@ public: void SetMax(const cXyz&); void CalcCenter(cXyz*) const; void PlusR(f32); - const cXyz& getMaxP(void) const { return mMax; } - const cXyz& getMinP(void) const { return mMin; } + const cXyz* GetMaxP(void) const { return &mMax; } + const cXyz* GetMinP(void) const { return &mMin; } const f32 GetMaxX(void) const { return mMax.x; } const f32 GetMaxY(void) const { return mMax.y; } const f32 GetMaxZ(void) const { return mMax.z; } diff --git a/include/SSystem/SComponent/c_m3d_g_pla.h b/include/SSystem/SComponent/c_m3d_g_pla.h index 17b1e033ca3..d6aa2fe51a5 100644 --- a/include/SSystem/SComponent/c_m3d_g_pla.h +++ b/include/SSystem/SComponent/c_m3d_g_pla.h @@ -26,7 +26,7 @@ public: f32 getPlaneFunc(const Vec* pPoint) const { return mD + PSVECDotProduct(&mNormal, pPoint); } const cXyz& GetNP() const { return mNormal; } - const cXyz& i_GetNP() const { return mNormal; } + const cXyz* i_GetNP() const { return &mNormal; } f32 GetD() const { return mD; } void SetupFrom3Vtx(const Vec* v1, const Vec* v2, const Vec* v3) { cM3d_CalcPla(v1, v2, v3, &mNormal, &mD); diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index 3f4ddfe9245..7f008dfa5bd 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -42,6 +42,9 @@ public: /* 80053E9C */ virtual void draw(); /* 800541F4 */ void update(cXyz&, _GXColor&, u16, u16, u16, u16, f32, f32, f32, f32); + f32 getRndValue(f32 param_0, f32 param_1) { return mRnd.getValue(param_0, param_1); } + f32 getRndFX(f32 param_0) { return mRnd.getFX(param_0); } + private: /* 0x04 */ cM_rnd_c mRnd; /* 0x10 */ cXyz field_0x10; @@ -92,6 +95,10 @@ public: /* 80052B00 */ dDlst_2DT2_c(); /* 80052B4C */ void init(ResTIMG*, f32, f32, f32, f32, u8, u8, u8, f32, f32); + f32 getScaleX() { return mScaleX; } + void setScaleX(f32 scale) { mScaleX = scale; } + void setScaleY(f32 scale) { mScaleY = scale; } + /* 0x04 */ GXTexObj mTexObj; /* 0x24 */ f32 field_0x24; /* 0x28 */ f32 field_0x28; diff --git a/include/d/s/d_s_play.h b/include/d/s/d_s_play.h index 1c85842d724..9a58e2ab3aa 100644 --- a/include/d/s/d_s_play.h +++ b/include/d/s/d_s_play.h @@ -30,7 +30,6 @@ public: /* 8025AC0C */ virtual ~dScnPly_env_otherHIO_c(); -private: /* 0x4 */ f32 mShadowDensity; /* 0x8 */ u8 mLODBias; /* 0x9 */ u8 field_0x9; @@ -55,7 +54,6 @@ class dScnPly_env_HIO_c { public: /* 8025AD04 */ virtual ~dScnPly_env_HIO_c(); -private: /* 0x04 */ u8 field_0x4; /* 0x08 */ dScnPly_env_otherHIO_c mOther; /* 0x14 */ dScnPly_env_debugHIO_c mDebug; diff --git a/include/m_Do/m_Do_lib.h b/include/m_Do/m_Do_lib.h index 33e6ae7f3fc..b8c915df850 100644 --- a/include/m_Do/m_Do_lib.h +++ b/include/m_Do/m_Do_lib.h @@ -26,6 +26,7 @@ struct mDoLib_clipper { } static f32 getFar() { return mSystemFar; } + static f32 getFovyRate() { return mFovyRate; } static void resetFar() { mClipper.setFar(mSystemFar); diff --git a/include/m_Do/m_Do_mtx.h b/include/m_Do/m_Do_mtx.h index c05e64d1385..e2dbf5c99e2 100644 --- a/include/m_Do/m_Do_mtx.h +++ b/include/m_Do/m_Do_mtx.h @@ -67,6 +67,10 @@ inline void cMtx_ZrotM(Mtx mtx, s16 z) { mDoMtx_ZrotM(mtx, z); } +inline void cMtx_lookAt(Mtx param_0, const Vec* param_1, const Vec* param_2, s16 param_3) { + mDoMtx_lookAt(param_0, param_1, param_2, param_3); +} + inline void cMtx_multVec(Mtx mtx, const Vec* src, Vec* dst) { mDoMtx_multVec(mtx, src, dst); } diff --git a/libs/SSystem/SComponent/c_m3d.cpp b/libs/SSystem/SComponent/c_m3d.cpp index 148318f8251..aca529c41d7 100644 --- a/libs/SSystem/SComponent/c_m3d.cpp +++ b/libs/SSystem/SComponent/c_m3d.cpp @@ -281,12 +281,12 @@ inline bool cM3d_CrossNumSection(f32 lMinX, f32 lMaxX, f32 rMinX, f32 rMaxX) { /* 802689E8-80268B0C 263328 0124+00 0/0 4/4 0/0 .text cM3d_Cross_AabAab__FPC8cM3dGAabPC8cM3dGAab */ bool cM3d_Cross_AabAab(const cM3dGAab* pAabA, const cM3dGAab* pAabB) { - if (cM3d_CrossNumSection(pAabA->getMinP().x, pAabA->getMaxP().x, pAabB->getMinP().x, - pAabB->getMaxP().x) && - cM3d_CrossNumSection(pAabA->getMinP().y, pAabA->getMaxP().y, pAabB->getMinP().y, - pAabB->getMaxP().y) && - cM3d_CrossNumSection(pAabA->getMinP().z, pAabA->getMaxP().z, pAabB->getMinP().z, - pAabB->getMaxP().z)) { + if (cM3d_CrossNumSection(pAabA->GetMinP()->x, pAabA->GetMaxP()->x, pAabB->GetMinP()->x, + pAabB->GetMaxP()->x) && + cM3d_CrossNumSection(pAabA->GetMinP()->y, pAabA->GetMaxP()->y, pAabB->GetMinP()->y, + pAabB->GetMaxP()->y) && + cM3d_CrossNumSection(pAabA->GetMinP()->z, pAabA->GetMaxP()->z, pAabB->GetMinP()->z, + pAabB->GetMaxP()->z)) { return true; } else { return false; @@ -296,17 +296,17 @@ bool cM3d_Cross_AabAab(const cM3dGAab* pAabA, const cM3dGAab* pAabB) { /* 80268B0C-80268BB4 26344C 00A8+00 0/0 4/4 0/0 .text cM3d_Cross_AabCyl__FPC8cM3dGAabPC8cM3dGCyl */ bool cM3d_Cross_AabCyl(const cM3dGAab* pAab, const cM3dGCyl* pCyl) { - if (pAab->getMinP().x > pCyl->GetCP()->x + pCyl->GetR()) { + if (pAab->GetMinP()->x > pCyl->GetCP()->x + pCyl->GetR()) { return false; - } else if (pAab->getMaxP().x < pCyl->GetCP()->x - pCyl->GetR()) { + } else if (pAab->GetMaxP()->x < pCyl->GetCP()->x - pCyl->GetR()) { return false; - } else if (pAab->getMinP().z > pCyl->GetCP()->z + pCyl->GetR()) { + } else if (pAab->GetMinP()->z > pCyl->GetCP()->z + pCyl->GetR()) { return false; - } else if (pAab->getMaxP().z < pCyl->GetCP()->z - pCyl->GetR()) { + } else if (pAab->GetMaxP()->z < pCyl->GetCP()->z - pCyl->GetR()) { return false; - } else if (pAab->getMinP().y > pCyl->GetCP()->y + pCyl->GetH()) { + } else if (pAab->GetMinP()->y > pCyl->GetCP()->y + pCyl->GetH()) { return false; - } else if (pAab->getMaxP().y < pCyl->GetCP()->y) { + } else if (pAab->GetMaxP()->y < pCyl->GetCP()->y) { return false; } else { return true; diff --git a/src/d/bg/d_bg_w.cpp b/src/d/bg/d_bg_w.cpp index 8ff99322b1c..84de7e6d6d0 100644 --- a/src/d/bg/d_bg_w.cpp +++ b/src/d/bg/d_bg_w.cpp @@ -685,8 +685,8 @@ void cBgW::MakeNodeTreeRp(int param_0) { int tmp = tree_data->m_id[0]; if (tmp != 0xFFFF) { - cXyz* max = (cXyz*)&pm_node_tree[param_0].getMaxP(); - cXyz* min = (cXyz*)&pm_node_tree[param_0].getMinP(); + cXyz* max = (cXyz*)pm_node_tree[param_0].GetMaxP(); + cXyz* min = (cXyz*)pm_node_tree[param_0].GetMinP(); MakeBlckBnd(tmp, min, max); } @@ -700,8 +700,8 @@ void cBgW::MakeNodeTreeRp(int param_0) { if (tmp != 0xFFFF) { MakeNodeTreeRp(tmp); - pm_node_tree[param_0].SetMinMax(pm_node_tree[tmp].getMinP()); - pm_node_tree[param_0].SetMinMax(pm_node_tree[tmp].getMaxP()); + pm_node_tree[param_0].SetMinMax(*pm_node_tree[tmp].GetMinP()); + pm_node_tree[param_0].SetMinMax(*pm_node_tree[tmp].GetMaxP()); } } } @@ -1183,8 +1183,8 @@ bool cBgW::GetTriPnt(cBgS_PolyInfo const& poly, cXyz* p_pnt1, cXyz* p_pnt2, cXyz /* 8007B240-8007B270 075B80 0030+00 2/0 1/0 0/0 .text GetTopUnder__4cBgWCFPfPf */ void cBgW::GetTopUnder(f32* p_top, f32* p_under) const { - *p_under = pm_grp[field_0x92].m_aab.getMinP().y; - *p_top = pm_grp[field_0x92].m_aab.getMaxP().y; + *p_under = pm_grp[field_0x92].m_aab.GetMinP()->y; + *p_top = pm_grp[field_0x92].m_aab.GetMaxP()->y; } /* 8007B270-8007B2B0 075BB0 0040+00 2/0 1/0 0/0 .text GetTriPla__4cBgWCFRC13cBgS_PolyInfo diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index 095978b196e..9ac48c7b330 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -4,12 +4,16 @@ // #include "d/d_drawlist.h" +#include "JSystem/J2DGraph/J2DGrafContext.h" #include "JSystem/J2DGraph/J2DScreen.h" #include "JSystem/J3DGraphBase/J3DDrawBuffer.h" #include "JSystem/J3DGraphBase/J3DShape.h" #include "JSystem/J3DGraphBase/J3DSys.h" +#include "JSystem/JMath/JMath.h" #include "SSystem/SComponent/c_bg_s_shdw_draw.h" +#include "SSystem/SComponent/c_math.h" #include "d/com/d_com_inf_game.h" +#include "d/s/d_s_play.h" #include "dol2asm.h" #include "dolphin/gx/GX.h" #include "dolphin/mtx/mtx44.h" @@ -68,12 +72,13 @@ public: /* 0x14 */ f32 field_0x14; }; -class dDlst_2DT_c { +class dDlst_2DT_c : public dDlst_base_c { public: + dDlst_2DT_c() {} /* 80051F98 */ virtual void draw(); - /* 0x04 */ void* field_0x4; - /* 0x08 */ u8 field_0x8[4]; + /* 0x04 */ u8* field_0x4; + /* 0x08 */ u32 field_0x8; /* 0x0C */ u8 field_0xc; /* 0x0D */ u8 field_0xd; /* 0x0E */ u16 field_0xe; @@ -90,29 +95,106 @@ public: class dDlst_2DQuad_c { public: + dDlst_2DQuad_c() {} /* 80051CF0 */ virtual void draw(); + + /* 0x04 */ s16 field_0x4; + /* 0x06 */ s16 field_0x6; + /* 0x08 */ s16 field_0x8; + /* 0x0A */ s16 field_0xa; + /* 0x0C */ GXColor field_0xc; }; class dDlst_2DPoint_c { public: /* 80051E5C */ virtual void draw(); + + /* 0x04 */ s16 field_0x4; + /* 0x06 */ s16 field_0x6; + /* 0x08 */ GXColor field_0x8; + /* 0x0C */ u8 field_0xc; +}; + +class dDlst_2DMt_tex_c { +public: + u8 check() { return field_0x0; } + int getCI() { return mCI; } + GXTexObj* getTexObj() { return &mTexObj; } + GXTlutObj* getTlutObj() { return &mTlutObj; } + GXColor getColor() { return mColor; } + f32 getS() { return mS; } + f32 getT() { return mT; } + f32 getSw() { return mSw; } + f32 getTw() { return mTw; } + + /* 0x00 */ u8 field_0x0; + /* 0x01 */ u8 mCI; + /* 0x04 */ GXTexObj mTexObj; + /* 0x24 */ GXTlutObj mTlutObj; + /* 0x30 */ GXColor mColor; + /* 0x34 */ f32 mS; + /* 0x38 */ f32 mT; + /* 0x3C */ f32 mSw; + /* 0x40 */ f32 mTw; }; class dDlst_2DMt_c { public: /* 8005364C */ virtual void draw(); + + /* 0x04 */ u8 field_0x4; + /* 0x08 */ dDlst_2DMt_tex_c* field_0x8; + /* 0x0C */ s16 field_0xc; + /* 0x0E */ s16 field_0xe; + /* 0x10 */ s16 field_0x10; + /* 0x12 */ s16 field_0x12; }; class dDlst_2DM_c { public: /* 80052C58 */ virtual void draw(); + + /* 0x04 */ s16 field_0x4; + /* 0x06 */ s16 field_0x6; + /* 0x08 */ s16 field_0x8; + /* 0x0A */ s16 field_0xa; + /* 0x0C */ u8 field_0xc; + /* 0x0D */ GXColor field_0xd; + /* 0x11 */ GXColor field_0x11; + /* 0x18 */ void* field_0x18; + /* 0x1C */ u8 field_0x1c; + /* 0x1E */ u16 field_0x1e; + /* 0x20 */ u16 field_0x20; + /* 0x22 */ s16 field_0x22; + /* 0x24 */ s16 field_0x24; + /* 0x28 */ void* field_0x28; + /* 0x2C */ u8 field_0x2c; + /* 0x2E */ u16 field_0x2e; + /* 0x30 */ u16 field_0x30; + /* 0x32 */ s16 field_0x32; + /* 0x34 */ s16 field_0x34; }; class ShdwDrawPoly_c : public cBgS_ShdwDraw { public: /* 80054A6C */ virtual ~ShdwDrawPoly_c() {} + + void setCenter(cXyz* center) { mCenter = center; } + cXyz* getCenter() { return mCenter; } + void setLightVec(cXyz* lightVec) { mLightVec = lightVec; } + cXyz* getLightVec() { return mLightVec; } + void setPoly(dDlst_shadowPoly_c* poly) { mPoly = poly; } + dDlst_shadowPoly_c* getPoly() { return mPoly; } + + /* 0x34 */ cXyz* mCenter; + /* 0x38 */ cXyz* mLightVec; + /* 0x3c */ dDlst_shadowPoly_c* mPoly; }; +static inline void GXSetTexCoordGen(GXTexCoordID dst, GXTexGenType type, GXTexGenSrc src, u32 mtx) { + GXSetTexCoordGen2(dst, type, src, mtx, GX_FALSE, GX_PTIDENTITY); +} + // // Forward References: // @@ -192,7 +274,7 @@ extern "C" void draw__12dDlst_list_cFPP12dDlst_base_cPP12dDlst_base_c(); extern "C" void wipeIn__12dDlst_list_cFfR8_GXColor(); extern "C" void wipeIn__12dDlst_list_cFf(); extern "C" void calcWipe__12dDlst_list_cFv(); -extern "C" void getTri__22dDlst_shadowRealPoly_cFv(); +extern "C" dDlst_shadowTri_c* getTri__22dDlst_shadowRealPoly_cFv(); extern "C" s32 getTriMax__22dDlst_shadowRealPoly_cFv(); extern "C" void searchUpdateMaterialID__10J2DAnmBaseFP9J2DScreen(); extern "C" void __sinit_d_drawlist_cpp(); @@ -306,6 +388,42 @@ void dDlst_window_c::setScissor(f32 xOrig, f32 yOrig, f32 width, f32 height) { } /* 80051AF0-80051CF0 04C430 0200+00 1/0 0/0 0/0 .text draw__13dDlst_2DTri_cFv */ +// vtable data +#ifdef NONMATCHING +void dDlst_2DTri_c::draw() { + f32 f2 = cM_scos(field_0xc); + f32 f3 = cM_ssin(field_0xc); + s16 x[3]; + s16 y[3]; + int r8 = 0; + for (int i = 0; i < 3; i++) { + f32 f4 = field_0x10 * cM_ssin(r8); + f32 f5 = field_0x14 * cM_scos(r8); + x[i] = field_0x4 + s16(f4 * f2 + f5 * f3); + y[i] = field_0x6 + s16(f5 * f2 - f4 * f3); + r8 -= 0x5555; + } + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); + GXSetChanMatColor(GX_COLOR0A0, field_0x8); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXLoadPosMtxImm(mDoMtx_getIdentity(), GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + GXBegin(GX_TRIANGLES, GX_VTXFMT0, 3); + i_GXPosition3s16(x[0], y[0], 0); + i_GXPosition3s16(x[1], y[1], 0); + i_GXPosition3s16(x[2], y[2], 0); + i_GXEnd(); + dComIfGp_getCurrentGrafPort()->setup2D(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -315,8 +433,34 @@ extern "C" asm void draw__13dDlst_2DTri_cFv() { #include "asm/d/d_drawlist/draw__13dDlst_2DTri_cFv.s" } #pragma pop +#endif /* 80051CF0-80051E5C 04C630 016C+00 1/0 0/0 0/0 .text draw__14dDlst_2DQuad_cFv */ +// regalloc +#ifdef NONMATCHING +void dDlst_2DQuad_c::draw() { + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); + GXSetChanMatColor(GX_COLOR0A0, field_0xc); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXLoadPosMtxImm(mDoMtx_getIdentity(), GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + i_GXPosition3s16(field_0x4, field_0x6, 0); + i_GXPosition3s16(field_0x8, field_0x6, 0); + i_GXPosition3s16(field_0x8, field_0xa, 0); + i_GXPosition3s16(field_0x4, field_0xa, 0); + i_GXEnd(); + dComIfGp_getCurrentGrafPort()->setup2D(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -326,8 +470,32 @@ extern "C" asm void draw__14dDlst_2DQuad_cFv() { #include "asm/d/d_drawlist/draw__14dDlst_2DQuad_cFv.s" } #pragma pop +#endif /* 80051E5C-80051F98 04C79C 013C+00 1/0 0/0 0/0 .text draw__15dDlst_2DPoint_cFv */ +// vtable data +#ifdef NONMATCHING +void dDlst_2DPoint_c::draw() { + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); + GXSetChanMatColor(GX_COLOR0A0, field_0x8); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXSetPointSize(field_0xc, GX_TO_ZERO); + GXLoadPosMtxImm(mDoMtx_getIdentity(), GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + GXBegin(GX_POINTS, GX_VTXFMT0, 1); + i_GXPosition3s16(field_0x4, field_0x6, 0); + i_GXEnd(); + dComIfGp_getCurrentGrafPort()->setup2D(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -337,6 +505,7 @@ extern "C" asm void draw__15dDlst_2DPoint_cFv() { #include "asm/d/d_drawlist/draw__15dDlst_2DPoint_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80450648-8045064C 0000C8 0004+00 1/1 0/0 0/0 .sdata l_color$4033 */ @@ -367,6 +536,65 @@ SECTION_SDATA2 static f64 lit_4076 = 4503599627370496.0 /* cast u32 to float */; SECTION_SDATA2 static f64 lit_4079 = 4503601774854144.0 /* cast s32 to float */; /* 80051F98-80052354 04C8D8 03BC+00 1/0 0/0 0/0 .text draw__11dDlst_2DT_cFv */ +// regalloc +#ifdef NONMATCHING +void dDlst_2DT_c::draw() { + f32 var5 = field_0xe; + f32 var6 = field_0x10; + f32 var11 = (field_0x16 - field_0x12) * 0.5f / field_0x24; + f32 var12 = (field_0x18 - field_0x14) * 0.5f / field_0x28; + u16 var1 = (field_0x1c - var11) / var5 * 32768.0f; + u16 var2 = (field_0x20 - var12) / var6 * 32768.0f; + u16 var3 = (field_0x1c + var11) / var5 * 32768.0f; + u16 var4 = (field_0x20 + var12) / var6 * 32768.0f; + + GXTexObj tex; + GXInitTexObj(&tex, field_0x4, field_0xe, field_0x10, (GXTexFmt)field_0xc, GX_CLAMP, GX_CLAMP, GX_FALSE); + GXInitTexObjLOD(&tex, GX_LINEAR, GX_LINEAR, 0.0, 0.0, 0.0, 0, 0, GX_ANISO_1); + GXLoadTexObj(&tex, GX_TEXMAP0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBX8, 0xf); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); + l_color_4033.a = field_0xd; + GXSetNumTexGens(1); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE); + GXSetZCompLoc(GX_FALSE); + GXSetZMode(GX_DISABLE, GX_ALWAYS, GX_DISABLE); + GXSetBlendMode(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_SET); + GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0); + GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor); + GXSetCullMode(GX_CULL_NONE); + GXSetDither(GX_TRUE); + GXLoadPosMtxImm(mDoMtx_getIdentity(), GX_PNMTX0); + GXSetChanMatColor(GX_COLOR0A0, l_color_4033); + GXSetClipMode(GX_CLIP_DISABLE); + GXSetCurrentMtx(GX_PNMTX0); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + i_GXPosition3s16(field_0x12, field_0x14, 0); + GXColor1u32(0xffffffff); + i_GXTexCoord2u16(var1, var2); + i_GXPosition3s16(field_0x16, field_0x14, 0); + GXColor1u32(0xffffffff); + i_GXTexCoord2u16(var3, var2); + i_GXPosition3s16(field_0x16, field_0x18, 0); + GXColor1u32(0xffffffff); + i_GXTexCoord2u16(var3, var4); + i_GXPosition3s16(field_0x12, field_0x18, 0); + GXColor1u32(0xffffffff); + i_GXTexCoord2u16(var1, var4); + i_GXEnd(); + GXSetClipMode(GX_CLIP_ENABLE); + dComIfGp_getCurrentGrafPort()->setup2D(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -376,12 +604,211 @@ extern "C" asm void draw__11dDlst_2DT_cFv() { #include "asm/d/d_drawlist/draw__11dDlst_2DT_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80452028-8045202C 000628 0004+00 10/10 0/0 0/0 .sdata2 @4270 */ SECTION_SDATA2 static f32 lit_4270 = 1.0f; /* 80052354-80052B00 04CC94 07AC+00 1/0 0/0 0/0 .text draw__12dDlst_2DT2_cFv */ +// vtable data +#ifdef NONMATCHING +void dDlst_2DT2_c::draw() { + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA6, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXLoadTexObj(&mTexObj, GX_TEXMAP0); + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, field_0x3c); + GXSetTevColor(GX_TEVREG1, field_0x40); + GXSetNumTexGens(1); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + if (field_0x46) { + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0); + } else { + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_A1, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + } + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetZCompLoc(GX_FALSE); + GXSetZMode(GX_DISABLE, GX_ALWAYS, GX_DISABLE); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor); + GXSetCullMode(GX_CULL_NONE); + GXSetDither(GX_TRUE); + GXLoadPosMtxImm(mDoMtx_getIdentity(), GX_PNMTX0); + GXSetClipMode(GX_CLIP_DISABLE); + GXSetCurrentMtx(GX_PNMTX0); + f32 f31 = field_0x24 + field_0x2c; + f32 f30 = field_0x28 + field_0x30; + if (field_0x44 && field_0x45) { + f32 f29 = field_0x24 + field_0x2c * 0.5f; + f32 f28 = field_0x28 + field_0x30 * 0.5f; + f32 f27; + f32 f26; + if (mScaleX == 0.0f) { + f27 = 0.0f; + f26 = 0.0f; + } else { + f27 = 1.0f - 1.0f / mScaleX; + f26 = 1.0f; + } + f32 f25; + f32 f24; + if (mScaleY == 0.0f) { + f25 = 0.0f; + f24 = 0.0f; + } else { + f25 = 1.0f - 1.0f / mScaleY; + f24 = 1.0f; + } + GXBegin(GX_QUADS, GX_VTXFMT0, 16); + GXPosition2f32(field_0x24, field_0x28); + GXTexCoord2f32(f27, f25); + GXPosition2f32(f29, field_0x28); + GXTexCoord2f32(f26, f25); + GXPosition2f32(f29, f28); + GXTexCoord2f32(f26, f24); + GXPosition2f32(field_0x24, f28); + GXTexCoord2f32(f27, f24); + GXPosition2f32(f29, field_0x28); + GXTexCoord2f32(f26, f25); + GXPosition2f32(f31, field_0x28); + GXTexCoord2f32(f27, f25); + GXPosition2f32(f31, f28); + GXTexCoord2f32(f27, f24); + GXPosition2f32(f29, f28); + GXTexCoord2f32(f26, f24); + GXPosition2f32(field_0x24, f28); + GXTexCoord2f32(f27, f24); + GXPosition2f32(f29, f28); + GXTexCoord2f32(f26, f24); + GXPosition2f32(f29, f30); + GXTexCoord2f32(f26, f25); + GXPosition2f32(field_0x24, f30); + GXTexCoord2f32(f27, f25); + GXPosition2f32(f29, f28); + GXTexCoord2f32(f26, f24); + GXPosition2f32(f31, f28); + GXTexCoord2f32(f27, f24); + GXPosition2f32(f31, f30); + GXTexCoord2f32(f27, f25); + GXPosition2f32(f29, f30); + GXTexCoord2f32(f26, f25); + i_GXEnd(); + } else if (field_0x44) { + f32 f28 = field_0x24 + field_0x2c * 0.5f; + f32 f29; + f32 f27; + if (mScaleX == 0.0f) { + f29 = 0.0f; + f27 = 0.0f; + } else { + f29 = 1.0f - 1.0f / mScaleX; + f27 = 1.0f; + } + f32 f24; + if (mScaleY == 0.0f) { + f24 = 1.0f; + } else { + f24 = 0.5f - (1.0f / mScaleY) * 0.5f; + } + GXBegin(GX_QUADS, GX_VTXFMT0, 8); + GXPosition2f32(field_0x24, field_0x28); + GXTexCoord2f32(f29, f24); + GXPosition2f32(f28, field_0x28); + GXTexCoord2f32(f27, f24); + GXPosition2f32(f28, f30); + GXTexCoord2f32(f27, 1.0f); + GXPosition2f32(field_0x24, f30); + GXTexCoord2f32(f29, 1.0f); + GXPosition2f32(f28, field_0x28); + GXTexCoord2f32(f27, f24); + GXPosition2f32(f31, field_0x28); + GXTexCoord2f32(f29, f24); + GXPosition2f32(f31, f30); + GXTexCoord2f32(f29, 1.0f); + GXPosition2f32(f28, f30); + GXTexCoord2f32(f27, 1.0f); + i_GXEnd(); + } else if (field_0x45) { + f32 f24 = field_0x28 + 0.5f * field_0x30; + f32 f25; + f32 f26; + if (mScaleX == 0.0f) { + f25 = 1.0f; + f26 = 1.0f; + } else { + f25 = 0.5f - (1.0f / mScaleX * 0.5f); + f26 = 0.5f + (1.0f / mScaleX * 0.5f); + } + f32 f27; + f32 f28; + if (mScaleY == 0.0f) { + f27 = 0.0f; + f28 = 0.0f; + } else { + f27 = 1.0f - 1.0f / mScaleY; + f28 = 1.0f; + } + GXBegin(GX_QUADS, GX_VTXFMT0, 8); + GXPosition2f32(field_0x24, field_0x28); + GXTexCoord2f32(f25, f27); + GXPosition2f32(f31, field_0x28); + GXTexCoord2f32(f26, f27); + GXPosition2f32(f31, f24); + GXTexCoord2f32(f26, f28); + GXPosition2f32(field_0x24, f24); + GXTexCoord2f32(f25, f28); + GXPosition2f32(field_0x24, f24); + GXTexCoord2f32(f25, f28); + GXPosition2f32(f31, f24); + GXTexCoord2f32(f26, f28); + GXPosition2f32(f31, f30); + GXTexCoord2f32(f26, f27); + GXPosition2f32(field_0x24, f30); + GXTexCoord2f32(f25, f27); + i_GXEnd(); + } else { + f32 f24; + f32 f25; + if (mScaleX == 0.0f) { + f24 = 0.0f; + f25 = 0.0f; + } else { + f24 = 0.5f - (1.0f / mScaleX * 0.5f); + f25 = 0.5f + (1.0f / mScaleX * 0.5f); + } + f32 f26; + f32 f27; + if (mScaleY == 0.0f) { + f26 = 0.0f; + f27 = 0.0f; + } else { + f26 = 0.5f - (1.0f / mScaleY * 0.5f); + f27 = 0.5f + (1.0f / mScaleY * 0.5f); + } + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition2f32(field_0x24, field_0x28); + GXTexCoord2f32(f24, f26); + GXPosition2f32(f31, field_0x28); + GXTexCoord2f32(f25, f26); + GXPosition2f32(f31, f30); + GXTexCoord2f32(f25, f27); + GXPosition2f32(field_0x24, f30); + GXTexCoord2f32(f24, f27); + i_GXEnd(); + } + GXSetClipMode(GX_CLIP_ENABLE); + dComIfGp_getCurrentGrafPort()->setup2D(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -391,6 +818,7 @@ extern "C" asm void draw__12dDlst_2DT2_cFv() { #include "asm/d/d_drawlist/draw__12dDlst_2DT2_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 803A87A0-803A87C0 0058C0 000C+14 2/2 0/0 0/0 .data cNullVec__6Z2Calc */ @@ -724,6 +1152,69 @@ void dDlst_2DT2_c::init(ResTIMG* i_timg, f32 param_1, f32 param_2, f32 param_3, SECTION_SDATA2 static f32 lit_4360 = 256.0f; /* 80052C58-8005312C 04D598 04D4+00 1/0 0/0 0/0 .text draw__11dDlst_2DM_cFv */ +// regalloc +#ifdef NONMATCHING +void dDlst_2DM_c::draw() { + s16 r31 = field_0x22; + s16 r30 = field_0x24; + int r29 = field_0x22 + 256.0f; + int r28 = field_0x24 + 256.0f; + f32 f4 = 256.0f / field_0x2e; + f32 f3 = 256.0f / field_0x30; + int r27 = field_0x32 * f4; + int r26 = field_0x34 * f3; + s16 r25 = r27 + s16(field_0x1e * f4); + s16 r24 = r26 + s16(field_0x20 * f3); + GXTexObj tex[2]; + GXInitTexObj(&tex[0], field_0x18, field_0x1e, field_0x20, GXTexFmt(field_0x1c), GX_CLAMP, GX_CLAMP, 0); + GXInitTexObjLOD(&tex[0], GX_LINEAR, GX_LINEAR, 0.0, 0.0, 0.0, 0, 0, GX_ANISO_1); + GXTexWrapMode wrap = field_0xc ? GX_REPEAT : GX_CLAMP; + GXInitTexObj(&tex[1], field_0x28, field_0x2e, field_0x30, GXTexFmt(field_0x2c), wrap, wrap, 0); + GXInitTexObjLOD(&tex[1], GX_LINEAR, GX_LINEAR, 0.0, 0.0, 0.0, 0, 0, GX_ANISO_1); + GXLoadTexObj(&tex[0], GX_TEXMAP0); + GXLoadTexObj(&tex[1], GX_TEXMAP1); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_CLR_RGBA, GX_RGBA4, 8); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT); + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, field_0xd); + GXSetTevColor(GX_TEVREG1, field_0x11); + GXSetNumTexGens(2); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_IDENTITY); + GXSetNumTevStages(2); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_A1, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + i_GXPosition3s16(field_0x4, field_0x6, 0); + GXTexCoord2s16(r31, r30); + GXTexCoord2s16(r27, r26); + i_GXPosition3s16(field_0x8, field_0x6, 0); + GXTexCoord2s16(r29, r30); + GXTexCoord2s16(r25, r26); + i_GXPosition3s16(field_0x8, field_0xa, 0); + GXTexCoord2s16(r29, r28); + GXTexCoord2s16(r25, r24); + i_GXPosition3s16(field_0x4, field_0xa, 0); + GXTexCoord2s16(r31, r28); + GXTexCoord2s16(r27, r24); + i_GXEnd(); + dComIfGp_getCurrentGrafPort()->setup2D(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -733,8 +1224,75 @@ extern "C" asm void draw__11dDlst_2DM_cFv() { #include "asm/d/d_drawlist/draw__11dDlst_2DM_cFv.s" } #pragma pop +#endif /* 8005312C-8005364C 04DA6C 0520+00 1/0 0/0 0/0 .text draw__11dDlst_2Dm_cFv */ +// regalloc +#ifdef NONMATCHING +void dDlst_2Dm_c::draw() { + s16 r31 = field_0x48; + s16 r30 = field_0x4a; + int r29 = field_0x48 + 256.0f; + int r28 = field_0x4a + 256.0f; + f32 f31 = field_0xc * 256.0f / GXGetTexObjWidth(&field_0x50); + f32 f30 = field_0x10 * 256.0f / GXGetTexObjHeight(&field_0x50); + int r27 = field_0x7c * f31; + int r26 = field_0x7e * f30; + s16 r25 = r27 + s16(f31 * GXGetTexObjWidth(&field_0x1c)); + s16 r24 = r26 + s16(f30 * GXGetTexObjHeight(&field_0x1c)); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_CLR_RGBA, GX_RGBA4, 8); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT); + GXLoadTexObj(&field_0x1c, GX_TEXMAP0); + if (field_0x4c) { + GXLoadTlut(&field_0x3c, GXGetTexObjTlut(&field_0x1c)); + } + GXLoadTexObj(&field_0x50, GX_TEXMAP1); + if (field_0x80) { + GXLoadTlut(&field_0x70, GXGetTexObjTlut(&field_0x50)); + } + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, field_0x14); + GXSetTevColor(GX_TEVREG1, field_0x18); + GXSetNumTexGens(2); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_IDENTITY); + GXSetNumTevStages(2); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_A1, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXLoadPosMtxImm(g_mDoMtx_identity, GX_PNMTX0); + GXSetCurrentMtx(0); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + i_GXPosition3s16(field_0x4, field_0x6, 0); + GXTexCoord2s16(r31, r30); + GXTexCoord2s16(r27, r26); + i_GXPosition3s16(field_0x8, field_0x6, 0); + GXTexCoord2s16(r29, r30); + GXTexCoord2s16(r25, r26); + i_GXPosition3s16(field_0x8, field_0xa, 0); + GXTexCoord2s16(r29, r28); + GXTexCoord2s16(r25, r24); + i_GXPosition3s16(field_0x4, field_0xa, 0); + GXTexCoord2s16(r31, r28); + GXTexCoord2s16(r27, r24); + i_GXEnd(); + dComIfGp_getCurrentGrafPort()->setup2D(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -744,8 +1302,84 @@ extern "C" asm void draw__11dDlst_2Dm_cFv() { #include "asm/d/d_drawlist/func_8005312C.s" } #pragma pop +#endif /* 8005364C-800539DC 04DF8C 0390+00 1/0 0/0 0/0 .text draw__12dDlst_2DMt_cFv */ +// regalloc +#ifdef NONMATCHING +void dDlst_2DMt_c::draw() { + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + dDlst_2DMt_tex_c* r27 = field_0x8; + int r28 = 0; + int r30 = 0; + for (int i = 0; i < field_0x4; i++) { + if (r27->check()) { + if (r27->getCI()) { + GXLoadTlut(r27->getTlutObj(), i); + } + GXLoadTexObj(r27->getTexObj(), GXTexMapID(r28)); + GXSetVtxAttrFmt(GX_VTXFMT0, GXAttr(GX_VA_TEX0 + r28), GX_CLR_RGBA, GX_RGBA6, 0); + GXSetVtxDesc(GXAttr(GX_VA_TEX0 + r28), GX_DIRECT); + GXSetTevColor(GXTevRegID(GX_TEVREG0 + r28), r27->mColor); + GXSetTexCoordGen(GXTexCoordID(r28), GX_TG_MTX2x4, GXTexGenSrc(GX_TG_TEX0 + r28), GX_IDENTITY); + GXSetTevOrder(GXTevStageID(r28), GXTexCoordID(r28), GXTexMapID(r28), GX_COLOR_NULL); + GXSetTevColorIn(GXTevStageID(r28), GX_CC_ZERO, GXTevColorArg(GX_CC_C0 + r30), GX_CC_TEXC, r28 ? GX_CC_CPREV : GX_CC_ZERO); + GXSetTevColorOp(GXTevStageID(r28), GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GXTevStageID(r28), GX_CA_ZERO, GXTevAlphaArg(GX_CA_A0 + r28), GX_CA_TEXA, r28 ? GX_CA_APREV : GX_CA_ZERO); + GXSetTevAlphaOp(GXTevStageID(r28), GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + r28++; + r30 += 2; + if (r28 >= 3) { + break; + } + } + r27++; + } + if (r28) { + GXSetNumChans(0); + GXSetNumTexGens(r28); + GXSetNumTevStages(r28); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + i_GXPosition3s16(field_0xc, field_0xe, 0); + dDlst_2DMt_tex_c* tmp = field_0x8; + for (int i = 0; i < field_0x4; i++) { + if (tmp->check()) { + GXTexCoord2f32(tmp->getS(), tmp->getT()); + } + tmp++; + } + i_GXPosition3s16(field_0x10, field_0xe, 0); + tmp = field_0x8; + for (int i = 0; i < field_0x4; i++) { + if (tmp->check()) { + GXTexCoord2f32(tmp->getS() + tmp->getSw(), tmp->getT()); + } + tmp++; + } + i_GXPosition3s16(field_0x10, field_0x12, 0); + tmp = field_0x8; + for (int i = 0; i < field_0x4; i++) { + if (tmp->check()) { + GXTexCoord2f32(tmp->getS() + tmp->getSw(), tmp->getT() + tmp->getTw()); + } + tmp++; + } + i_GXPosition3s16(field_0xc, field_0x12, 0); + tmp = field_0x8; + for (int i = 0; i < field_0x4; i++) { + if (tmp->check()) { + GXTexCoord2f32(tmp->getS(), tmp->getT() + tmp->getTw()); + } + tmp++; + } + i_GXEnd(); + dComIfGp_getCurrentGrafPort()->setup2D(); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -755,6 +1389,7 @@ extern "C" asm void draw__12dDlst_2DMt_cFv() { #include "asm/d/d_drawlist/draw__12dDlst_2DMt_cFv.s" } #pragma pop +#endif /* 800539DC-80053A00 04E31C 0024+00 0/0 1/0 0/0 .text getTexture__10J2DPictureCFUc */ #pragma push @@ -948,6 +1583,52 @@ f32 cM_rnd_c::getValue(f32 param_0, f32 param_1) { SECTION_SDATA2 static f32 lit_4876 = 32767.0f; /* 80053E9C-800541F4 04E7DC 0358+00 1/0 0/0 0/0 .text draw__18dDlst_effectLine_cFv */ +// vtable data +#ifdef NONMATCHING +void dDlst_effectLine_c::draw() { + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0, 0, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_NONE); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetTevColor(GX_TEVREG0, mLineColor); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetZMode(GX_DISABLE, GX_LEQUAL, GX_DISABLE); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR); + GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0); + GXSetCullMode(GX_CULL_NONE); + GXLoadPosMtxImm(j3dSys.mViewMtx, GX_PNMTX0); + GXSetClipMode(GX_CLIP_ENABLE); + GXSetCurrentMtx(0); + int r31 = getRndValue(field_0x20, field_0x22); + cXyz local_68; + cXyz local_74; + for (int i = 0; i < r31; i++) { + int r23 = getRndFX(32767.0f); + float tmp = getRndValue(field_0x28, field_0x2c); + local_68.x = field_0x10.x + tmp * cM_ssin(r23); + local_68.y = field_0x10.y + tmp * cM_scos(r23); + local_68.z = field_0x10.z; + tmp = getRndValue(field_0x30, field_0x34); + local_74.x = local_68.x + tmp * cM_ssin(r23); + local_74.y = local_68.y + tmp * cM_scos(r23); + local_74.z = field_0x10.z; + cMtx_multVec(dComIfGd_getInvViewMtx(), &local_68, &local_68); + cMtx_multVec(dComIfGd_getInvViewMtx(), &local_74, &local_74); + GXSetLineWidth(getRndValue(field_0x24, field_0x26), GX_TO_ZERO); + GXBegin(GX_LINES, GX_VTXFMT0, 2); + GXPosition3f32(local_68.x, local_68.y, local_68.z); + GXPosition3f32(local_74.x, local_74.y, local_74.z); + i_GXEnd(); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -957,6 +1638,7 @@ extern "C" asm void draw__18dDlst_effectLine_cFv() { #include "asm/d/d_drawlist/draw__18dDlst_effectLine_cFv.s" } #pragma pop +#endif /* 800541F4-80054288 04EB34 0094+00 0/0 1/1 0/0 .text * update__18dDlst_effectLine_cFR4cXyzR8_GXColorUsUsUsUsffff */ @@ -1081,9 +1763,9 @@ void dDlst_shadowReal_c::draw() { GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); - GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); - GXSetCurrentMtx(0); - GXLoadTexMtxImm(mReceiverProjMtx, 30, GX_MTX3x4); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetCurrentMtx(GX_PNMTX0); + GXLoadTexMtxImm(mReceiverProjMtx, GX_TEXMTX0, GX_MTX3x4); mShadowRealPoly.draw(); } @@ -1096,15 +1778,32 @@ SECTION_SDATA2 static f32 lit_5062 = -90.0f; /* 80054688-80054854 04EFC8 01CC+00 1/1 0/0 0/0 .text * psdRealCallBack__FP13cBgS_ShdwDrawP10cBgD_Vtx_tiiiP8cM3dGPla */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm int psdRealCallBack(cBgS_ShdwDraw* param_0, cBgD_Vtx_t* param_1, int param_2, +static int psdRealCallBack(cBgS_ShdwDraw* param_0, cBgD_Vtx_t* param_1, int param_2, int param_3, int param_4, cM3dGPla* param_5) { - nofralloc -#include "asm/d/d_drawlist/psdRealCallBack__FP13cBgS_ShdwDrawP10cBgD_Vtx_tiiiP8cM3dGPla.s" + ShdwDrawPoly_c* shdwDrawPoly = (ShdwDrawPoly_c*)param_0; + const cXyz* normal = param_5->i_GetNP(); + if (shdwDrawPoly->getLightVec()->inprod(*normal) < -0.2f) { + cXyz* center = shdwDrawPoly->getCenter(); + if (normal->x * center->x + normal->y * center->y + normal->z * center->z + param_5->GetD() > -90.f) { + const cXyz* min = shdwDrawPoly->GetBndP()->GetMinP(); + const cXyz* max = shdwDrawPoly->GetBndP()->GetMaxP(); + cBgD_Vtx_t* vert1 = param_1 + param_2; + cBgD_Vtx_t* vert2 = param_1 + param_3; + cBgD_Vtx_t* vert3 = param_1 + param_4; + if ((vert1->y < min->y && vert2->y < min->y && vert3->y < min->y) + || (vert1->y > max->y && vert2->y > max->y && vert3->y > max->y) + || (vert1->x < min->x && vert2->x < min->x && vert3->x < min->x) + || (vert1->x > max->x && vert2->x > max->x && vert3->x > max->x) + || (vert1->z < min->z && vert2->z < min->z && vert3->z < min->z) + || (vert1->z > max->z && vert2->z > max->z && vert3->z > max->z)) { + return 1; + } else { + return shdwDrawPoly->getPoly()->set(param_1, param_2, param_3, param_4, param_5); + } + } + } + return 1; } -#pragma pop /* ############################################################################################## */ /* 80452058-8045205C 000658 0004+00 1/1 0/0 0/0 .sdata2 @5127 */ @@ -1121,34 +1820,60 @@ SECTION_SDATA2 static f32 lit_5130 = 10000.0f; /* 80054854-80054A6C 04F194 0218+00 1/1 0/0 0/0 .text * realPolygonCheck__FP4cXyzffP4cXyzP18dDlst_shadowPoly_c */ +// vtable data +#ifdef NONMATCHING +static BOOL realPolygonCheck(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, + dDlst_shadowPoly_c* param_4) { + ShdwDrawPoly_c shdwDrawPoly; + cXyz local_8c; + cXyz local_98; + f32 var1 = param_1 + param_2 - cLib_maxLimit(param_1 * param_1 * 0.002f, 120.0f); + local_8c.y = param_0->y - var1; + local_98.y = param_0->y + param_1 * 0.15f; + local_98.x = param_0->x + param_3->x * var1; + if (local_98.x < param_0->x) { + local_8c.x = local_98.x; + local_98.x = param_0->x; + } else { + local_8c.x = param_0->x; + } + local_8c.x -= param_1; + local_98.x += param_1; + var1 = param_0->z + param_3->z * var1; + local_98.z = var1; + if (var1 < param_0->z) { + local_8c.z = local_98.z; + local_98.z = param_0->z; + } else { + local_8c.z = param_0->z; + } + local_8c.z -= param_1; + local_98.z += param_1; + mDoLib_clipper::changeFar(mDoLib_clipper::getFovyRate() * 10000.0f); + s32 clip = mDoLib_clipper::clip(j3dSys.getViewMtx(), &local_98, &local_8c); + mDoLib_clipper::resetFar(); + if (clip) { + return FALSE; + } + shdwDrawPoly.Set(local_8c, local_98); + shdwDrawPoly.SetCallback(psdRealCallBack); + shdwDrawPoly.setCenter(param_0); + shdwDrawPoly.setLightVec(param_3); + shdwDrawPoly.setPoly(param_4); + dComIfG_Bgsp().ShdwDraw(&shdwDrawPoly); + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -static asm void realPolygonCheck(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, +static asm BOOL realPolygonCheck(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, dDlst_shadowPoly_c* param_4) { nofralloc #include "asm/d/d_drawlist/realPolygonCheck__FP4cXyzffP4cXyzP18dDlst_shadowPoly_c.s" } #pragma pop - -/* static void realPolygonCheck(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, - dDlst_shadowPoly_c* param_4) { - ShdwDrawPoly_c draw_poly; - cXyz sp1C; - cXyz sp10; - - f32 var_f1 = cLib_maxLimit(param_1 * param_1 * 0.002f, 120.0f); - f32 temp_f2 = (param_1 + param_2) - var_f1; - - sp1C.y = param_0->y - temp_f2; - sp10.y = param_0->y + (param_1 * 0.15f); - sp1C.x = param_0->x + (param_3->x * temp_f2); - - if (sp1C.x < param_0->x) { - sp1C.x = sp10.x; - sp - } -} */ +#endif /* 80054A6C-80054ACC 04F3AC 0060+00 1/0 0/0 0/0 .text __dt__14ShdwDrawPoly_cFv */ #pragma push @@ -1249,6 +1974,64 @@ SECTION_SDATA2 static f32 lit_5275 = -0.5f; /* 80054BD0-80055028 04F510 0458+00 1/1 0/0 0/0 .text * setShadowRealMtx__18dDlst_shadowReal_cFP4cXyzP4cXyzfffP12dKy_tevstr_c */ +// g_envHIO +#ifdef NONMATCHING +u8 dDlst_shadowReal_c::setShadowRealMtx(cXyz* param_0, cXyz* param_1, f32 param_2, f32 param_3, + f32 param_4, dKy_tevstr_c* param_5) { + mShadowRealPoly.reset(); + setkankyoShadow(param_5, ¶m_4); + int r29 = g_envHIO.mOther.mShadowDensity * param_4; + cXyz local_64 = *param_0 - *param_1; + u8 r28 = 0; + if (param_5) { + cLib_chaseUC(¶m_5->field_0x385, param_3 > 50.0f ? 0 : 0xff, 60); + r28 = param_5->field_0x385; + } + f32 f29 = local_64.abs2(); + if (!cM3d_IsZero(f29)) { + f32 tmp = JMAFastSqrt(f29); + if (local_64.y / tmp < 0.8f) { + local_64.y = tmp * 0.8f; + f32 tmp2 = local_64.abs2XZ(); + if (!cM3d_IsZero(tmp2)) { + f32 tmp3 = JMAFastSqrt((f29 - local_64.y * local_64.y) / tmp2); + local_64.x *= tmp3; + local_64.z *= tmp3; + } + } + if (r28 == 0) { + local_64.x = 0.0f; + local_64.z = 0.0f; + } else if (r28 < 0xff) { + f32 tmp4 = r28 / 255.0f; + local_64.x *= tmp4; + local_64.z *= tmp4; + } + f29 = local_64.abs(); + if (!cM3d_IsZero(f29)) { + f29 = (param_2 * 0.5f) / f29; + } + } + local_64 *= f29; + local_64 += *param_1; + param_2 = param_2 * 0.4f; + cXyz local_70 = *param_1 - local_64; + if (local_70.isZero()) { + local_70.y = -1.0f; + local_64.y = param_1->y + 1.0f; + } else { + local_70.normalize(); + } + if (!realPolygonCheck(param_1, param_2, param_3, &local_70, &mShadowRealPoly)) { + return 0; + } + cMtx_lookAt(mViewMtx, &local_64, param_1, 0); + C_MTXOrtho(mRenderProjMtx, param_2, -param_2, -param_2, param_2, 1.0f, 10000.0f); + C_MTXLightOrtho(mReceiverProjMtx, param_2, -param_2, -param_2, param_2, 0.5f, -0.5f, 0.5f, 0.5f); + cMtx_concat(mReceiverProjMtx, mViewMtx, mReceiverProjMtx); + return r29; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1258,6 +2041,7 @@ asm u8 dDlst_shadowReal_c::setShadowRealMtx(cXyz* param_0, cXyz* param_1, f32 pa #include "asm/d/d_drawlist/setShadowRealMtx__18dDlst_shadowReal_cFP4cXyzP4cXyzfffP12dKy_tevstr_c.s" } #pragma pop +#endif /* 80055028-800551D4 04F968 01AC+00 1/1 0/0 0/0 .text * set__18dDlst_shadowReal_cFUlP8J3DModelP4cXyzffP12dKy_tevstr_cff */ @@ -1322,13 +2106,13 @@ void dDlst_shadowSimple_c::draw() { GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_INDEX8); GXLoadPosMtxImm(mVolumeMtx, GX_PNMTX0); - GXSetCurrentMtx(0); + GXSetCurrentMtx(GX_PNMTX0); GXCallDisplayList(l_frontMat, 0x40); GXCallDisplayList(l_shadowVolumeDL, 0x40); GXCallDisplayList(l_backSubMat, 0x20); GXCallDisplayList(l_shadowVolumeDL, 0x40); GXLoadPosMtxImm(mMtx, GX_PNMTX1); - GXSetCurrentMtx(3); + GXSetCurrentMtx(GX_PNMTX1); if (mpTexObj != NULL) { GXLoadTexObj(mpTexObj, GX_TEXMAP0); @@ -1352,7 +2136,7 @@ void dDlst_shadowSimple_c::draw() { GXCallDisplayList(l_shadowSealDL, 0x60); GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_INDEX8); - GXSetCurrentMtx(0); + GXSetCurrentMtx(GX_PNMTX0); GXCallDisplayList(l_clearMat, 0x40); GXCallDisplayList(l_shadowVolumeDL, 0x40); } @@ -1372,6 +2156,60 @@ SECTION_SDATA2 static f32 lit_5378 = 16.0f; /* 800553EC-80055684 04FD2C 0298+00 1/1 0/0 0/0 .text * set__20dDlst_shadowSimple_cFP4cXyzffP4cXyzsfP9_GXTexObj */ +// g_envHIO +#ifdef NONMATCHING +void dDlst_shadowSimple_c::set(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, + s16 param_4, f32 param_5, _GXTexObj* param_6) { + if (param_5 < 0.0f) { + mAlpha = param_5 * -255.0f; + param_5 = 1.0f; + } else { + float local_a4 = 1.0f - (param_0->y - param_1) * 0.0007f; + if (local_a4 < 0.0f) { + local_a4 = 0.0f; + } else if (local_a4 > 1.0f) { + local_a4 = 1.0f; + } + setkankyoShadow(NULL, &local_a4); + local_a4 *= 1.4f; + if (local_a4 > 1.0f) { + local_a4 = 1.0f; + } + mAlpha = g_envHIO.mOther.mShadowDensity * local_a4; + } + f32 f30 = param_2 * 16.0f * (1.0f - param_3->y) + 2.0f; + mDoMtx_stack_c::transS(param_0->x, param_1 + f30, param_0->z); + mDoMtx_stack_c::YrotM(param_4); + mDoMtx_stack_c::scaleM(param_2, f30 + f30 + 16.0f, param_2 * param_5); + cMtx_concat(j3dSys.getViewMtx(), mDoMtx_stack_c::get(), mVolumeMtx); + f32 f31 = JMAFastSqrt(1.0f - param_3->x * param_3->x); + f32 f29; + f32 f28; + if (0.0f != f31) { + f29 = param_3->y * f31; + f28 = -param_3->z * f31; + } else { + f29 = 0.0f; + f28 = 0.0f; + } + mDoMtx_stack_c::get()[0][0] = f31; + mDoMtx_stack_c::get()[0][1] = param_3->x; + mDoMtx_stack_c::get()[0][2] = 0.0f; + mDoMtx_stack_c::get()[0][3] = param_0->x; + mDoMtx_stack_c::get()[1][0] = -param_3->x * f29; + mDoMtx_stack_c::get()[1][1] = param_3->y; + mDoMtx_stack_c::get()[1][2] = f28; + mDoMtx_stack_c::get()[1][3] = param_1; + mDoMtx_stack_c::get()[2][0] = param_3->x * f28; + mDoMtx_stack_c::get()[2][1] = param_3->z; + mDoMtx_stack_c::get()[2][2] = f29; + mDoMtx_stack_c::get()[2][3] = param_0->z; + mDoMtx_stack_c::YrotM(param_4); + mDoMtx_stack_c::scaleM(param_2, 1.0f, param_2 * param_5); + cMtx_concat(j3dSys.getViewMtx(), mDoMtx_stack_c::get(), mMtx); + mpTexObj = param_6; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1381,6 +2219,7 @@ asm void dDlst_shadowSimple_c::set(cXyz* param_0, f32 param_1, f32 param_2, cXyz #include "asm/d/d_drawlist/set__20dDlst_shadowSimple_cFP4cXyzffP4cXyzsfP9_GXTexObj.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80450654-80450658 0000D4 0004+00 1/1 0/0 0/0 .sdata l_realImageSize$5383 */ @@ -1427,6 +2266,57 @@ void dDlst_shadowControl_c::reset() { } /* 800557C8-80055A14 050108 024C+00 0/0 1/1 0/0 .text imageDraw__21dDlst_shadowControl_cFPA4_f */ +// matches with literals +#ifdef NONMATCHING +void dDlst_shadowControl_c::imageDraw(Mtx param_0) { + GXCallDisplayList(l_matDL, 0x60); + GXSetZMode(GX_DISABLE, GX_LEQUAL, GX_DISABLE); + GXSetZCompLoc(GX_TRUE); + GXSetBlendMode(GX_BM_LOGIC, GX_BL_ONE, GX_BL_ONE, GX_LO_OR); + GXSetClipMode(GX_CLIP_DISABLE); + j3dSys.setDrawModeOpaTexEdge(); + J3DShape::resetVcdVatCache(); + dDlst_shadowReal_c* shadowReal = field_0x4; + int r29 = 0; + int tex = 0; + u16 r27; + u16 r26; + for (; shadowReal; shadowReal = shadowReal->getZsortNext()) { + if (shadowReal->isUse()) { + if (r29 == 0) { + r27 = GXGetTexObjWidth(field_0x15eb0 + tex); + r26 = r27 * 2; + GXSetViewport(0.0f, 0.0f, r26, r26, 0.0f, 1.0f); + GXSetScissor(0, 0, r26, r26); + } + GXSetTevColor(GX_TEVREG0, l_imageDrawColor[r29]); + if (r29 == 3) { + GXSetColorUpdate(GX_DISABLE); + GXSetAlphaUpdate(GX_ENABLE); + } + shadowReal->imageDraw(param_0); + r29 = (r29 + 1) % 4; + if (r29 == 0) { + GXSetTexCopySrc(0, 0, r26, r26); + GXSetTexCopyDst(r27, r27, GX_TF_TGB5A3, GX_TRUE); + GXSetColorUpdate(GX_ENABLE); + GXCopyTex(field_0x15ef0[tex++], GX_TRUE); + GXPixModeSync(); + GXSetAlphaUpdate(GX_DISABLE); + } + } + } + if (r29) { + GXSetTexCopySrc(0, 0, r26, r26); + GXSetTexCopyDst(r27, r27, GX_TF_TGB5A3, GX_TRUE); + GXCopyTex(field_0x15ef0[tex], GX_TRUE); + GXPixModeSync(); + GXSetAlphaUpdate(GX_DISABLE); + } + GXSetClipMode(GX_CLIP_ENABLE); + GXSetDither(GX_TRUE); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1435,6 +2325,7 @@ asm void dDlst_shadowControl_c::imageDraw(Mtx param_0) { #include "asm/d/d_drawlist/imageDraw__21dDlst_shadowControl_cFPA4_f.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80450658-8045065C 0000D8 0004+00 1/1 0/0 0/0 .sdata clearColor$5435 */ @@ -1452,11 +2343,11 @@ void dDlst_shadowControl_c::draw(Mtx param_0) { GXSetNumIndStages(0); dKy_GxFog_set(); - GXSetChanCtrl(GX_ALPHA0, 0, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); + GXSetChanCtrl(GX_ALPHA0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); GXSetArray(GX_VA_POS, l_shadowVolPos, 12); - GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, 30, GX_FALSE, 125); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, GX_TEXMTX0); GXSetNumTevStages(1); - GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GXLoadPosMtxImm(param_0, GX_PNMTX0); GXSetChanMatColor(GX_ALPHA0, (GXColor){0, 0, 0, 0x20}); @@ -1484,7 +2375,7 @@ void dDlst_shadowControl_c::draw(Mtx param_0) { GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGB8, 0); GXSetArray(GX_VA_POS, l_simpleShadowPos, 12); - GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 60, GX_FALSE, 125); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0); @@ -1599,12 +2490,10 @@ void dDlst_peekZ_c::peekData() { // TU vtable data order has to be fixed #ifdef NONMATCHING dDlst_list_c::dDlst_list_c() { - // these are probably fake matches, but cant figure out how to make these match here - // together with the other functions they're used in - mpCopy2DEnd = (dDlst_base_c**)&mpCopy2DStart; - mp2DOpaTopEnd = (dDlst_base_c**)&mp2DOpaTopStart; - mp2DOpaEnd = (dDlst_base_c**)&mp2DOpaStart; - mp2DXluEnd = (dDlst_base_c**)&mp2DXluStart; + mpCopy2DEnd = &mpCopy2DDrawLists[4]; + mp2DOpaTopEnd = &mp2DOpaTopDrawLists[16]; + mp2DOpaEnd = &mp2DOpaDrawLists[64]; + mp2DXluEnd = &mp2DXluDrawLists[32]; J3DDrawBuffer** buffer = mDrawBuffers; for (int i = 0; i < 21; i++) { @@ -1952,6 +2841,23 @@ void dDlst_list_c::wipeIn(f32 i_wipeSpeed) { SECTION_SDATA2 static f32 lit_5838 = 1.218000054359436f; /* 80056900-800569A0 051240 00A0+00 0/0 1/1 0/0 .text calcWipe__12dDlst_list_cFv */ +// matches with literals +#ifdef NONMATCHING +void dDlst_list_c::calcWipe() { + if (mWipe) { + mWipeRate += mWipeSpeed; + if (mWipeRate < 0.0f) { + mWipeRate = 0.0f; + } else if (mWipeRate > 1.0f) { + mWipeRate = 1.0f; + mWipe = false; + } + mWipeDlst.setScaleX(mWipeRate * 2.0f); + mWipeDlst.setScaleY(mWipeDlst.getScaleX() * 1.218f); + dComIfGd_set2DXlu(&mWipeDlst); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1960,18 +2866,26 @@ asm void dDlst_list_c::calcWipe() { #include "asm/d/d_drawlist/calcWipe__12dDlst_list_cFv.s" } #pragma pop +#endif /* 800569A0-800569A8 0512E0 0008+00 1/0 0/0 0/0 .text getTri__22dDlst_shadowRealPoly_cFv */ +// vtable data +#ifdef NONMATCHING +dDlst_shadowTri_c * dDlst_shadowRealPoly_c::getTri() { + return mShadowTri; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -// asm void dDlst_shadowRealPoly_c::getTri() { -extern "C" asm void getTri__22dDlst_shadowRealPoly_cFv() { +// asm dDlst_shadowTri_c * dDlst_shadowRealPoly_c::getTri() { +extern "C" asm dDlst_shadowTri_c * getTri__22dDlst_shadowRealPoly_cFv() { nofralloc #include "asm/d/d_drawlist/getTri__22dDlst_shadowRealPoly_cFv.s" } #pragma pop +#endif /* 800569A8-800569B0 0512E8 0008+00 1/0 0/0 0/0 .text getTriMax__22dDlst_shadowRealPoly_cFv */ s32 dDlst_shadowRealPoly_c::getTriMax() {