diff --git a/include/SSystem/SComponent/c_bg_w.h b/include/SSystem/SComponent/c_bg_w.h index ec806ff68..a8a9f45e0 100644 --- a/include/SSystem/SComponent/c_bg_w.h +++ b/include/SSystem/SComponent/c_bg_w.h @@ -2,6 +2,9 @@ #define C_BG_W_H #include "SSystem/SComponent/c_xyz.h" +#include "SSystem/SComponent/c_sxyz.h" +#include "SSystem/SComponent/c_m3d_g_aab.h" +#include "SSystem/SComponent/c_m3d_g_pla.h" #include "dolphin/mtx/mtx.h" class cBgW_BgId { @@ -27,18 +30,86 @@ public: } }; -class cBgW_TriElm; -class cBgW_RwgElm; -class cBgW_BlkElm; -class cBgW_GrpElm; -class cBgW_NodeTree; -class cBgD_t; +struct cBgD_Vtx_t; + +struct cBgD_Blk_t { + /* 0x0 */ u16 field_0x00; +}; + +struct cBgD_Tri_t { +public: + /* 0x00 */ u16 vtx0; + /* 0x02 */ u16 vtx1; + /* 0x04 */ u16 vtx2; + /* 0x06 */ u16 id; + /* 0x08 */ u16 grp; +}; + +struct cBgD_Grp_t { + /* 0x00 */ char* m_name; + /* 0x04 */ cXyz m_scale; + /* 0x10 */ csXyz m_rotation; + /* 0x18 */ cXyz m_translation; + /* 0x24 */ u16 m_parent; + /* 0x26 */ u16 m_next_sibling; + /* 0x28 */ u16 m_first_child; + /* 0x2A */ u16 m_room_id; + /* 0x2C */ u16 m_first_vtx_idx; + /* 0x2E */ u16 m_tree_idx; + /* 0x30 */ u32 m_info; +}; // Size: 0x34 + +class cBgW_NodeTree : public cM3dGAab { +public: + virtual ~cBgW_NodeTree(); +}; + +class cBgD_t { +public: + /* 0x00 */ s32 m_v_num; + /* 0x04 */ cBgD_Vtx_t* m_v_tbl; + /* 0x08 */ s32 m_t_num; + /* 0x0C */ cBgD_Tri_t* m_t_tbl; + /* 0x10 */ s32 m_b_num; + /* 0x14 */ cBgD_Blk_t* m_b_tbl; + /* 0x18 */ s32 m_tree_num; + /* 0x1C */ void* m_tree_tbl; + /* 0x20 */ s32 m_g_num; + /* 0x24 */ cBgD_Grp_t* m_g_tbl; + /* 0x28 */ s32 m_ti_num; + /* 0x2C */ void* m_ti_tbl; + /* 0x30 */ u32 flag; +}; class cBgS_LinChk; class cBgS_GndChk; class cBgS_ShdwDraw; class cBgS_PolyPassChk; class cBgS_GrpPassChk; +class cBgW_RwgElm { +public: + /* 0x00 */ u16 next; + +public: + virtual ~cBgW_RwgElm() {} +}; + +class cBgW_BlkElm; +class cBgW_TriElm { +public: + /* 0x00 */ cM3dGPla m_plane; + + virtual ~cBgW_TriElm() {} +}; + +class cBgW_GrpElm { +public: + virtual ~cBgW_GrpElm() {} + +public: + /* 0x00 */ cM3dGAab aab; +}; + class cBgW : public cBgW_BgId { public: enum Flags_e { @@ -54,7 +125,7 @@ public: void GlobalVtx(); void SetVtx(); - void SetTri(); + bool SetTri(); void BlckConnect(u16*, int*, int); void MakeBlckTransMinMax(cXyz*, cXyz*); void MakeBlckMinMax(int, cXyz*, cXyz*); @@ -62,14 +133,14 @@ public: void MakeNodeTreeRp(int); void MakeNodeTreeGrpRp(int); void MakeNodeTree(); - void ChkMemoryError(); + bool ChkMemoryError(); bool Set(cBgD_t*, u32, f32(*)[3][4]); void RwgLineCheck(u16, cBgS_LinChk*); void LineCheckRp(cBgS_LinChk*, int); void LineCheckGrpRp(cBgS_LinChk*, int, int); - void RwgGroundCheckCommon(f32, u16, cBgS_GndChk*); - void RwgGroundCheckGnd(u16, cBgS_GndChk*); - void RwgGroundCheckWall(u16, cBgS_GndChk*); + bool RwgGroundCheckCommon(f32, u16, cBgS_GndChk*); + bool RwgGroundCheckGnd(u16, cBgS_GndChk*); + bool RwgGroundCheckWall(u16, cBgS_GndChk*); void GroundCrossRp(cBgS_GndChk*, int); void GroundCrossGrpRp(cBgS_GndChk*, int, int); void CopyOldMtx(); @@ -82,14 +153,14 @@ public: void GetTopUnder(f32*, f32*) const; virtual ~cBgW(); - virtual void GetGrpToRoomIndex(int) const; + virtual u32 GetGrpToRoomIndex(int) const; virtual void CalcPlane(); virtual void ClassifyPlane(); - virtual void ChkPolyThrough(int, cBgS_PolyPassChk*); - virtual void ChkShdwDrawThrough(int, cBgS_PolyPassChk*); + virtual bool ChkPolyThrough(int, cBgS_PolyPassChk*); + virtual bool ChkShdwDrawThrough(int, cBgS_PolyPassChk*); virtual bool ChkGrpThrough(int, cBgS_GrpPassChk*, int); - /* 0x08 */ Mtx* mpModelMtx; + /* 0x08 */ Mtx* pm_base; /* 0x0C */ Mtx mOldMtx; /* 0x3C */ Mtx mCurMtx; /* 0x6C */ u8 mFlags; @@ -100,14 +171,14 @@ public: /* 0x76 */ u8 field_0x76[0x78 - 0x76]; /* 0x78 */ int mIgnorePlaneType; /* 0x7C */ cXyz mTransVel; - /* 0x88 */ cBgW_TriElm* mpTriElm; - /* 0x8C */ cBgW_RwgElm* mpRwg; - /* 0x90 */ cXyz* mpVtxTbl; - /* 0x94 */ cBgD_t* mpBgDt; - /* 0x98 */ cBgW_BlkElm* mpBlk; - /* 0x9C */ cBgW_GrpElm* mpGrp; - /* 0xA0 */ cBgW_NodeTree* mpNodeTree; - /* 0xA4 */ int mRootGrpIdx; + /* 0x88 */ cBgW_TriElm* pm_tri; + /* 0x8C */ cBgW_RwgElm* pm_rwg; + /* 0x90 */ cXyz* pm_vtx_tbl; + /* 0x94 */ cBgD_t* pm_bgd; + /* 0x98 */ cBgW_BlkElm* pm_blk; + /* 0x9C */ cBgW_GrpElm* pm_grp; + /* 0xA0 */ cBgW_NodeTree* pm_node_tree; + /* 0xA4 */ int m_rootGrpIdx; }; bool cBgW_CheckBGround(f32 a1); diff --git a/include/SSystem/SComponent/c_m3d_g_aab.h b/include/SSystem/SComponent/c_m3d_g_aab.h index a374c7759..812649689 100644 --- a/include/SSystem/SComponent/c_m3d_g_aab.h +++ b/include/SSystem/SComponent/c_m3d_g_aab.h @@ -15,6 +15,10 @@ public: virtual ~cM3dGAab() {} void SetMinMax(const cXyz&); + void Set(const cXyz& min, const cXyz& max) { + SetMin(min); + SetMax(max); + } void SetMin(const cXyz&); void SetMax(const cXyz&); const cXyz* GetMaxP(void) const { return &mMax; } diff --git a/include/SSystem/SComponent/c_m3d_g_pla.h b/include/SSystem/SComponent/c_m3d_g_pla.h index 404ddc720..0f495e445 100644 --- a/include/SSystem/SComponent/c_m3d_g_pla.h +++ b/include/SSystem/SComponent/c_m3d_g_pla.h @@ -21,11 +21,12 @@ public: } const cXyz * GetNP() const { return &mNormal; } + float getCrossY(const cXyz& i_axis) const { + return (-mNormal.x * i_axis.x - mNormal.z * i_axis.z - mD) / mNormal.y; + } void getCrossY(const cXyz& i_axis, float* i_value) const { if (!cM3d_IsZero(mNormal.y)) { - *i_value = (-mNormal.x * i_axis.x - - mNormal.z * i_axis.z - - mD) / mNormal.y; + *i_value = getCrossY(i_axis); } } diff --git a/src/SSystem/SComponent/c_bg_w.cpp b/src/SSystem/SComponent/c_bg_w.cpp index 7ff1f97eb..810b3f594 100644 --- a/src/SSystem/SComponent/c_bg_w.cpp +++ b/src/SSystem/SComponent/c_bg_w.cpp @@ -4,11 +4,17 @@ // #include "SSystem/SComponent/c_bg_w.h" +#include "SSystem/SComponent/c_bg_s_gnd_chk.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "m_Do/m_Do_printf.h" +#include "dolphin/mtx/mtxvec.h" #include "dolphin/types.h" /* 80247500-8024754C .text ASSERT_SOLDHEAP__Fv */ void ASSERT_SOLDHEAP() { - /* Nonmatching */ + if (JKRHeap::sCurrentHeap->getHeapType() != 'SLID') + OSReport_Error("*******Aバグです*******\n*******Aバグです*******\n*******Aバグです*******\ncBgWはカレントヒープがソリッドヒープ以外だと破綻します。\n必ず、カレントヒープをソリッドヒープにしてください。\nここでnewされた領域は二度と開放されることはありません。\n慢性的にメモリーリークを繰り返し、いずれ確実にAバグを引き起こすことでしょう。\n必ずp修正してください。この下の水色のメッセージにアクターの名前が書いてあるはずです。\n"); } /* 8024754C-8024760C .text __ct__4cBgWFv */ @@ -18,17 +24,30 @@ cBgW::cBgW() { /* 8024760C-8024767C .text __dt__4cBgWFv */ cBgW::~cBgW() { - /* Nonmatching */ + FreeArea(); } /* 8024767C-8024769C .text FreeArea__4cBgWFv */ void cBgW::FreeArea() { - /* Nonmatching */ + pm_tri = NULL; + pm_rwg = NULL; + pm_node_tree = NULL; + pm_blk = NULL; + pm_grp = NULL; + pm_vtx_tbl = NULL; } /* 8024769C-8024775C .text GlobalVtx__4cBgWFv */ void cBgW::GlobalVtx() { - /* Nonmatching */ + if (pm_base != NULL) { + if (!mbNeedsFullTransform) { + for (s32 i = 0; i < pm_bgd->m_v_num; i++) + VECAdd(&pm_vtx_tbl[i], &mTransVel, &pm_vtx_tbl[i]); + } else { + for (s32 i = 0; i < pm_bgd->m_v_num; i++) + MTXMultVec(*pm_base, &pm_bgd->m_v_tbl[i], &pm_vtx_tbl[i]); + } + } } /* 8024775C-80247840 .text SetVtx__4cBgWFv */ @@ -42,13 +61,23 @@ void cBgW::CalcPlane() { } /* 80247944-802479D8 .text SetTri__4cBgWFv */ -void cBgW::SetTri() { - /* Nonmatching */ +bool cBgW::SetTri() { + ASSERT_SOLDHEAP(); + pm_tri = new cBgW_TriElm[pm_bgd->m_t_num]; + if (pm_tri == NULL) + return true; + CalcPlane(); + return false; } /* 802479D8-80247A24 .text BlckConnect__4cBgWFPUsPii */ -void cBgW::BlckConnect(unsigned short*, int*, int) { - /* Nonmatching */ +void cBgW::BlckConnect(u16* rwg, int* prev, int i_no) { + if (*rwg == 0xFFFF) + *rwg = i_no; + if (*prev != 0xFFFF) + pm_rwg[*prev].next = i_no; + *prev = i_no; + pm_rwg[*prev].next = -1; } /* 80247A24-80247BF8 .text ClassifyPlane__4cBgWFv */ @@ -57,13 +86,20 @@ void cBgW::ClassifyPlane() { } /* 80247BF8-80247C4C .text MakeBlckTransMinMax__4cBgWFP4cXyzP4cXyz */ -void cBgW::MakeBlckTransMinMax(cXyz*, cXyz*) { - /* Nonmatching */ +void cBgW::MakeBlckTransMinMax(cXyz* min, cXyz* max) { + VECAdd(min, &mTransVel, min); + VECAdd(max, &mTransVel, max); } /* 80247C4C-80247CD4 .text MakeBlckMinMax__4cBgWFiP4cXyzP4cXyz */ -void cBgW::MakeBlckMinMax(int, cXyz*, cXyz*) { - /* Nonmatching */ +void cBgW::MakeBlckMinMax(int i_no, cXyz* min, cXyz* max) { + cXyz * vtx = &pm_vtx_tbl[i_no]; + if (min->x > vtx->x) min->x = vtx->x; + if (max->x < vtx->x) max->x = vtx->x; + if (min->y > vtx->y) min->y = vtx->y; + if (max->y < vtx->y) max->y = vtx->y; + if (min->z > vtx->z) min->z = vtx->z; + if (max->z < vtx->z) max->z = vtx->z; } /* 80247CD4-80247E48 .text MakeBlckBnd__4cBgWFiP4cXyzP4cXyz */ @@ -77,8 +113,24 @@ void cBgW::MakeNodeTreeRp(int) { } /* 80247F4C-80248078 .text MakeNodeTreeGrpRp__4cBgWFi */ -void cBgW::MakeNodeTreeGrpRp(int) { +void cBgW::MakeNodeTreeGrpRp(int grp_idx) { /* Nonmatching */ + u32 tree_idx = pm_bgd->m_g_tbl[grp_idx].m_tree_idx; + if (tree_idx != 0xFFFF) { + MakeNodeTreeRp(tree_idx); + pm_grp[grp_idx].aab.SetMin(pm_node_tree[pm_bgd->m_g_tbl[grp_idx].m_tree_idx].mMin); + pm_grp[grp_idx].aab.SetMax(pm_node_tree[pm_bgd->m_g_tbl[grp_idx].m_tree_idx].mMax); + } + + u32 chld_idx = pm_bgd->m_g_tbl[grp_idx].m_first_child; + while (true) { + if (chld_idx == 0xFFFF) + break; + MakeNodeTreeGrpRp(chld_idx); + pm_grp[grp_idx].aab.SetMin(pm_grp[chld_idx].aab.mMin); + pm_grp[grp_idx].aab.SetMax(pm_grp[chld_idx].aab.mMax); + chld_idx = pm_bgd->m_g_tbl[chld_idx].m_next_sibling; + } } /* 80248078-80248178 .text MakeNodeTree__4cBgWFv */ @@ -87,17 +139,19 @@ void cBgW::MakeNodeTree() { } /* 80248178-802481C4 .text ChkMemoryError__4cBgWFv */ -void cBgW::ChkMemoryError() { - /* Nonmatching */ +bool cBgW::ChkMemoryError() { + if (pm_tri == NULL || pm_rwg == NULL || pm_blk == NULL || pm_node_tree == NULL || pm_grp == NULL) + return true; + return false; } /* 802481C4-80248414 .text Set__4cBgWFP6cBgD_tUlPA3_A4_f */ -void cBgW::Set(cBgD_t*, unsigned long, float(*)[3][4]) { +bool cBgW::Set(cBgD_t*, unsigned long, Mtx*) { /* Nonmatching */ } /* 80248414-802485FC .text RwgLineCheck__4cBgWFUsP11cBgS_LinChk */ -void cBgW::RwgLineCheck(unsigned short, cBgS_LinChk*) { +void cBgW::RwgLineCheck(u16, cBgS_LinChk*) { /* Nonmatching */ } @@ -112,17 +166,29 @@ void cBgW::LineCheckGrpRp(cBgS_LinChk*, int, int) { } /* 8024898C-80248AB8 .text RwgGroundCheckCommon__4cBgWFfUsP11cBgS_GndChk */ -void cBgW::RwgGroundCheckCommon(float, unsigned short, cBgS_GndChk*) { +bool cBgW::RwgGroundCheckCommon(f32 y, u16 idx, cBgS_GndChk* chk) { /* Nonmatching */ } /* 80248AB8-80248B68 .text RwgGroundCheckGnd__4cBgWFUsP11cBgS_GndChk */ -void cBgW::RwgGroundCheckGnd(unsigned short, cBgS_GndChk*) { +bool cBgW::RwgGroundCheckGnd(u16 idx, cBgS_GndChk* chk) { /* Nonmatching */ + bool ret = false; + while (true) { + cBgW_RwgElm * rwg = &pm_rwg[idx]; + cBgW_TriElm * tri = &pm_tri[idx]; + f32 y = tri->m_plane.getCrossY(*chk->GetPointP()); + if (RwgGroundCheckCommon(y, (u16)idx, chk)) + ret = true; + idx = rwg->next; + if (idx == 0xFFFF) + break; + } + return ret; } /* 80248B68-80248C38 .text RwgGroundCheckWall__4cBgWFUsP11cBgS_GndChk */ -void cBgW::RwgGroundCheckWall(unsigned short, cBgS_GndChk*) { +bool cBgW::RwgGroundCheckWall(u16, cBgS_GndChk*) { /* Nonmatching */ } @@ -138,7 +204,10 @@ void cBgW::GroundCrossGrpRp(cBgS_GndChk*, int, int) { /* 80249368-802493B4 .text CopyOldMtx__4cBgWFv */ void cBgW::CopyOldMtx() { - /* Nonmatching */ + if (pm_base != NULL) { + MTXCopy(mCurMtx, mOldMtx); + MTXCopy(*pm_base, mCurMtx); + } } /* 802493B4-80249584 .text Move__4cBgWFv */ @@ -162,81 +231,49 @@ void cBgW::ShdwDrawGrpRp(cBgS_ShdwDraw*, int) { } /* 80249904-8024990C .text ChkPolyThrough__4cBgWFiP16cBgS_PolyPassChk */ -void cBgW::ChkPolyThrough(int, cBgS_PolyPassChk*) { - /* Nonmatching */ +bool cBgW::ChkPolyThrough(int, cBgS_PolyPassChk*) { + return false; } /* 8024990C-80249938 .text ChkShdwDrawThrough__4cBgWFiP16cBgS_PolyPassChk */ -void cBgW::ChkShdwDrawThrough(int, cBgS_PolyPassChk*) { - /* Nonmatching */ +bool cBgW::ChkShdwDrawThrough(int param_0, cBgS_PolyPassChk* param_1) { + return ChkPolyThrough(param_0, param_1); } /* 80249938-80249940 .text ChkGrpThrough__4cBgWFiP15cBgS_GrpPassChki */ -void cBgW::ChkGrpThrough(int, cBgS_GrpPassChk*, int) { - /* Nonmatching */ +bool cBgW::ChkGrpThrough(int, cBgS_GrpPassChk*, int) { + return false; } /* 80249940-80249A18 .text GetGrpToRoomIndex__4cBgWCFi */ -void cBgW::GetGrpToRoomIndex(int) const { - /* Nonmatching */ +u32 cBgW::GetGrpToRoomIndex(int grp_index) const { + JUT_ASSERT(0xc77, 0 <= grp_index && grp_index < pm_bgd->m_g_num); + cBgD_Grp_t * g_tbl = pm_bgd->m_g_tbl; + if (g_tbl[grp_index].m_parent == 0xFFFF || g_tbl[g_tbl[grp_index].m_parent].m_parent == 0xFFFF) + return 0xFFFF; + return g_tbl[g_tbl[g_tbl[grp_index].m_parent].m_parent].m_room_id; } /* 80249A18-80249A58 .text GetTrans__4cBgWCFP4cXyz */ -void cBgW::GetTrans(cXyz*) const { - /* Nonmatching */ +void cBgW::GetTrans(cXyz* dst) const { + dst->x = (*pm_base)[0][3] - mOldMtx[0][3]; + dst->y = (*pm_base)[1][3] - mOldMtx[1][3]; + dst->z = (*pm_base)[2][3] - mOldMtx[2][3]; } /* 80249A58-80249B64 .text GetTriPnt__4cBgWCFiP4cXyzP4cXyzP4cXyz */ -void cBgW::GetTriPnt(int, cXyz*, cXyz*, cXyz*) const { - /* Nonmatching */ +void cBgW::GetTriPnt(int i_no, cXyz* p0, cXyz* p1, cXyz* p2) const { + JUT_ASSERT(0xcb3, pm_bgd != 0); + + cBgD_Tri_t * tri = &pm_bgd->m_t_tbl[i_no]; + p0->set(pm_vtx_tbl[tri->vtx0]); + p1->set(pm_vtx_tbl[tri->vtx1]); + p2->set(pm_vtx_tbl[tri->vtx2]); } /* 80249B64-80249BA0 .text GetTopUnder__4cBgWCFPfPf */ -void cBgW::GetTopUnder(float*, float*) const { - /* Nonmatching */ -} - -/* 80249BA0-80249BE8 .text __dt__9cBgW_BgIdFv */ -cBgW_BgId::~cBgW_BgId() { - /* Nonmatching */ -} - -/* 80249BE8-80249C48 .text __dt__11cBgW_GrpElmFv */ -cBgW_GrpElm::~cBgW_GrpElm() { - /* Nonmatching */ -} - -/* 80249C48-80249C64 .text __ct__11cBgW_GrpElmFv */ -cBgW_GrpElm::cBgW_GrpElm() { - /* Nonmatching */ -} - -/* 80249C64-80249CC0 .text __dt__13cBgW_NodeTreeFv */ -cBgW_NodeTree::~cBgW_NodeTree() { - /* Nonmatching */ -} - -/* 80249CC0-80249CDC .text __ct__13cBgW_NodeTreeFv */ -cBgW_NodeTree::cBgW_NodeTree() { - /* Nonmatching */ -} - -/* 80249CDC-80249D24 .text __dt__11cBgW_RwgElmFv */ -cBgW_RwgElm::~cBgW_RwgElm() { - /* Nonmatching */ -} - -/* 80249D24-80249D34 .text __ct__11cBgW_RwgElmFv */ -cBgW_RwgElm::cBgW_RwgElm() { - /* Nonmatching */ -} - -/* 80249D34-80249D90 .text __dt__11cBgW_TriElmFv */ -cBgW_TriElm::~cBgW_TriElm() { - /* Nonmatching */ -} - -/* 80249D90-80249DAC .text __ct__11cBgW_TriElmFv */ -cBgW_TriElm::cBgW_TriElm() { +void cBgW::GetTopUnder(f32* min, f32* max) const { /* Nonmatching */ + *min = pm_grp[m_rootGrpIdx].aab.mMin.y; + *max = pm_grp[m_rootGrpIdx].aab.mMax.y; }