c_bg_w work

This commit is contained in:
Jasper St. Pierre
2023-10-16 01:09:34 -07:00
parent 9ab7bed736
commit d2a941d15f
4 changed files with 218 additions and 105 deletions
+94 -23
View File
@@ -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);
+4
View File
@@ -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; }
+4 -3
View File
@@ -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);
}
}
+116 -79
View File
@@ -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;
}