d_bg_s work

This commit is contained in:
Jasper St. Pierre
2023-12-02 12:15:18 -08:00
parent fdbb0225bf
commit fe69529cbd
8 changed files with 149 additions and 37 deletions
+5 -1
View File
@@ -21,7 +21,6 @@ public:
cBgS_LinChk() { ct(); }
void ct();
void Set2(cXyz*, cXyz*, unsigned int);
void PreCalc();
void GetCross();
virtual ~cBgS_LinChk() {}
@@ -40,6 +39,11 @@ public:
bool GetPreWallChk() const { return mPreWallChk; }
bool GetPreGroundChk() const { return mPreGroundChk; }
bool GetPreRoofChk() const { return mPreRoofChk; }
inline void PreCalc() {
mPreWallChk = !(mFlag & 0x40000000);
mPreGroundChk = !(mFlag & 0x80000000);
mPreRoofChk = !(mFlag & 0x20000000);
}
}; // Size: 0x58
#endif /* C_BG_S_LIN_CHK_H */
+3 -3
View File
@@ -182,12 +182,12 @@ public:
}
void SetPriority(PRIORITY priority) { mWallCorrectPriority = priority; }
void SetLock() { mFlags |= 0x80; }
void SetLock() { mFlags |= LOCK_e; }
void ChkFlush() {}
void ChkGroundRegist() {}
void ChkLock() {}
void ChkMoveBg() {}
bool ChkMoveBg() { return mFlags & MOVE_BG_e; }
void ChkNoCalcVtx() {}
void ChkPriority(int) {}
void ChkRoofRegist() {}
@@ -213,7 +213,7 @@ public:
return pm_bgd->m_ti_tbl[id].mPolyInf2;
}
u32 GetPolyInf3(int id) const {
JUT_ASSERT(0x308, 0 <= id && id < pm_bgd->m_ti_num);
JUT_ASSERT(0x307, 0 <= id && id < pm_bgd->m_ti_num);
return pm_bgd->m_ti_tbl[id].mPolyInf3;
}
void GetVtxNum() const {}
+4 -4
View File
@@ -94,9 +94,9 @@ public:
int GetRoomCamId(cBgS_PolyInfo&);
int GetRoomPathId(cBgS_PolyInfo&);
int GetRoomPathPntNo(cBgS_PolyInfo&);
int GetRoomId(cBgS_PolyInfo&);
u32 ChkPolyHSStick(cBgS_PolyInfo&);
void LineCrossNonMoveBG(cBgS_LinChk*);
s32 GetRoomId(cBgS_PolyInfo&);
BOOL ChkPolyHSStick(cBgS_PolyInfo&);
bool LineCrossNonMoveBG(cBgS_LinChk*);
void WallCorrect(dBgS_Acch*);
f32 RoofChk(dBgS_RoofChk*);
bool SplGrpChk(dBgS_SplGrpChk*);
@@ -106,7 +106,7 @@ public:
void MoveBgTransPos(cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*);
void MoveBgMatrixCrrPos(cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*);
void RideCallBack(cBgS_PolyInfo&, fopAc_ac_c*);
void PushPullCallBack(cBgS_PolyInfo&, fopAc_ac_c*, short, dBgW::PushPullLabel);
fopAc_ac_c* PushPullCallBack(cBgS_PolyInfo&, fopAc_ac_c*, short, dBgW::PushPullLabel);
bool WaterChk(dBgS_SplGrpChk* chk) { return SplGrpChk(chk); }
}; // Size: 0x1404
+1 -1
View File
@@ -31,7 +31,7 @@ public:
dBgS_AcchCir();
void SetWallR(f32);
void CalcWallRR();
void CalcWallRR() { m_wall_rr = m_wall_r*m_wall_r; }
void SetWall(f32 i_halfHeight, f32 i_radius);
virtual ~dBgS_AcchCir() {}
+1 -1
View File
@@ -67,7 +67,7 @@ public:
/* 0xAE */ s16 mRotYDelta;
/* 0xB0 */ dBgW_RideCallBack mpRideCb;
/* 0xB4 */ dBgW_PPCallBack mpPushPullCb;
/* 0xB8 */ s16 mRoomNo;
/* 0xB8 */ u16 mRoomNo;
/* 0xBA */ u8 mFlag;
/* 0xBB */ u8 mRoomNo2;
};
+1 -3
View File
@@ -114,9 +114,7 @@ bool cBgS::LineCross(cBgS_LinChk* chk) {
for (s32 bg_index = 0; bg_index < (s32)ARRAY_SIZE(m_chk_element); bg_index++) {
cBgS_ChkElm* elm = &m_chk_element[bg_index];
if (elm->ChkUsed() && elm->m_bgw_base_ptr->pm_vtx_tbl != NULL && !chk->ChkSameActorPid(elm->m_actor_id)) {
chk->mPreWallChk = !(chk->mFlag & 0x40000000);
chk->mPreGroundChk = !(chk->mFlag & 0x80000000);
chk->mPreRoofChk = !(chk->mFlag & 0x20000000);
chk->PreCalc();
if (elm->m_bgw_base_ptr->LineCheckGrpRp(chk, elm->m_bgw_base_ptr->m_rootGrpIdx, 1)) {
chk->SetActorInfo(bg_index, elm->m_bgw_base_ptr, elm->m_actor_id);
ret = true;
+134 -23
View File
@@ -105,7 +105,10 @@ int dBgS::GetExitId(cBgS_PolyInfo& polyInfo) {
/* 800A06A4-800A0708 .text GetPolyColor__4dBgSFR13cBgS_PolyInfo */
int dBgS::GetPolyColor(cBgS_PolyInfo& polyInfo) {
/* Nonmatching */
if (!polyInfo.ChkSetInfo())
return 0xFF;
return GetPolyId0(polyInfo.GetBgIndex(), polyInfo.GetPolyIndex(), 0xFF, 0x07F80000, 19);
}
/* 800A0708-800A07F4 .text GetGrpRoomInfId__4dBgSFR13cBgS_PolyInfo */
@@ -136,7 +139,6 @@ s32 dBgS::GetGrpSoundId(cBgS_PolyInfo& polyInfo) {
/* 800A0858-800A08C0 .text ChkGrpInf__4dBgSFR13cBgS_PolyInfoUl */
u32 dBgS::ChkGrpInf(cBgS_PolyInfo& polyInfo, u32 mask) {
/* Nonmatching */
s32 grp_id = GetTriGrp(polyInfo.GetBgIndex(), polyInfo.GetPolyIndex());
if (grp_id == -1)
return 0;
@@ -172,8 +174,9 @@ int dBgS::GetSpecialCode(cBgS_PolyInfo& polyInfo) {
}
/* 800A0B08-800A0B28 .text dBgS_ChangeAttributeCode__FUlPUl */
void dBgS_ChangeAttributeCode(u32, u32*) {
/* Nonmatching */
void dBgS_ChangeAttributeCode(u32 code, u32* dst) {
*dst &= 0xFFE0FFFF;
*dst |= code << 16;
}
/* 800A0B28-800A0B60 .text GetAttributeCodeDirect__4dBgSFR13cBgS_PolyInfo */
@@ -266,18 +269,59 @@ int dBgS::GetRoomPathPntNo(cBgS_PolyInfo& polyInfo) {
}
/* 800A0E68-800A0F88 .text GetRoomId__4dBgSFR13cBgS_PolyInfo */
int dBgS::GetRoomId(cBgS_PolyInfo&) {
s32 dBgS::GetRoomId(cBgS_PolyInfo& polyInfo) {
/* Nonmatching */
if (!polyInfo.ChkSetInfo())
return -1;
s32 id = polyInfo.GetBgIndex();
JUT_ASSERT(0x51b, 0 <= id && id < 256);
if (!ChkPolySafe(polyInfo))
return -1;
dBgW* bgwp = (dBgW*)m_chk_element[id].m_bgw_base_ptr;
u16 roomNo = bgwp->mRoomNo;
if (roomNo == 0xFFFF) {
s32 grp = GetTriGrp(polyInfo.GetBgIndex(), polyInfo.GetPolyIndex());
roomNo = GetGrpToRoomId(polyInfo.GetBgIndex(), grp);
if (roomNo == 0xFFFF)
return -1;
}
return roomNo;
}
/* 800A0F88-800A111C .text ChkPolyHSStick__4dBgSFR13cBgS_PolyInfo */
u32 dBgS::ChkPolyHSStick(cBgS_PolyInfo&) {
BOOL dBgS::ChkPolyHSStick(cBgS_PolyInfo& polyInfo) {
/* Nonmatching */
s32 bg_index = polyInfo.GetBgIndex();
JUT_ASSERT(0x583, 0 <= bg_index && bg_index < 256);
if (!m_chk_element[bg_index].ChkUsed())
return FALSE;
dBgW* bgwp = (dBgW*)m_chk_element[bg_index].m_bgw_base_ptr;
u32 inf_id = bgwp->GetPolyInfId(polyInfo.GetPolyIndex());
return (bgwp->GetPolyInf3(inf_id) & 0x10);
}
/* 800A111C-800A12A4 .text LineCrossNonMoveBG__4dBgSFP11cBgS_LinChk */
void dBgS::LineCrossNonMoveBG(cBgS_LinChk*) {
/* Nonmatching */
bool dBgS::LineCrossNonMoveBG(cBgS_LinChk* chk) {
bool ret = false;
chk->ClearPi();
chk->ClrHit();
for (s32 bg_index = 0; bg_index < (s32)ARRAY_SIZE(m_chk_element); bg_index++) {
cBgS_ChkElm* elm = &m_chk_element[bg_index];
if (elm->ChkUsed() && elm->m_bgw_base_ptr->pm_vtx_tbl != NULL && !chk->ChkSameActorPid(elm->m_actor_id) && !elm->m_bgw_base_ptr->ChkMoveBg()) {
chk->PreCalc();
if (elm->m_bgw_base_ptr->LineCheckGrpRp(chk, elm->m_bgw_base_ptr->m_rootGrpIdx, 1)) {
chk->SetActorInfo(bg_index, elm->m_bgw_base_ptr, elm->m_actor_id);
ret = true;
}
}
}
if (ret)
chk->SetHit();
return ret;
}
/* 800A12A4-800A13E0 .text WallCorrect__4dBgSFP9dBgS_Acch */
@@ -306,48 +350,115 @@ void dBgS::WallCrrPos(dBgS_CrrPos*) {
}
/* 800A1954-800A1A74 .text MoveBgCrrPos__4dBgSFR13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz */
void dBgS::MoveBgCrrPos(cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*) {
void dBgS::MoveBgCrrPos(cBgS_PolyInfo& polyInfo, bool accept, cXyz* pos, csXyz* angle1, csXyz* angle2) {
/* Nonmatching */
if (!accept)
return;
s32 bg_index = polyInfo.GetBgIndex();
JUT_ASSERT(1911, 0 <= bg_index && bg_index < 256);
if (m_chk_element[bg_index].ChkUsed()) {
dBgW* bgwp = (dBgW*)m_chk_element[bg_index].m_bgw_base_ptr;
if (bgwp->mFlag & 1 && ChkPolySafe(polyInfo)) {
bgwp->CrrPos(polyInfo, m_chk_element[bg_index].m_actor_ptr, accept, pos, angle1, angle2);
}
}
}
/* 800A1A74-800A1B94 .text MoveBgTransPos__4dBgSFR13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz */
void dBgS::MoveBgTransPos(cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*) {
void dBgS::MoveBgTransPos(cBgS_PolyInfo& polyInfo, bool accept, cXyz* pos, csXyz* angle1, csXyz* angle2) {
/* Nonmatching */
if (!accept)
return;
s32 bg_index = polyInfo.GetBgIndex();
JUT_ASSERT(1956, 0 <= bg_index && bg_index < 256);
if (m_chk_element[bg_index].ChkUsed()) {
dBgW* bgwp = (dBgW*)m_chk_element[bg_index].m_bgw_base_ptr;
if (bgwp->mFlag & 1 && ChkPolySafe(polyInfo)) {
bgwp->TransPos(polyInfo, m_chk_element[bg_index].m_actor_ptr, accept, pos, angle1, angle2);
}
}
}
/* 800A1B94-800A1C98 .text MoveBgMatrixCrrPos__4dBgSFR13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz */
void dBgS::MoveBgMatrixCrrPos(cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*) {
void dBgS::MoveBgMatrixCrrPos(cBgS_PolyInfo& polyInfo, bool accept, cXyz* pos, csXyz* angle1, csXyz* angle2) {
/* Nonmatching */
if (!accept)
return;
s32 bg_index = polyInfo.GetBgIndex();
JUT_ASSERT(1999, 0 <= bg_index && bg_index < 256);
if (m_chk_element[bg_index].ChkUsed()) {
dBgW* bgwp = (dBgW*)m_chk_element[bg_index].m_bgw_base_ptr;
if (bgwp->mFlag & 1) {
bgwp->MatrixCrrPos(polyInfo, m_chk_element[bg_index].m_actor_ptr, accept, pos, angle1, angle2);
}
}
}
/* 800A1C98-800A1D18 .text dBgS_MoveBGProc_Typical__FP4dBgWPvR13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz */
void dBgS_MoveBGProc_Typical(dBgW*, void*, cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*) {
/* Nonmatching */
void dBgS_MoveBGProc_Typical(dBgW* pbgw, void* user, cBgS_PolyInfo& polyInfo, bool accept, cXyz* pos, csXyz* angle1, csXyz* angle2) {
Mtx inv;
if (MTXInverse(pbgw->mOldMtx, inv)) {
cXyz local, newPos;
MTXMultVec(inv, pos, &local);
MTXMultVec(*pbgw->pm_base, &local, &newPos);
*pos = newPos;
}
}
/* 800A1D18-800A1D4C .text dBgS_MoveBGProc_RotY__FP4dBgWPvR13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz */
void dBgS_MoveBGProc_RotY(dBgW*, void*, cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*) {
/* Nonmatching */
void dBgS_MoveBGProc_RotY(dBgW* pbgw, void* user, cBgS_PolyInfo& polyInfo, bool accept, cXyz* pos, csXyz* angle1, csXyz* angle2) {
if (angle2 == NULL)
return;
s32 rot = pbgw->mRotYDelta;
if (angle2 != NULL)
angle2->y += rot;
if (angle1 != NULL)
angle1->y += rot;
}
/* 800A1D4C-800A1DB8 .text dBgS_MoveBGProc_TypicalRotY__FP4dBgWPvR13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz */
void dBgS_MoveBGProc_TypicalRotY(dBgW*, void*, cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*) {
/* Nonmatching */
void dBgS_MoveBGProc_TypicalRotY(dBgW* pbgw, void* user, cBgS_PolyInfo& polyInfo, bool accept, cXyz* pos, csXyz* angle1, csXyz* angle2) {
dBgS_MoveBGProc_Typical(pbgw, user, polyInfo, accept, pos, angle1, angle2);
dBgS_MoveBGProc_RotY(pbgw, user, polyInfo, accept, pos, angle1, angle2);
}
/* 800A1DB8-800A1DF8 .text dBgS_MoveBGProc_Trans__FP4dBgWPvR13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz */
void dBgS_MoveBGProc_Trans(dBgW*, void*, cBgS_PolyInfo&, bool, cXyz*, csXyz*, csXyz*) {
/* Nonmatching */
void dBgS_MoveBGProc_Trans(dBgW* pbgw, void*, cBgS_PolyInfo& polyInfo, bool, cXyz* pos, csXyz*, csXyz*) {
cXyz trans;
pbgw->GetTrans(&trans);
VECAdd(pos, &trans, pos);
}
/* 800A1DF8-800A1ED0 .text RideCallBack__4dBgSFR13cBgS_PolyInfoP10fopAc_ac_c */
void dBgS::RideCallBack(cBgS_PolyInfo&, fopAc_ac_c*) {
/* Nonmatching */
void dBgS::RideCallBack(cBgS_PolyInfo& polyInfo, fopAc_ac_c* ac) {
s32 bg_index = polyInfo.GetBgIndex();
JUT_ASSERT(0x881, 0 <= bg_index && bg_index < 256);
dBgW* bgwp = (dBgW*)m_chk_element[bg_index].m_bgw_base_ptr;
if (bgwp->ChkUsed() && bgwp->mpRideCb != NULL)
bgwp->mpRideCb(bgwp, m_chk_element[bg_index].m_actor_ptr, ac);
}
/* 800A1ED0-800A1FD8 .text PushPullCallBack__4dBgSFR13cBgS_PolyInfoP10fopAc_ac_csQ24dBgW13PushPullLabel */
void dBgS::PushPullCallBack(cBgS_PolyInfo&, fopAc_ac_c*, short, dBgW::PushPullLabel) {
/* Nonmatching */
fopAc_ac_c* dBgS::PushPullCallBack(cBgS_PolyInfo& polyInfo, fopAc_ac_c* ac, s16 inf, dBgW::PushPullLabel lbl) {
s32 bg_index = polyInfo.GetBgIndex();
JUT_ASSERT(0x8a2, 0 <= bg_index && bg_index < 256);
dBgW* bgwp = (dBgW*)m_chk_element[bg_index].m_bgw_base_ptr;
if (!bgwp->ChkUsed())
return NULL;
if (m_chk_element[bg_index].m_actor_ptr == NULL)
return NULL;
if (bgwp->mpPushPullCb == NULL)
return NULL;
return bgwp->mpPushPullCb(m_chk_element[bg_index].m_actor_ptr, ac, inf, lbl);
}
/* 800A1FD8-800A2550 .text CrrPos__11dBgS_CrrPosFR4dBgS */
-1
View File
@@ -356,7 +356,6 @@ void dBgS_Acch::SetWallCir() {
/* 800A3FE4-800A4114 .text CalcWallBmdCyl__9dBgS_AcchFv */
void dBgS_Acch::CalcWallBmdCyl() {
/* Nonmatching */
if (m_tbl_size <= 0) {
m_wall_cyl.SetC(*pm_pos);
m_wall_cyl.SetR(0.0f);