Files
dusklight/src/d/bg/d_bg_w.cpp
T
TakaRikka d369e2908c obj_master_sword wip, fmobj mostly done, obj_usaku OK, some BG doc (#1897)
* obj_master_sword work, fix tag_chgrestart

* fmobj mostly done

* some bg documentation

* d_a_obj_usaku OK

* remove asm
2023-08-27 11:39:15 +03:00

2345 lines
78 KiB
C++

//
// Generated By: dol2asm
// Translation Unit: d/bg/d_bg_w
//
#include "d/bg/d_bg_w.h"
#include "SSystem/SComponent/c_bg_s_shdw_draw.h"
#include "SSystem/SComponent/c_math.h"
#include "d/bg/d_bg_s_cap_poly.h"
#include "d/bg/d_bg_s_sph_chk.h"
#include "d/com/d_com_inf_game.h"
#include "dol2asm.h"
#include "global.h"
#include "rel/d/a/d_a_horse/d_a_horse.h"
//
// Forward References:
//
extern "C" void __ct__11cBgW_RwgElmFv();
extern "C" void __dt__11cBgW_RwgElmFv();
extern "C" void __ct__13cBgW_NodeTreeFv();
extern "C" void __dt__13cBgW_NodeTreeFv();
extern "C" void __ct__4cBgWFv();
extern "C" void __dt__4cBgWFv();
extern "C" void FreeArea__4cBgWFv();
extern "C" void GlobalVtx__4cBgWFv();
extern "C" void SetVtx__4cBgWFv();
extern "C" void CalcPlane__4cBgWFv();
extern "C" void SetTri__4cBgWFv();
extern "C" void __dt__11cBgW_TriElmFv();
extern "C" void __ct__11cBgW_TriElmFv();
extern "C" void BlckConnect__4cBgWFPUsPii();
extern "C" void ClassifyPlane__4cBgWFv();
extern "C" void MakeBlckTransMinMax__4cBgWFP4cXyzP4cXyz();
extern "C" void MakeBlckMinMax__4cBgWFiP4cXyzP4cXyz();
extern "C" void MakeBlckBnd__4cBgWFiP4cXyzP4cXyz();
extern "C" void MakeNodeTreeRp__4cBgWFi();
extern "C" void MakeNodeTreeGrpRp__4cBgWFi();
extern "C" void MakeNodeTree__4cBgWFv();
extern "C" void ChkMemoryError__4cBgWFv();
extern "C" void Set__4cBgWFP6cBgD_tUlPA3_A4_f();
extern "C" void __dt__11cBgW_GrpElmFv();
extern "C" void __ct__11cBgW_GrpElmFv();
extern "C" void RwgLineCheck__4cBgWFUsP11cBgS_LinChk();
extern "C" void __dt__8cM3dGTriFv();
extern "C" void LineCheckRp__4cBgWFP11cBgS_LinChki();
extern "C" void LineCheckGrpRp__4cBgWFP11cBgS_LinChkii();
extern "C" void LineCheck__4cBgWFP11cBgS_LinChk();
extern "C" void RwgGroundCheckCommon__4cBgWFfUsP11cBgS_GndChk();
extern "C" void RwgGroundCheckGnd__4cBgWFUsP11cBgS_GndChk();
extern "C" void RwgGroundCheckWall__4cBgWFUsP11cBgS_GndChk();
extern "C" void GroundCrossRp__4cBgWFP11cBgS_GndChki();
extern "C" void GroundCrossGrpRp__4cBgWFP11cBgS_GndChkii();
extern "C" void GroundCross__4cBgWFP11cBgS_GndChk();
extern "C" void CopyOldMtx__4cBgWFv();
extern "C" void Move__4cBgWFv();
extern "C" void RwgShdwDraw__4cBgWFiP13cBgS_ShdwDraw();
extern "C" void ShdwDrawRp__4cBgWFP13cBgS_ShdwDrawi();
extern "C" void ShdwDrawGrpRp__4cBgWFP13cBgS_ShdwDrawi();
extern "C" void ShdwDraw__4cBgWFP13cBgS_ShdwDraw();
extern "C" bool ChkPolyThrough__4cBgWFiP16cBgS_PolyPassChk();
extern "C" void ChkShdwDrawThrough__4cBgWFiP16cBgS_PolyPassChk();
extern "C" bool ChkGrpThrough__4cBgWFiP15cBgS_GrpPassChki();
extern "C" void GetGrpRoomIndex__4cBgWCFRC13cBgS_PolyInfo();
extern "C" void GetBnd__4cBgWCFv();
extern "C" void GetTrans__4cBgWCFP4cXyz();
extern "C" void GetTriPnt__4cBgWCFRC13cBgS_PolyInfoP4cXyzP4cXyzP4cXyz();
extern "C" void GetTopUnder__4cBgWCFPfPf();
extern "C" void GetTriPla__4cBgWCFRC13cBgS_PolyInfo();
extern "C" void GetGrpInf__4cBgWCFRC13cBgS_PolyInfo();
extern "C" void GetPolyInfId__4cBgWCFi();
extern "C" void GetPolyInf0__4cBgWCFiUlUl();
extern "C" void GetMaskPolyInf0_NoShift__4cBgWCFiUl();
extern "C" void GetExitId__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetPolyColor__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetHorseNoEntry__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetSpecialCode__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetSpecialCode__4dBgWFi();
extern "C" void GetMagnetCode__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetMonkeyBarsCode__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetPolyObjThrough__4dBgWFi();
extern "C" void GetPolyCamThrough__4dBgWFi();
extern "C" void GetPolyLinkThrough__4dBgWFi();
extern "C" void GetPolyArrowThrough__4dBgWFi();
extern "C" void GetPolyHSStick__4dBgWFi();
extern "C" void GetPolyBoomerangThrough__4dBgWFi();
extern "C" void GetPolyRopeThrough__4dBgWFi();
extern "C" void GetPolyBombThrough__4dBgWFi();
extern "C" void GetShdwThrough__4dBgWFi();
extern "C" void GetUnderwaterRoofCode__4dBgWFi();
extern "C" void GetPolyInf1__4cBgWCFiUlUl();
extern "C" void GetLinkNo__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetWallCode__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetPolyAtt0__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetPolyAtt1__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetGroundCode__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetMaskPolyInf1_NoShift__4cBgWCFiUl();
extern "C" void GetIronBallThrough__4dBgWFi();
extern "C" void GetAttackThrough__4dBgWFi();
extern "C" void GetPolyInf2__4cBgWCFiUlUl();
extern "C" void GetCamMoveBG__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetRoomCamId__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetRoomPathId__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetRoomPathPntNo__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetTriGrp__4cBgWCFi();
extern "C" void ChkNotReady__4cBgWCFv();
extern "C" void ChkLock__4cBgWCFv();
extern "C" void ChkMoveBg__4cBgWCFv();
extern "C" void __ct__4dBgWFv();
extern "C" void Move__4dBgWFv();
extern "C" void positionWallCorrect__4dBgWFP9dBgS_AcchfR8cM3dGPlaP4cXyzf();
extern "C" void RwgWallCorrect__4dBgWFP9dBgS_AcchUs();
extern "C" void WallCorrectRp__4dBgWFP9dBgS_Acchi();
extern "C" void WallCorrectGrpRp__4dBgWFP9dBgS_Acchii();
extern "C" void WallCorrect__4dBgWFP9dBgS_Acch();
extern "C" void RwgWallCorrectSort__4dBgWFP9dBgS_AcchUs();
extern "C" void WallCorrectRpSort__4dBgWFP9dBgS_Acchi();
extern "C" void WallCorrectGrpRpSort__4dBgWFP9dBgS_Acchii();
extern "C" void WallCorrectSort__4dBgWFP9dBgS_Acch();
extern "C" void RwgRoofChk__4dBgWFUsP12dBgS_RoofChk();
extern "C" void RoofChkRp__4dBgWFP12dBgS_RoofChki();
extern "C" void RoofChkGrpRp__4dBgWFP12dBgS_RoofChkii();
extern "C" void RoofChk__4dBgWFP12dBgS_RoofChk();
extern "C" void RwgSplGrpChk__4dBgWFUsP14dBgS_SplGrpChk();
extern "C" void SplGrpChkRp__4dBgWFP14dBgS_SplGrpChki();
extern "C" void SplGrpChkGrpRp__4dBgWFP14dBgS_SplGrpChkii();
extern "C" void SplGrpChk__4dBgWFP14dBgS_SplGrpChk();
extern "C" void RwgCaptPoly__4dBgWFiR13dBgS_CaptPoly();
extern "C" void CaptPolyRp__4dBgWFR13dBgS_CaptPolyi();
extern "C" void CaptPolyGrpRp__4dBgWFR13dBgS_CaptPolyii();
extern "C" void CaptPoly__4dBgWFR13dBgS_CaptPoly();
extern "C" void RwgSphChk__4dBgWFUsP11dBgS_SphChkPv();
extern "C" void SphChkRp__4dBgWFP11dBgS_SphChkPvi();
extern "C" void SphChkGrpRp__4dBgWFP11dBgS_SphChkPvii();
extern "C" void SphChk__4dBgWFP11dBgS_SphChkPv();
extern "C" void GetPolyGrpRoomInfId__4dBgWFRC13cBgS_PolyInfo();
extern "C" void GetGrpSoundId__4dBgWFRC13cBgS_PolyInfo();
extern "C" void CrrPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz();
extern "C" void TransPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz();
extern "C" void MatrixCrrPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz();
extern "C" void ChkPolyThrough__4dBgWFiP16cBgS_PolyPassChk();
extern "C" void ChkShdwDrawThrough__4dBgWFiP16cBgS_PolyPassChk();
extern "C" void ChkGrpThrough__4dBgWFiP15cBgS_GrpPassChki();
extern "C" void CallRideCallBack__4dBgWFP10fopAc_ac_cP10fopAc_ac_c();
extern "C" void CallArrowStickCallBack__4dBgWFP10fopAc_ac_cP10fopAc_ac_cR4cXyz();
extern "C" void OffMoveFlag__4dBgWFv();
extern "C" void ChkMoveFlag__4dBgWCFv();
extern "C" void dBgW_NewSet__FP6cBgD_tUlPA3_A4_f();
extern "C" void __dt__4dBgWFv();
extern "C" extern u8 struct_80450F88[8];
//
// External References:
//
extern "C" void SetOldShapeAngleY__9dBgW_BaseFs();
extern "C" void GetSpeedY__9dBgS_AcchFv();
extern "C" void GetWallAddY__9dBgS_AcchFR3Vec();
extern "C" void SetWallPolyIndex__9dBgS_AcchFii();
extern "C" void CalcMovePosWork__9dBgS_AcchFv();
extern "C" void ChkNoHorse__16dBgS_PolyPassChkFv();
extern "C" void __ct__9dBgW_BaseFv();
extern "C" void __dt__9dBgW_BaseFv();
extern "C" void CallRideCallBack__9dBgW_BaseFP10fopAc_ac_cP10fopAc_ac_c();
extern "C" void CallArrowStickCallBack__9dBgW_BaseFP10fopAc_ac_cP10fopAc_ac_cR4cXyz();
extern "C" void cM_atan2s__Fff();
extern "C" void cM_rndF__Ff();
extern "C" void SetPolyIndex__13cBgS_PolyInfoFi();
extern "C" void cBgW_CheckBGround__Ff();
extern "C" void cBgW_CheckBRoof__Ff();
extern "C" void cM2d_CrossCirLin__FR8cM2dGCirffffPfPf();
extern "C" void cM3d_Len2dSq__Fffff();
extern "C" void cM3d_Len2dSqPntAndSegLine__FffffffPfPfPf();
extern "C" void cM3d_CalcPla__FPC3VecPC3VecPC3VecP3VecPf();
extern "C" void cM3d_Cross_AabAab__FPC8cM3dGAabPC8cM3dGAab();
extern "C" void cM3d_Cross_AabCyl__FPC8cM3dGAabPC8cM3dGCyl();
extern "C" void cM3d_Cross_AabSph__FPC8cM3dGAabPC8cM3dGSph();
extern "C" void cM3d_Cross_MinMaxBoxLine__FPC3VecPC3VecPC3VecPC3Vec();
extern "C" void cM3d_CrossY_Tri__FRC3VecRC3VecRC3VecRC8cM3dGPlaPC3Vec();
extern "C" void cM3d_CrossY_Tri_Front__FRC3VecRC3VecRC3VecPC3Vec();
extern "C" void cM3d_Cross_LinTri__FPC8cM3dGLinPC8cM3dGTriP3Vecbb();
extern "C" void cM3d_Cross_SphTri__FPC8cM3dGSphPC8cM3dGTriP3Vec();
extern "C" void CrossY__8cM3dGAabCFPC4cXyz();
extern "C" void UnderPlaneYUnder__8cM3dGAabCFf();
extern "C" void TopPlaneYUnder__8cM3dGAabCFf();
extern "C" void ClearForMinMax__8cM3dGAabFv();
extern "C" void SetMinMax__8cM3dGAabFRC4cXyz();
extern "C" void SetMin__8cM3dGAabFRC4cXyz();
extern "C" void SetMax__8cM3dGAabFRC4cXyz();
extern "C" void SetEnd__8cM3dGLinFRC4cXyz();
extern "C" void getCrossY__8cM3dGPlaCFRC4cXyzPf();
extern "C" void setBg__8cM3dGTriFPC3VecPC3VecPC3VecPC8cM3dGPla();
extern "C" void* __nw__FUl();
extern "C" void* __nwa__FUl();
extern "C" void __dl__FPv();
extern "C" void __construct_new_array();
extern "C" void __ptmf_scall();
extern "C" void _savegpr_22();
extern "C" void _savegpr_23();
extern "C" void _savegpr_24();
extern "C" void _savegpr_25();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_22();
extern "C" void _restgpr_23();
extern "C" void _restgpr_24();
extern "C" void _restgpr_25();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" extern void* __vt__8cM3dGPla[3];
extern "C" extern void* __vt__8cM3dGAab[3];
extern "C" u8 sincosTable___5JMath[65536];
//
// Declarations:
//
/* ############################################################################################## */
/* 803ABA80-803ABB84 008BA0 0104+00 2/2 1/1 5/5 .data __vt__4dBgW */
SECTION_DATA extern void* __vt__4dBgW[65] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__4dBgWFv,
(void*)ChkMemoryError__4cBgWFv,
(void*)ChkNotReady__4cBgWCFv,
(void*)ChkLock__4cBgWCFv,
(void*)ChkMoveBg__4cBgWCFv,
(void*)ChkMoveFlag__4dBgWCFv,
(void*)GetTriPla__4cBgWCFRC13cBgS_PolyInfo,
(void*)GetTriPnt__4cBgWCFRC13cBgS_PolyInfoP4cXyzP4cXyzP4cXyz,
(void*)GetBnd__4cBgWCFv,
(void*)GetGrpInf__4cBgWCFRC13cBgS_PolyInfo,
(void*)OffMoveFlag__4dBgWFv,
(void*)GetTopUnder__4cBgWCFPfPf,
(void*)SetOldShapeAngleY__9dBgW_BaseFs,
(void*)LineCheck__4cBgWFP11cBgS_LinChk,
(void*)GroundCross__4cBgWFP11cBgS_GndChk,
(void*)ShdwDraw__4cBgWFP13cBgS_ShdwDraw,
(void*)CaptPoly__4dBgWFR13dBgS_CaptPoly,
(void*)WallCorrect__4dBgWFP9dBgS_Acch,
(void*)WallCorrectSort__4dBgWFP9dBgS_Acch,
(void*)RoofChk__4dBgWFP12dBgS_RoofChk,
(void*)SplGrpChk__4dBgWFP14dBgS_SplGrpChk,
(void*)SphChk__4dBgWFP11dBgS_SphChkPv,
(void*)GetGrpRoomIndex__4cBgWCFRC13cBgS_PolyInfo,
(void*)GetExitId__4dBgWFRC13cBgS_PolyInfo,
(void*)GetPolyColor__4dBgWFRC13cBgS_PolyInfo,
(void*)GetHorseNoEntry__4dBgWFRC13cBgS_PolyInfo,
(void*)GetSpecialCode__4dBgWFRC13cBgS_PolyInfo,
(void*)GetSpecialCode__4dBgWFi,
(void*)GetMagnetCode__4dBgWFRC13cBgS_PolyInfo,
(void*)GetPolyObjThrough__4dBgWFi,
(void*)GetPolyCamThrough__4dBgWFi,
(void*)GetPolyLinkThrough__4dBgWFi,
(void*)GetPolyArrowThrough__4dBgWFi,
(void*)GetPolyHSStick__4dBgWFi,
(void*)GetPolyBoomerangThrough__4dBgWFi,
(void*)GetPolyRopeThrough__4dBgWFi,
(void*)GetPolyBombThrough__4dBgWFi,
(void*)GetShdwThrough__4dBgWFi,
(void*)GetUnderwaterRoofCode__4dBgWFi,
(void*)GetMonkeyBarsCode__4dBgWFRC13cBgS_PolyInfo,
(void*)GetLinkNo__4dBgWFRC13cBgS_PolyInfo,
(void*)GetWallCode__4dBgWFRC13cBgS_PolyInfo,
(void*)GetPolyAtt0__4dBgWFRC13cBgS_PolyInfo,
(void*)GetPolyAtt1__4dBgWFRC13cBgS_PolyInfo,
(void*)GetGroundCode__4dBgWFRC13cBgS_PolyInfo,
(void*)GetIronBallThrough__4dBgWFi,
(void*)GetAttackThrough__4dBgWFi,
(void*)GetCamMoveBG__4dBgWFRC13cBgS_PolyInfo,
(void*)GetRoomCamId__4dBgWFRC13cBgS_PolyInfo,
(void*)GetRoomPathId__4dBgWFRC13cBgS_PolyInfo,
(void*)GetRoomPathPntNo__4dBgWFRC13cBgS_PolyInfo,
(void*)GetPolyGrpRoomInfId__4dBgWFRC13cBgS_PolyInfo,
(void*)GetGrpSoundId__4dBgWFRC13cBgS_PolyInfo,
(void*)CrrPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz,
(void*)TransPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz,
(void*)MatrixCrrPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz,
(void*)CallRideCallBack__4dBgWFP10fopAc_ac_cP10fopAc_ac_c,
(void*)CallArrowStickCallBack__4dBgWFP10fopAc_ac_cP10fopAc_ac_cR4cXyz,
(void*)CalcPlane__4cBgWFv,
(void*)ClassifyPlane__4cBgWFv,
(void*)ChkPolyThrough__4dBgWFiP16cBgS_PolyPassChk,
(void*)ChkShdwDrawThrough__4dBgWFiP16cBgS_PolyPassChk,
(void*)ChkGrpThrough__4dBgWFiP15cBgS_GrpPassChki,
};
/* 803ABB84-803ABB90 008CA4 000C+00 3/3 5/5 0/0 .data __vt__8cM3dGTri */
SECTION_DATA extern void* __vt__8cM3dGTri[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__8cM3dGTriFv,
};
/* 803ABB90-803ABB9C 008CB0 000C+00 2/2 0/0 0/0 .data __vt__11cBgW_GrpElm */
SECTION_DATA extern void* __vt__11cBgW_GrpElm[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__11cBgW_GrpElmFv,
};
/* 803ABB9C-803ABBA8 008CBC 000C+00 2/2 0/0 0/0 .data __vt__11cBgW_TriElm */
SECTION_DATA extern void* __vt__11cBgW_TriElm[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__11cBgW_TriElmFv,
};
/* 803ABBA8-803ABCAC 008CC8 0104+00 2/2 0/0 0/0 .data __vt__4cBgW */
SECTION_DATA extern void* __vt__4cBgW[65] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__4cBgWFv,
(void*)ChkMemoryError__4cBgWFv,
(void*)ChkNotReady__4cBgWCFv,
(void*)ChkLock__4cBgWCFv,
(void*)ChkMoveBg__4cBgWCFv,
(void*)NULL,
(void*)GetTriPla__4cBgWCFRC13cBgS_PolyInfo,
(void*)GetTriPnt__4cBgWCFRC13cBgS_PolyInfoP4cXyzP4cXyzP4cXyz,
(void*)GetBnd__4cBgWCFv,
(void*)GetGrpInf__4cBgWCFRC13cBgS_PolyInfo,
(void*)NULL,
(void*)GetTopUnder__4cBgWCFPfPf,
(void*)SetOldShapeAngleY__9dBgW_BaseFs,
(void*)LineCheck__4cBgWFP11cBgS_LinChk,
(void*)GroundCross__4cBgWFP11cBgS_GndChk,
(void*)ShdwDraw__4cBgWFP13cBgS_ShdwDraw,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)GetGrpRoomIndex__4cBgWCFRC13cBgS_PolyInfo,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)CallRideCallBack__9dBgW_BaseFP10fopAc_ac_cP10fopAc_ac_c,
(void*)CallArrowStickCallBack__9dBgW_BaseFP10fopAc_ac_cP10fopAc_ac_cR4cXyz,
(void*)CalcPlane__4cBgWFv,
(void*)ClassifyPlane__4cBgWFv,
(void*)ChkPolyThrough__4cBgWFiP16cBgS_PolyPassChk,
(void*)ChkShdwDrawThrough__4cBgWFiP16cBgS_PolyPassChk,
(void*)ChkGrpThrough__4cBgWFiP15cBgS_GrpPassChki,
};
/* 803ABCAC-803ABCB8 008DCC 000C+00 2/2 0/0 0/0 .data __vt__13cBgW_NodeTree */
SECTION_DATA extern void* __vt__13cBgW_NodeTree[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13cBgW_NodeTreeFv,
};
/* 803ABCB8-803ABCC8 008DD8 000C+04 2/2 0/0 0/0 .data __vt__11cBgW_RwgElm */
SECTION_DATA extern void* __vt__11cBgW_RwgElm[3 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__11cBgW_RwgElmFv,
/* padding */
NULL,
};
/* 800791C4-800791D4 073B04 0010+00 1/1 0/0 0/0 .text __ct__11cBgW_RwgElmFv */
cBgW_RwgElm::cBgW_RwgElm() {}
/* 800791D4-8007921C 073B14 0048+00 2/1 0/0 0/0 .text __dt__11cBgW_RwgElmFv */
cBgW_RwgElm::~cBgW_RwgElm() {}
/* 8007921C-80079238 073B5C 001C+00 1/1 0/0 0/0 .text __ct__13cBgW_NodeTreeFv */
cBgW_NodeTree::cBgW_NodeTree() {}
/* 80079238-80079294 073B78 005C+00 2/1 0/0 0/0 .text __dt__13cBgW_NodeTreeFv */
cBgW_NodeTree::~cBgW_NodeTree() {}
/* ############################################################################################## */
/* 804526F8-804526FC 000CF8 0004+00 6/6 0/0 0/0 .sdata2 @3717 */
SECTION_SDATA2 static u8 lit_3717[4] = {
0x00,
0x00,
0x00,
0x00,
};
/* 80079294-8007933C 073BD4 00A8+00 1/1 0/0 0/0 .text __ct__4cBgWFv */
cBgW::cBgW() {
pm_bgd = NULL;
mFlags = GLOBAL_e;
mNeedsFullTransform = 1;
mMoveCounter = 0;
mTransVel.set(FLOAT_LABEL(lit_3717), FLOAT_LABEL(lit_3717), FLOAT_LABEL(lit_3717));
pm_tri = NULL;
pm_rwg = NULL;
pm_blk = NULL;
pm_node_tree = NULL;
pm_grp = NULL;
pm_vtx_tbl = NULL;
pm_base = NULL;
PSMTXIdentity(m_inv_mtx);
PSMTXIdentity(m_mtx);
m_rootGrpIdx = 0xFFFF;
field_0x91 = 0;
}
/* 8007933C-800793A4 073C7C 0068+00 2/1 1/1 5/5 .text __dt__4cBgWFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
// asm cBgW::~cBgW() {
extern "C" asm void __dt__4cBgWFv() {
nofralloc
#include "asm/d/bg/d_bg_w/__dt__4cBgWFv.s"
}
#pragma pop
/* 800793A4-800793C4 073CE4 0020+00 2/2 0/0 0/0 .text FreeArea__4cBgWFv */
void cBgW::FreeArea() {
pm_tri = NULL;
pm_rwg = NULL;
pm_node_tree = NULL;
pm_blk = NULL;
pm_grp = NULL;
pm_vtx_tbl = NULL;
}
/* 800793C4-80079484 073D04 00C0+00 2/2 0/0 1/1 .text GlobalVtx__4cBgWFv */
void cBgW::GlobalVtx() {
if (pm_base != NULL) {
if (!mNeedsFullTransform) {
for (int i = 0; i < pm_bgd->m_v_num; i++) {
Vec* vtx = &pm_vtx_tbl[i];
PSVECAdd(vtx, &mTransVel, vtx);
}
} else {
for (int i = 0; i < pm_bgd->m_v_num; i++) {
PSMTXMultVec(pm_base, &pm_bgd->m_v_tbl[i], &pm_vtx_tbl[i]);
}
}
}
}
/* 80079484-80079564 073DC4 00E0+00 1/1 0/0 0/0 .text SetVtx__4cBgWFv */
// matches with literals
#ifdef NONMATCHING
bool cBgW::SetVtx() {
if (mFlags & NO_VTX_TBL_e) {
pm_vtx_tbl = NULL;
} else if (mFlags & MOVE_BG_e) {
pm_vtx_tbl = new Vec[pm_bgd->m_v_num];
if (pm_vtx_tbl == NULL) {
return true;
}
if (mFlags & CBGW_UNK_FLAG_40) {
for (int i = 0; i < pm_bgd->m_v_num; i++) {
pm_vtx_tbl[i].x = 0.0f;
pm_vtx_tbl[i].y = 0.0f;
pm_vtx_tbl[i].z = 0.0f;
}
}
GlobalVtx();
} else {
pm_vtx_tbl = pm_bgd->m_v_tbl;
}
return false;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm bool cBgW::SetVtx() {
nofralloc
#include "asm/d/bg/d_bg_w/SetVtx__4cBgWFv.s"
}
#pragma pop
#endif
/* 80079564-80079668 073EA4 0104+00 2/0 1/0 0/0 .text CalcPlane__4cBgWFv */
void cBgW::CalcPlane() {
cBgD_Tri_t* tri_data = pm_bgd->m_t_tbl;
if (pm_vtx_tbl != NULL) {
if (!mNeedsFullTransform) {
for (int i = 0; i < pm_bgd->m_t_num; i++) {
pm_tri[i].m_plane.mD -= PSVECDotProduct(&pm_tri[i].m_plane.mNormal, &mTransVel);
}
} else {
for (int i = 0; i < pm_bgd->m_t_num; i++) {
pm_tri[i].m_plane.SetupFrom3Vtx(&pm_vtx_tbl[tri_data[i].m_vtx_idx0],
&pm_vtx_tbl[tri_data[i].m_vtx_idx1],
&pm_vtx_tbl[tri_data[i].m_vtx_idx2]);
}
}
}
}
/* 80079668-800796F8 073FA8 0090+00 1/1 0/0 0/0 .text SetTri__4cBgWFv */
bool cBgW::SetTri() {
pm_tri = new cBgW_TriElm[pm_bgd->m_t_num];
if (pm_tri == NULL) {
return true;
}
CalcPlane();
return false;
}
/* 800796F8-80079754 074038 005C+00 2/1 0/0 0/0 .text __dt__11cBgW_TriElmFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
// asm cBgW_TriElm::~cBgW_TriElm() {
extern "C" asm void __dt__11cBgW_TriElmFv() {
nofralloc
#include "asm/d/bg/d_bg_w/__dt__11cBgW_TriElmFv.s"
}
#pragma pop
/* 80079754-80079770 074094 001C+00 1/1 0/0 0/0 .text __ct__11cBgW_TriElmFv */
cBgW_TriElm::cBgW_TriElm() {}
/* 80079770-800797BC 0740B0 004C+00 1/1 0/0 0/0 .text BlckConnect__4cBgWFPUsPii */
void cBgW::BlckConnect(u16* i_start_idx, int* i_prev_idx, int i_idx) {
if (*i_start_idx == 0xFFFF) {
*i_start_idx = i_idx;
}
if (*i_prev_idx != 0xFFFF) {
pm_rwg[*i_prev_idx].m_next = i_idx;
}
*i_prev_idx = i_idx;
pm_rwg[*i_prev_idx].m_next = 0xFFFF;
}
/* 800797BC-8007998C 0740FC 01D0+00 2/0 1/0 0/0 .text ClassifyPlane__4cBgWFv */
// stack, G_CM3D_F_ABS_MIN is loaded outside of loop
#ifdef NONMATCHING
void cBgW::ClassifyPlane() {
if (pm_vtx_tbl == NULL) {
return;
}
for (int i = 0; i < pm_bgd->m_b_num; i++) {
int start_idx = pm_bgd->m_b_tbl[i].field_0x0;
int end_idx;
if (i != pm_bgd->m_b_num - 1) {
end_idx = pm_bgd->m_b_tbl[i + 1].field_0x0 - 1;
} else {
end_idx = pm_bgd->m_t_num - 1;
}
pm_blk[i].m_roof_idx = 0xFFFF;
pm_blk[i].m_wall_idx = 0xFFFF;
pm_blk[i].m_gnd_idx = 0xFFFF;
int blk_roof_idx;
int blk_wall_idx;
int blk_gnd_idx = 0xFFFF;
blk_wall_idx = 0xFFFF;
blk_roof_idx = 0xFFFF;
for (int j = start_idx; j <= end_idx; j++) {
f32 norm_y = pm_tri[j].m_plane.i_GetNP()->y;
if (!cM3d_IsZero(pm_tri[j].m_plane.i_GetNP()->x) || !cM3d_IsZero(norm_y) ||
!cM3d_IsZero(pm_tri[j].m_plane.i_GetNP()->z))
{
if (cBgW_CheckBGround(norm_y)) {
BlckConnect(&pm_blk[i].m_gnd_idx, &blk_gnd_idx, j);
} else {
if (cBgW_CheckBRoof(norm_y)) {
if (!ChkRoofRegist()) {
BlckConnect(&pm_blk[i].m_roof_idx, &blk_roof_idx, j);
}
} else {
BlckConnect(&pm_blk[i].m_wall_idx, &blk_wall_idx, j);
}
}
}
}
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cBgW::ClassifyPlane() {
nofralloc
#include "asm/d/bg/d_bg_w/ClassifyPlane__4cBgWFv.s"
}
#pragma pop
#endif
/* 8007998C-800799E0 0742CC 0054+00 1/1 0/0 0/0 .text MakeBlckTransMinMax__4cBgWFP4cXyzP4cXyz */
void cBgW::MakeBlckTransMinMax(cXyz* i_min, cXyz* i_max) {
PSVECAdd(i_min, &mTransVel, i_min);
PSVECAdd(i_max, &mTransVel, i_max);
}
/* 800799E0-80079A68 074320 0088+00 1/1 0/0 0/0 .text MakeBlckMinMax__4cBgWFiP4cXyzP4cXyz
*/
void cBgW::MakeBlckMinMax(int vtx_index, cXyz* i_min, cXyz* i_max) {
Vec* vtx = &pm_vtx_tbl[vtx_index];
if (i_min->x > vtx->x) {
i_min->x = vtx->x;
}
if (i_max->x < vtx->x) {
i_max->x = vtx->x;
}
if (i_min->y > vtx->y) {
i_min->y = vtx->y;
}
if (i_max->y < vtx->y) {
i_max->y = vtx->y;
}
if (i_min->z > vtx->z) {
i_min->z = vtx->z;
}
if (i_max->z < vtx->z) {
i_max->z = vtx->z;
}
}
/* ############################################################################################## */
/* 804526FC-80452700 000CFC 0004+00 1/1 0/0 0/0 .sdata2 @3935 */
SECTION_SDATA2 static f32 lit_3935 = 1000000000.0f;
/* 80452700-80452704 000D00 0004+00 1/1 0/0 0/0 .sdata2 @3936 */
SECTION_SDATA2 static f32 lit_3936 = -1000000000.0f;
/* 80452704-80452708 000D04 0004+00 5/5 0/0 0/0 .sdata2 @3937 */
SECTION_SDATA2 static f32 lit_3937 = 1.0f;
/* 80079A68-80079BDC 0743A8 0174+00 1/1 0/0 0/0 .text MakeBlckBnd__4cBgWFiP4cXyzP4cXyz */
// matches with literals
#ifdef NONMATCHING
void cBgW::MakeBlckBnd(int i_blk_idx, cXyz* i_min, cXyz* i_max) {
int start = pm_bgd->m_b_tbl[i_blk_idx].field_0x0;
int max;
if (i_blk_idx != pm_bgd->m_b_num - 1) {
max = pm_bgd->m_b_tbl[i_blk_idx + 1].field_0x0 - 1;
} else {
max = pm_bgd->m_t_num - 1;
}
if (mNeedsFullTransform == 0) {
MakeBlckTransMinMax(i_min, i_max);
} else {
i_min->z = 1000000000.0f;
i_min->y = 1000000000.0f;
i_min->x = 1000000000.0f;
i_max->z = -1000000000.0f;
i_max->y = -1000000000.0f;
i_max->x = -1000000000.0f;
for (int i = start; i <= max; i++) {
MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx0, i_min, i_max);
MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx1, i_min, i_max);
MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx2, i_min, i_max);
}
i_min->x -= 1.0f;
i_min->y -= 1.0f;
i_min->z -= 1.0f;
i_max->x += 1.0f;
i_max->y += 1.0f;
i_max->z += 1.0f;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void cBgW::MakeBlckBnd(int param_0, cXyz* param_1, cXyz* param_2) {
nofralloc
#include "asm/d/bg/d_bg_w/MakeBlckBnd__4cBgWFiP4cXyzP4cXyz.s"
}
#pragma pop
#endif
/* 80079BDC-80079CC4 07451C 00E8+00 1/1 0/0 0/0 .text MakeNodeTreeRp__4cBgWFi */
void cBgW::MakeNodeTreeRp(int i_tree_idx) {
cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[i_tree_idx];
if (tree_data->m_flag & 1) {
int child_idx = tree_data->m_id[0];
if (child_idx != 0xFFFF) {
cXyz* max = (cXyz*)pm_node_tree[i_tree_idx].GetMaxP();
cXyz* min = (cXyz*)pm_node_tree[i_tree_idx].GetMinP();
MakeBlckBnd(child_idx, min, max);
}
} else {
pm_node_tree[i_tree_idx].ClearForMinMax();
for (int i = 0; i < 8; i++) {
int child_idx = tree_data->m_id[i];
if (child_idx != 0xFFFF) {
MakeNodeTreeRp(child_idx);
pm_node_tree[i_tree_idx].SetMinMax(*pm_node_tree[child_idx].GetMinP());
pm_node_tree[i_tree_idx].SetMinMax(*pm_node_tree[child_idx].GetMaxP());
}
}
}
}
/* 80079CC4-80079DF0 074604 012C+00 1/1 0/0 0/0 .text MakeNodeTreeGrpRp__4cBgWFi */
void cBgW::MakeNodeTreeGrpRp(int i_grp_idx) {
if (pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx != 0xFFFF) {
MakeNodeTreeRp(pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx);
pm_grp[i_grp_idx].m_aab.SetMin(
*pm_node_tree[pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx].GetMinP());
pm_grp[i_grp_idx].m_aab.SetMax(
*pm_node_tree[pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx].GetMaxP());
}
s32 child_idx = pm_bgd->m_g_tbl[i_grp_idx].m_first_child;
while (true) {
if (child_idx == 0xFFFF)
break;
MakeNodeTreeGrpRp(child_idx);
pm_grp[i_grp_idx].m_aab.SetMin(*pm_grp[child_idx].m_aab.GetMinP());
pm_grp[i_grp_idx].m_aab.SetMax(*pm_grp[child_idx].m_aab.GetMaxP());
child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling;
}
}
/* 80079DF0-80079EEC 074730 00FC+00 2/2 0/0 0/0 .text MakeNodeTree__4cBgWFv */
void cBgW::MakeNodeTree() {
if (pm_vtx_tbl == NULL) {
for (int i = 0; i < pm_bgd->m_g_num; i++) {
if (pm_bgd->m_g_tbl[i].m_parent == 0xFFFF) {
m_rootGrpIdx = i;
return;
}
}
} else {
for (int i = 0; i < pm_bgd->m_g_num; i++) {
pm_grp[i].m_aab.ClearForMinMax();
}
for (int i = 0; i < pm_bgd->m_g_num; i++) {
if (pm_bgd->m_g_tbl[i].m_parent == 0xFFFF) {
m_rootGrpIdx = i;
MakeNodeTreeGrpRp(i);
return;
}
}
}
}
/* 80079EEC-80079F38 07482C 004C+00 2/0 1/0 0/0 .text ChkMemoryError__4cBgWFv */
bool cBgW::ChkMemoryError() {
if (pm_tri == NULL || pm_rwg == NULL || pm_blk == NULL || pm_node_tree == NULL ||
pm_grp == NULL)
{
return true;
}
return false;
}
/* 80079F38-8007A184 074878 024C+00 1/1 3/3 85/85 .text Set__4cBgWFP6cBgD_tUlPA3_A4_f */
bool cBgW::Set(cBgD_t* pbgd, u32 flags, Mtx* pbase_mtx) {
mFlags = GLOBAL_e;
pm_vtx_tbl = NULL;
pm_tri = NULL;
pm_rwg = NULL;
pm_blk = NULL;
pm_node_tree = NULL;
pm_grp = NULL;
mMoveCounter = cM_rndF(128.0f);
if (pbgd == NULL) {
return true;
}
mFlags = flags;
if (mFlags & GLOBAL_e) {
pm_base = NULL;
PSMTXIdentity(m_inv_mtx);
PSMTXIdentity(m_mtx);
} else {
pm_base = *pbase_mtx;
PSMTXCopy(pm_base, m_inv_mtx);
PSMTXCopy(pm_base, m_mtx);
}
pm_bgd = pbgd;
if (SetVtx() || SetTri()) {
FreeArea();
return true;
}
pm_rwg = new cBgW_RwgElm[pm_bgd->m_t_num];
if (pm_rwg == NULL) {
FreeArea();
return true;
}
pm_blk = new cBgW_BlkElm[pm_bgd->m_b_num];
if (pm_blk == NULL) {
FreeArea();
return true;
}
pm_node_tree = new cBgW_NodeTree[pm_bgd->m_tree_num];
if (pm_node_tree == NULL) {
FreeArea();
return true;
}
pm_grp = new cBgW_GrpElm[pm_bgd->m_g_num];
if (pm_grp == NULL) {
FreeArea();
return true;
}
ClassifyPlane();
mNeedsFullTransform = 1;
MakeNodeTree();
return false;
}
/* 8007A184-8007A1E4 074AC4 0060+00 2/1 0/0 0/0 .text __dt__11cBgW_GrpElmFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
// asm cBgW_GrpElm::~cBgW_GrpElm() {
extern "C" asm void __dt__11cBgW_GrpElmFv() {
nofralloc
#include "asm/d/bg/d_bg_w/__dt__11cBgW_GrpElmFv.s"
}
#pragma pop
/* 8007A1E4-8007A200 074B24 001C+00 1/1 0/0 0/0 .text __ct__11cBgW_GrpElmFv */
cBgW_GrpElm::cBgW_GrpElm() {}
/* 8007A200-8007A344 074B40 0144+00 1/1 0/0 0/0 .text RwgLineCheck__4cBgWFUsP11cBgS_LinChk */
// vtable issue
#ifdef NONMATCHING
bool cBgW::RwgLineCheck(u16 poly_index, cBgS_LinChk* linchk) {
bool chk;
chk = false;
cM3dGTri tri;
while (1) {
cBgD_Tri_t* tri_data = &pm_bgd->m_t_tbl[poly_index];
tri.setBg(&pm_vtx_tbl[tri_data->field_0x0], &pm_vtx_tbl[tri_data->field_0x2],
&pm_vtx_tbl[tri_data->field_0x4], &pm_tri[poly_index].m_plane);
cXyz cross;
if (tri.cross(linchk->GetLinP(), &cross, linchk->ChkFrontFlag(), linchk->ChkBackFlag())) {
if (!ChkPolyThrough(poly_index, linchk->GetPolyPassChk())) {
linchk->SetCross(cross);
linchk->SetPolyIndex(poly_index);
chk = true;
}
}
if (pm_rwg[poly_index].m_next == 0xFFFF) {
break;
}
poly_index = pm_rwg[poly_index].m_next;
}
return chk;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm bool cBgW::RwgLineCheck(u16 param_0, cBgS_LinChk* param_1) {
nofralloc
#include "asm/d/bg/d_bg_w/RwgLineCheck__4cBgWFUsP11cBgS_LinChk.s"
}
#pragma pop
#endif
/* 8007A344-8007A3A0 074C84 005C+00 1/0 0/0 0/0 .text __dt__8cM3dGTriFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
// asm cM3dGTri::~cM3dGTri() {
extern "C" asm void __dt__8cM3dGTriFv() {
nofralloc
#include "asm/d/bg/d_bg_w/__dt__8cM3dGTriFv.s"
}
#pragma pop
/* 8007A3A0-8007A52C 074CE0 018C+00 1/1 0/0 0/0 .text LineCheckRp__4cBgWFP11cBgS_LinChki
*/
bool cBgW::LineCheckRp(cBgS_LinChk* linchk, int param_1) {
cBgW_NodeTree* pnode0 = &pm_node_tree[param_1];
if (!cM3d_Cross_MinMaxBoxLine((Vec*)pnode0->GetMinP(), (Vec*)pnode0->GetMaxP(),
&linchk->GetLinP()->GetStartP(), &linchk->GetLinP()->GetEndP()))
{
return false;
}
cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[param_1];
bool chk = false;
if (pnode->m_flag & 1) {
if (linchk->GetPreWallChk()) {
u16 tmp = pm_blk[pnode->m_id[0]].m_wall_idx;
if (tmp != 0xFFFF && RwgLineCheck(tmp, linchk)) {
chk = true;
}
}
if (linchk->GetPreGroundChk()) {
u16 tmp = pm_blk[pnode->m_id[0]].m_gnd_idx;
if (tmp != 0xFFFF && RwgLineCheck(tmp, linchk)) {
chk = true;
}
}
if (linchk->GetPreRoofChk()) {
u16 tmp = pm_blk[pnode->m_id[0]].m_roof_idx;
if (tmp != 0xFFFF && RwgLineCheck(tmp, linchk)) {
chk = true;
}
}
return chk;
}
for (int i = 0; i < 8; i++) {
if (pnode->m_id[i] != 0xFFFF && LineCheckRp(linchk, pnode->m_id[i])) {
chk = true;
}
}
return chk;
}
/* 8007A52C-8007A658 074E6C 012C+00 1/1 0/0 0/0 .text LineCheckGrpRp__4cBgWFP11cBgS_LinChkii */
bool cBgW::LineCheckGrpRp(cBgS_LinChk* param_0, int param_1, int param_2) {
cM3dGLin* pcVar2 = param_0->GetLinP();
if (!pm_grp[param_1].m_aab.Cross(pcVar2)) {
return false;
}
if (ChkGrpThrough(param_1, param_0->GetGrpPassChk(), param_2)) {
return false;
}
bool uVar4 = false;
if (pm_bgd->m_g_tbl[param_1].m_tree_idx != 0xFFFF &&
LineCheckRp(param_0, pm_bgd->m_g_tbl[param_1].m_tree_idx))
{
uVar4 = true;
}
s32 uVar1 = pm_bgd->m_g_tbl[param_1].m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
if (LineCheckGrpRp(param_0, uVar1, param_2 + 1)) {
uVar4 = true;
}
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
return uVar4;
}
/* 8007A658-8007A680 074F98 0028+00 2/0 1/0 0/0 .text LineCheck__4cBgWFP11cBgS_LinChk */
bool cBgW::LineCheck(cBgS_LinChk* pchk) {
return LineCheckGrpRp(pchk, m_rootGrpIdx, 1);
}
/* 8007A680-8007A774 074FC0 00F4+00 2/2 0/0 0/0 .text
* RwgGroundCheckCommon__4cBgWFfUsP11cBgS_GndChk */
bool cBgW::RwgGroundCheckCommon(f32 param_0, u16 param_1, cBgS_GndChk* param_2) {
if (param_0 < param_2->GetPointP().y && param_0 > param_2->GetNowY()) {
cBgD_Tri_t* puVar7 = &pm_bgd->m_t_tbl[param_1];
if (cM3d_CrossY_Tri_Front(pm_vtx_tbl[puVar7->m_vtx_idx0], pm_vtx_tbl[puVar7->m_vtx_idx1],
pm_vtx_tbl[puVar7->m_vtx_idx2],
(const Vec*)&param_2->GetPointP()))
{
if (!ChkPolyThrough(param_1, param_2->GetPolyPassChk())) {
param_2->SetNowY(param_0);
param_2->SetPolyIndex(param_1);
return true;
}
}
}
return false;
}
/* 8007A774-8007A824 0750B4 00B0+00 1/1 0/0 0/0 .text RwgGroundCheckGnd__4cBgWFUsP11cBgS_GndChk */
bool cBgW::RwgGroundCheckGnd(u16 param_0, cBgS_GndChk* param_1) {
bool rv = false;
while (true) {
cBgW_RwgElm* puVar4 = &pm_rwg[param_0];
f32 dVar5 = pm_tri[param_0].m_plane.getCrossY_NonIsZero(&param_1->GetPointP());
if (RwgGroundCheckCommon(dVar5, (u32)param_0, param_1)) {
rv = true;
}
if (puVar4->m_next == 0xFFFF)
break;
param_0 = puVar4->m_next;
}
return rv;
}
/* 8007A824-8007A8F4 075164 00D0+00 1/1 0/0 0/0 .text RwgGroundCheckWall__4cBgWFUsP11cBgS_GndChk
*/
bool cBgW::RwgGroundCheckWall(u16 param_0, cBgS_GndChk* param_1) {
bool rv = false;
while (true) {
cBgW_TriElm* puVar5 = &pm_tri[param_0];
cBgW_RwgElm* puVar4 = &pm_rwg[param_0];
if (puVar5->m_plane.mNormal.y >= 0.014f) {
f32 dVar5 = puVar5->m_plane.getCrossY_NonIsZero(&param_1->GetPointP());
if (RwgGroundCheckCommon(dVar5, (u32)param_0, param_1)) {
rv = true;
}
}
if (puVar4->m_next == 0xFFFF)
break;
param_0 = puVar4->m_next;
}
return rv;
}
/* 8007A8F4-8007AA50 075234 015C+00 1/1 0/0 0/0 .text GroundCrossRp__4cBgWFP11cBgS_GndChki */
bool cBgW::GroundCrossRp(cBgS_GndChk* param_0, int param_1) {
bool rv = false;
cBgD_Tree_t* puVar9 = &pm_bgd->m_tree_tbl[param_1];
if ((puVar9->m_flag & 1)) {
if (pm_blk[puVar9->m_id[0]].m_gnd_idx != 0xFFFF &&
RwgGroundCheckGnd(pm_blk[puVar9->m_id[0]].m_gnd_idx, param_0))
{
rv = true;
}
if (param_0->GetWallPrecheck() && pm_blk[puVar9->m_id[0]].m_wall_idx != 0xFFFF &&
RwgGroundCheckWall(pm_blk[puVar9->m_id[0]].m_wall_idx, param_0))
{
rv = true;
}
return rv;
}
for (int i = 0; i < 8; i++) {
if (puVar9->m_id[i] != 0xFFFF) {
cM3dGAab* this_00 = &pm_node_tree[puVar9->m_id[i]];
if (this_00->CrossY(&param_0->GetPointP())) {
if (this_00->UnderPlaneYUnder(param_0->GetPointP().y)) {
if (!this_00->TopPlaneYUnder(param_0->GetNowY()) &&
GroundCrossRp(param_0, puVar9->m_id[i]))
{
rv = true;
}
}
}
}
}
return rv;
}
/* 8007AA50-8007AB9C 075390 014C+00 1/1 0/0 0/0 .text GroundCrossGrpRp__4cBgWFP11cBgS_GndChkii */
bool cBgW::GroundCrossGrpRp(cBgS_GndChk* param_0, int param_1, int param_2) {
cBgW_GrpElm* iVar7 = &pm_grp[param_1];
if (!iVar7->m_aab.CrossY(&param_0->GetPointP()) ||
!iVar7->m_aab.UnderPlaneYUnder(param_0->GetPointP().y) ||
iVar7->m_aab.TopPlaneYUnder(param_0->GetNowY()))
{
return false;
}
if (ChkGrpThrough(param_1, param_0->GetGrpPassChk(), param_2)) {
return false;
}
bool uVar6 = false;
if (pm_bgd->m_g_tbl[param_1].m_tree_idx != 0xFFFF &&
GroundCrossRp(param_0, pm_bgd->m_g_tbl[param_1].m_tree_idx))
{
uVar6 = true;
}
s32 uVar8 = pm_bgd->m_g_tbl[param_1].m_first_child;
while (true) {
if (uVar8 == 0xFFFF) {
break;
}
if (GroundCrossGrpRp(param_0, uVar8, param_2 + 1)) {
uVar6 = true;
}
uVar8 = pm_bgd->m_g_tbl[uVar8].m_next_sibling;
}
return uVar6;
}
/* 8007AB9C-8007ABC4 0754DC 0028+00 2/0 1/0 0/0 .text GroundCross__4cBgWFP11cBgS_GndChk
*/
bool cBgW::GroundCross(cBgS_GndChk* pchk) {
return GroundCrossGrpRp(pchk, m_rootGrpIdx, 1);
}
/* 8007ABC4-8007AC10 075504 004C+00 1/1 0/0 0/0 .text CopyOldMtx__4cBgWFv */
void cBgW::CopyOldMtx() {
if (pm_base != NULL) {
PSMTXCopy(m_mtx, m_inv_mtx);
PSMTXCopy(pm_base, m_mtx);
}
}
/* 8007AC10-8007ADF0 075550 01E0+00 1/1 0/0 0/0 .text Move__4cBgWFv */
void cBgW::Move() {
if (!ChkLock() && (mFlags & 1)) {
if (!ChkNoCalcVtx()) {
if (mMoveCounter >= 0xFF || m_mtx[0][0] != pm_base[0][0] ||
m_mtx[0][1] != pm_base[0][1] || m_mtx[0][2] != pm_base[0][2] ||
m_mtx[1][0] != pm_base[1][0] || m_mtx[1][1] != pm_base[1][1] ||
m_mtx[1][2] != pm_base[1][2] || m_mtx[2][0] != pm_base[2][0] ||
m_mtx[2][1] != pm_base[2][1] || m_mtx[2][2] != pm_base[2][2])
{
mNeedsFullTransform = 1;
} else if (m_mtx[0][3] == pm_base[0][3] && m_mtx[1][3] == pm_base[1][3] &&
m_mtx[2][3] == pm_base[2][3])
{
PSMTXCopy(pm_base, m_inv_mtx);
if (!ChkFlush()) {
return;
}
} else {
mTransVel.x = pm_base[0][3] - m_mtx[0][3];
mTransVel.y = pm_base[1][3] - m_mtx[1][3];
mTransVel.z = pm_base[2][3] - m_mtx[2][3];
mNeedsFullTransform = 0;
}
if (mMoveCounter >= 0xFF) {
mMoveCounter = 0;
} else {
mMoveCounter++;
}
GlobalVtx();
}
CopyOldMtx();
CalcPlane();
ClassifyPlane();
MakeNodeTree();
}
}
/* 8007ADF0-8007AEA4 075730 00B4+00 1/1 0/0 0/0 .text RwgShdwDraw__4cBgWFiP13cBgS_ShdwDraw */
void cBgW::RwgShdwDraw(int param_0, cBgS_ShdwDraw* param_1) {
while (true) {
cBgW_RwgElm* puVar4 = &pm_rwg[param_0];
if (!ChkShdwDrawThrough(param_0, param_1->GetPolyPassChk())) {
(param_1->mCallbackFun)(param_1, pm_vtx_tbl, pm_bgd->m_t_tbl[param_0].m_vtx_idx0,
pm_bgd->m_t_tbl[param_0].m_vtx_idx1,
pm_bgd->m_t_tbl[param_0].m_vtx_idx2, &pm_tri[param_0].m_plane);
}
if (puVar4->m_next == 0xFFFF)
break;
param_0 = puVar4->m_next;
}
}
/* 8007AEA4-8007AFC0 0757E4 011C+00 1/1 0/0 0/0 .text ShdwDrawRp__4cBgWFP13cBgS_ShdwDrawi
*/
void cBgW::ShdwDrawRp(cBgS_ShdwDraw* param_1, int param_2) {
if (pm_node_tree[param_2].Cross(param_1->GetBndP())) {
cBgD_Tree_t* puVar3 = &pm_bgd->m_tree_tbl[param_2];
if ((puVar3->m_flag & 1)) {
if (pm_blk[puVar3->m_id[0]].m_wall_idx != 0xFFFF) {
RwgShdwDraw(pm_blk[puVar3->m_id[0]].m_wall_idx, param_1);
}
if (pm_blk[puVar3->m_id[0]].m_roof_idx != 0xFFFF) {
RwgShdwDraw(pm_blk[puVar3->m_id[0]].m_roof_idx, param_1);
}
if (pm_blk[puVar3->m_id[0]].m_gnd_idx != 0xFFFF) {
RwgShdwDraw(pm_blk[puVar3->m_id[0]].m_gnd_idx, param_1);
}
} else {
for (int iVar2 = 0; iVar2 < 8; iVar2++) {
if (puVar3->m_id[iVar2] != 0xFFFF) {
ShdwDrawRp(param_1, puVar3->m_id[iVar2]);
}
}
}
}
}
/* 8007AFC0-8007B084 075900 00C4+00 1/1 0/0 0/0 .text ShdwDrawGrpRp__4cBgWFP13cBgS_ShdwDrawi */
void cBgW::ShdwDrawGrpRp(cBgS_ShdwDraw* param_0, int param_1) {
if (pm_grp[param_1].m_aab.Cross(param_0->GetBndP())) {
if (pm_bgd->m_g_tbl[param_1].m_tree_idx != 0xFFFF) {
ShdwDrawRp(param_0, pm_bgd->m_g_tbl[param_1].m_tree_idx);
}
s32 uVar1 = pm_bgd->m_g_tbl[param_1].m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
ShdwDrawGrpRp(param_0, uVar1);
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
}
}
/* 8007B084-8007B0A8 0759C4 0024+00 2/0 1/0 0/0 .text ShdwDraw__4cBgWFP13cBgS_ShdwDraw */
void cBgW::ShdwDraw(cBgS_ShdwDraw* pshdw) {
ShdwDrawGrpRp(pshdw, m_rootGrpIdx);
}
/* 8007B0A8-8007B0B0 0759E8 0008+00 1/0 0/0 0/0 .text ChkPolyThrough__4cBgWFiP16cBgS_PolyPassChk
*/
bool cBgW::ChkPolyThrough(int param_0, cBgS_PolyPassChk* param_1) {
return false;
}
/* 8007B0B0-8007B0DC 0759F0 002C+00 1/0 0/0 0/0 .text
* ChkShdwDrawThrough__4cBgWFiP16cBgS_PolyPassChk */
bool cBgW::ChkShdwDrawThrough(int param_0, cBgS_PolyPassChk* param_1) {
return ChkPolyThrough(param_0, param_1);
}
/* 8007B0DC-8007B0E4 075A1C 0008+00 1/0 0/0 0/0 .text ChkGrpThrough__4cBgWFiP15cBgS_GrpPassChki */
bool cBgW::ChkGrpThrough(int param_0, cBgS_GrpPassChk* param_1, int param_2) {
return false;
}
/* 8007B0E4-8007B164 075A24 0080+00 2/0 1/0 0/0 .text GetGrpRoomIndex__4cBgWCFRC13cBgS_PolyInfo */
s32 cBgW::GetGrpRoomIndex(cBgS_PolyInfo const& poly) const {
int grp_index = GetTriGrp(poly.GetPolyIndex());
u16 tmp = pm_bgd->m_g_tbl[grp_index].m_parent;
if (tmp == 0xFFFF || pm_bgd->m_g_tbl[tmp].m_parent == 0xFFFF) {
return 0xFF;
}
int room_index = pm_bgd->m_g_tbl[pm_bgd->m_g_tbl[tmp].m_parent].m_room_id;
if (room_index >= 0xFF) {
room_index = 0xFF;
}
return room_index;
}
/* 8007B164-8007B17C 075AA4 0018+00 2/0 1/0 0/0 .text GetBnd__4cBgWCFv */
cM3dGAab* cBgW::GetBnd() const {
return &pm_grp[m_rootGrpIdx].m_aab;
}
/* 8007B17C-8007B1B4 075ABC 0038+00 0/0 1/1 0/0 .text GetTrans__4cBgWCFP4cXyz */
void cBgW::GetTrans(cXyz* p_trans) const {
MtxP base = pm_base;
p_trans->x = base[0][3] - m_inv_mtx[0][3];
p_trans->y = base[1][3] - m_inv_mtx[1][3];
p_trans->z = base[2][3] - m_inv_mtx[2][3];
}
/* 8007B1B4-8007B240 075AF4 008C+00 2/0 1/0 0/0 .text
* GetTriPnt__4cBgWCFRC13cBgS_PolyInfoP4cXyzP4cXyzP4cXyz */
bool cBgW::GetTriPnt(cBgS_PolyInfo const& poly, cXyz* p_pnt1, cXyz* p_pnt2, cXyz* p_pnt3) const {
u16 poly_index = poly.GetPolyIndex();
cBgD_Tri_t* tri_data = &pm_bgd->m_t_tbl[poly_index];
p_pnt1->set(pm_vtx_tbl[tri_data->m_vtx_idx0]);
p_pnt2->set(pm_vtx_tbl[tri_data->m_vtx_idx1]);
p_pnt3->set(pm_vtx_tbl[tri_data->m_vtx_idx2]);
return true;
}
/* 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[m_rootGrpIdx].m_aab.GetMinP()->y;
*p_top = pm_grp[m_rootGrpIdx].m_aab.GetMaxP()->y;
}
/* 8007B270-8007B2B0 075BB0 0040+00 2/0 1/0 0/0 .text GetTriPla__4cBgWCFRC13cBgS_PolyInfo
*/
cM3dGPla cBgW::GetTriPla(cBgS_PolyInfo const& poly) const {
u16 poly_index = poly.GetPolyIndex();
return pm_tri[poly_index].m_plane;
}
/* 8007B2B0-8007B2F4 075BF0 0044+00 2/0 1/0 0/0 .text GetGrpInf__4cBgWCFRC13cBgS_PolyInfo
*/
u32 cBgW::GetGrpInf(cBgS_PolyInfo const& poly) const {
int grp = GetTriGrp(poly.GetPolyIndex());
return pm_bgd->m_g_tbl[grp].m_info;
}
/* 8007B2F4-8007B30C 075C34 0018+00 5/5 0/0 0/0 .text GetPolyInfId__4cBgWCFi */
int cBgW::GetPolyInfId(int poly_index) const {
return pm_bgd->m_t_tbl[poly_index].m_id;
}
/* 8007B30C-8007B360 075C4C 0054+00 6/6 0/0 0/0 .text GetPolyInf0__4cBgWCFiUlUl */
u32 cBgW::GetPolyInf0(int poly_index, u32 mask, u32 shift) const {
int id = GetPolyInfId(poly_index);
return (pm_bgd->m_ti_tbl[id].m_info0 & mask) >> shift;
}
/* 8007B360-8007B3AC 075CA0 004C+00 10/10 0/0 0/0 .text GetMaskPolyInf0_NoShift__4cBgWCFiUl */
u32 cBgW::GetMaskPolyInf0_NoShift(int poly_index, u32 mask) const {
int id = GetPolyInfId(poly_index);
return (pm_bgd->m_ti_tbl[id].m_info0 & mask);
}
/* 8007B3AC-8007B3D8 075CEC 002C+00 1/0 1/0 0/0 .text GetExitId__4dBgWFRC13cBgS_PolyInfo
*/
s32 dBgW::GetExitId(cBgS_PolyInfo const& poly) {
return GetPolyInf0(poly.GetPolyIndex(), 0x3F, 0);
}
/* 8007B3D8-8007B404 075D18 002C+00 1/0 1/0 0/0 .text GetPolyColor__4dBgWFRC13cBgS_PolyInfo */
s32 dBgW::GetPolyColor(cBgS_PolyInfo const& poly) {
return GetPolyInf0(poly.GetPolyIndex(), 0x3FC0, 6);
}
/* 8007B404-8007B430 075D44 002C+00 1/0 1/0 0/0 .text GetHorseNoEntry__4dBgWFRC13cBgS_PolyInfo */
BOOL dBgW::GetHorseNoEntry(cBgS_PolyInfo const& poly) {
return GetPolyInf0(poly.GetPolyIndex(), 0x200000, 21);
}
/* 8007B430-8007B460 075D70 0030+00 1/0 1/0 0/0 .text GetSpecialCode__4dBgWFRC13cBgS_PolyInfo */
int dBgW::GetSpecialCode(cBgS_PolyInfo const& poly) {
return GetSpecialCode(poly.GetPolyIndex());
}
/* 8007B460-8007B488 075DA0 0028+00 1/0 1/0 0/0 .text GetSpecialCode__4dBgWFi */
int dBgW::GetSpecialCode(int poly_index) {
return GetPolyInf0(poly_index, 0xF000000, 24);
}
/* 8007B488-8007B4B4 075DC8 002C+00 1/0 1/0 0/0 .text GetMagnetCode__4dBgWFRC13cBgS_PolyInfo */
int dBgW::GetMagnetCode(cBgS_PolyInfo const& poly) {
return GetPolyInf0(poly.GetPolyIndex(), 0x30000000, 28);
}
/* 8007B4B4-8007B4E0 075DF4 002C+00 1/0 1/0 0/0 .text GetMonkeyBarsCode__4dBgWFRC13cBgS_PolyInfo
*/
int dBgW::GetMonkeyBarsCode(cBgS_PolyInfo const& poly) {
return GetPolyInf0(poly.GetPolyIndex(), 0x80000000, 31);
}
/* 8007B4E0-8007B504 075E20 0024+00 1/0 1/0 0/0 .text GetPolyObjThrough__4dBgWFi */
u32 dBgW::GetPolyObjThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x4000);
}
/* 8007B504-8007B52C 075E44 0028+00 1/0 1/0 0/0 .text GetPolyCamThrough__4dBgWFi */
u32 dBgW::GetPolyCamThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x8000);
}
/* 8007B52C-8007B550 075E6C 0024+00 1/0 1/0 0/0 .text GetPolyLinkThrough__4dBgWFi */
u32 dBgW::GetPolyLinkThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x10000);
}
/* 8007B550-8007B574 075E90 0024+00 1/0 1/0 0/0 .text GetPolyArrowThrough__4dBgWFi */
u32 dBgW::GetPolyArrowThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x20000);
}
/* 8007B574-8007B598 075EB4 0024+00 1/0 1/0 0/0 .text GetPolyHSStick__4dBgWFi */
u32 dBgW::GetPolyHSStick(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x40000);
}
/* 8007B598-8007B5BC 075ED8 0024+00 1/0 1/0 0/0 .text GetPolyBoomerangThrough__4dBgWFi */
u32 dBgW::GetPolyBoomerangThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x80000);
}
/* 8007B5BC-8007B5E0 075EFC 0024+00 1/0 1/0 0/0 .text GetPolyRopeThrough__4dBgWFi */
u32 dBgW::GetPolyRopeThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x100000);
}
/* 8007B5E0-8007B604 075F20 0024+00 1/0 1/0 0/0 .text GetPolyBombThrough__4dBgWFi */
u32 dBgW::GetPolyBombThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x800000);
}
/* 8007B604-8007B630 075F44 002C+00 1/0 1/0 0/0 .text GetShdwThrough__4dBgWFi */
bool dBgW::GetShdwThrough(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x400000) != 0;
}
/* 8007B630-8007B654 075F70 0024+00 1/0 1/0 0/0 .text GetUnderwaterRoofCode__4dBgWFi */
u32 dBgW::GetUnderwaterRoofCode(int poly_index) {
return GetMaskPolyInf0_NoShift(poly_index, 0x40000000);
}
/* 8007B654-8007B6AC 075F94 0058+00 6/6 0/0 0/0 .text GetPolyInf1__4cBgWCFiUlUl */
u32 cBgW::GetPolyInf1(int poly_index, u32 mask, u32 shift) const {
int id = GetPolyInfId(poly_index);
return (pm_bgd->m_ti_tbl[id].m_info1 & mask) >> shift;
}
/* 8007B6AC-8007B6D8 075FEC 002C+00 1/0 1/0 0/0 .text GetLinkNo__4dBgWFRC13cBgS_PolyInfo
*/
int dBgW::GetLinkNo(cBgS_PolyInfo const& poly) {
return GetPolyInf1(poly.GetPolyIndex(), 0xFF, 0);
}
/* 8007B6D8-8007B704 076018 002C+00 1/0 1/0 0/0 .text GetWallCode__4dBgWFRC13cBgS_PolyInfo */
s32 dBgW::GetWallCode(cBgS_PolyInfo const& poly) {
return GetPolyInf1(poly.GetPolyIndex(), 0xF00, 8);
}
/* 8007B704-8007B734 076044 0030+00 1/0 1/0 0/0 .text GetPolyAtt0__4dBgWFRC13cBgS_PolyInfo */
int dBgW::GetPolyAtt0(cBgS_PolyInfo const& poly) {
return GetPolyInf1(poly.GetPolyIndex(), 0xF000, 12);
}
/* 8007B734-8007B760 076074 002C+00 1/0 1/0 0/0 .text GetPolyAtt1__4dBgWFRC13cBgS_PolyInfo */
int dBgW::GetPolyAtt1(cBgS_PolyInfo const& poly) {
return GetPolyInf1(poly.GetPolyIndex(), 0x70000, 16);
}
/* 8007B760-8007B78C 0760A0 002C+00 1/0 1/0 0/0 .text GetGroundCode__4dBgWFRC13cBgS_PolyInfo */
int dBgW::GetGroundCode(cBgS_PolyInfo const& poly) {
return GetPolyInf1(poly.GetPolyIndex(), 0xF80000, 19);
}
/* 8007B78C-8007B7DC 0760CC 0050+00 2/2 0/0 0/0 .text GetMaskPolyInf1_NoShift__4cBgWCFiUl
*/
u32 cBgW::GetMaskPolyInf1_NoShift(int poly_index, u32 mask) const {
int id = GetPolyInfId(poly_index);
return (pm_bgd->m_ti_tbl[id].m_info1 & mask);
}
/* 8007B7DC-8007B800 07611C 0024+00 1/0 1/0 0/0 .text GetIronBallThrough__4dBgWFi */
u32 dBgW::GetIronBallThrough(int poly_index) {
return GetMaskPolyInf1_NoShift(poly_index, 0x1000000);
}
/* 8007B800-8007B824 076140 0024+00 1/0 1/0 0/0 .text GetAttackThrough__4dBgWFi */
u32 dBgW::GetAttackThrough(int poly_index) {
return GetMaskPolyInf1_NoShift(poly_index, 0x2000000);
}
/* 8007B824-8007B87C 076164 0058+00 4/4 0/0 0/0 .text GetPolyInf2__4cBgWCFiUlUl */
u32 cBgW::GetPolyInf2(int poly_index, u32 mask, u32 shift) const {
int id = GetPolyInfId(poly_index);
return (pm_bgd->m_ti_tbl[id].m_info2 & mask) >> shift;
}
/* 8007B87C-8007B8A8 0761BC 002C+00 1/0 1/0 0/0 .text GetCamMoveBG__4dBgWFRC13cBgS_PolyInfo */
s32 dBgW::GetCamMoveBG(cBgS_PolyInfo const& poly) {
return GetPolyInf2(poly.GetPolyIndex(), 0xFF, 0);
}
/* 8007B8A8-8007B8D8 0761E8 0030+00 1/0 1/0 0/0 .text GetRoomCamId__4dBgWFRC13cBgS_PolyInfo */
s32 dBgW::GetRoomCamId(cBgS_PolyInfo const& poly) {
return GetPolyInf2(poly.GetPolyIndex(), 0xFF00, 8);
}
/* 8007B8D8-8007B904 076218 002C+00 1/0 1/0 0/0 .text GetRoomPathId__4dBgWFRC13cBgS_PolyInfo */
s32 dBgW::GetRoomPathId(cBgS_PolyInfo const& poly) {
return GetPolyInf2(poly.GetPolyIndex(), 0xFF0000, 16);
}
/* 8007B904-8007B930 076244 002C+00 1/0 1/0 0/0 .text GetRoomPathPntNo__4dBgWFRC13cBgS_PolyInfo */
s32 dBgW::GetRoomPathPntNo(cBgS_PolyInfo const& poly) {
return GetPolyInf2(poly.GetPolyIndex(), 0xFF000000, 24);
}
/* 8007B930-8007B948 076270 0018+00 2/2 0/0 0/0 .text GetTriGrp__4cBgWCFi */
int cBgW::GetTriGrp(int poly_index) const {
return pm_bgd->m_t_tbl[poly_index].m_grp;
}
/* 8007B948-8007B958 076288 0010+00 2/0 1/0 0/0 .text ChkNotReady__4cBgWCFv */
bool cBgW::ChkNotReady() const {
return pm_vtx_tbl == NULL;
}
/* 8007B958-8007B964 076298 000C+00 2/0 1/0 0/0 .text ChkLock__4cBgWCFv */
bool cBgW::ChkLock() const {
return mFlags & 0x80;
}
/* 8007B964-8007B970 0762A4 000C+00 2/0 1/0 0/0 .text ChkMoveBg__4cBgWCFv */
bool cBgW::ChkMoveBg() const {
return mFlags & 0x1;
}
/* 8007B970-8007B9C0 0762B0 0050+00 1/1 2/2 87/87 .text __ct__4dBgWFv */
dBgW::dBgW() {
m_crr_func = NULL;
m_ride_callback = NULL;
m_arrow_stick_callback = NULL;
m_flags = 0;
}
/* 8007B9C0-8007B9EC 076300 002C+00 0/0 2/2 115/115 .text Move__4dBgWFv */
void dBgW::Move() {
OnMoveFlag();
cBgW::Move();
}
/* 8007B9EC-8007BA40 07632C 0054+00 2/2 0/0 0/0 .text
* positionWallCorrect__4dBgWFP9dBgS_AcchfR8cM3dGPlaP4cXyzf */
// matches with literals
#ifdef NONMATCHING
void dBgW::positionWallCorrect(dBgS_Acch* param_0, f32 param_1, cM3dGPla& param_2, cXyz* pupper_pos,
f32 param_4) {
param_0->SetWallHit();
f32 tmp = param_4 - 1.0f;
if (tmp < 0.0f) {
tmp = 0.0f;
}
f32 temp_f2 = tmp * param_1;
pupper_pos->x += temp_f2 * param_2.mNormal.x;
pupper_pos->z += temp_f2 * param_2.mNormal.z;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dBgW::positionWallCorrect(dBgS_Acch* param_0, f32 param_1, cM3dGPla& param_2,
cXyz* param_3, f32 param_4) {
nofralloc
#include "asm/d/bg/d_bg_w/positionWallCorrect__4dBgWFP9dBgS_AcchfR8cM3dGPlaP4cXyzf.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80452710-80452718 000D10 0004+04 2/2 0/0 0/0 .sdata2 @4962 */
SECTION_SDATA2 static f32 lit_4962[1 + 1 /* padding */] = {
1.0f / 125.0f,
/* padding */
0.0f,
};
/* 8007BA40-8007C234 076380 07F4+00 1/1 0/0 0/0 .text RwgWallCorrect__4dBgWFP9dBgS_AcchUs
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm bool dBgW::RwgWallCorrect(dBgS_Acch* param_0, u16 param_1) {
nofralloc
#include "asm/d/bg/d_bg_w/RwgWallCorrect__4dBgWFP9dBgS_AcchUs.s"
}
#pragma pop
/* 8007C234-8007C360 076B74 012C+00 1/1 0/0 0/0 .text WallCorrectRp__4dBgWFP9dBgS_Acchi
*/
bool dBgW::WallCorrectRp(dBgS_Acch* param_0, int param_1) {
if (!pm_node_tree[param_1].Cross(param_0->GetWallBmdCylP())) {
return false;
}
cBgD_Tree_t* puVar9 = &pm_bgd->m_tree_tbl[param_1];
bool uVar6 = false;
if ((puVar9->m_flag & 1)) {
if (pm_blk[puVar9->m_id[0]].m_wall_idx != 0xFFFF &&
RwgWallCorrect(param_0, pm_blk[puVar9->m_id[0]].m_wall_idx))
{
uVar6 = true;
}
if (pm_blk[puVar9->m_id[0]].m_roof_idx != 0xFFFF &&
RwgWallCorrect(param_0, pm_blk[puVar9->m_id[0]].m_roof_idx))
{
uVar6 = true;
}
return uVar6;
}
for (int i = 0; i < 8; i++) {
if (puVar9->m_id[i] != 0xFFFF && WallCorrectRp(param_0, puVar9->m_id[i])) {
uVar6 = true;
}
}
return uVar6;
}
/* 8007C360-8007C484 076CA0 0124+00 1/1 0/0 0/0 .text WallCorrectGrpRp__4dBgWFP9dBgS_Acchii */
bool dBgW::WallCorrectGrpRp(dBgS_Acch* param_0, int param_1, int param_2) {
if (!pm_grp[param_1].m_aab.Cross(param_0->GetWallBmdCylP())) {
return false;
}
if (ChkGrpThrough(param_1, param_0->GetGrpPassChk(), param_2)) {
return false;
}
bool uVar6 = false;
if (pm_bgd->m_g_tbl[param_1].m_tree_idx != 0xFFFF &&
WallCorrectRp(param_0, pm_bgd->m_g_tbl[param_1].m_tree_idx))
{
uVar6 = true;
}
s32 uVar1 = pm_bgd->m_g_tbl[param_1].m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
if (WallCorrectGrpRp(param_0, uVar1, param_2 + 1)) {
uVar6 = true;
}
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
return uVar6;
}
/* 8007C484-8007C4AC 076DC4 0028+00 1/0 1/0 0/0 .text WallCorrect__4dBgWFP9dBgS_Acch */
bool dBgW::WallCorrect(dBgS_Acch* pacch) {
return WallCorrectGrpRp(pacch, m_rootGrpIdx, 1);
}
struct wcs_data {
/* 0x0 */ f32 field_0x0;
/* 0x4 */ u16 field_0x4;
/* 0x8 */ int field_0x8;
}; // Size: 0xC
/* ############################################################################################## */
/* 80424B80-80424F70 0518A0 03F0+00 1/1 0/0 0/0 .bss l_wcsbuf */
static wcs_data l_wcsbuf[84];
/* 80450F80-80450F84 000480 0004+00 2/2 0/0 0/0 .sbss l_start */
static wcs_data* l_start;
/* 80450F84-80450F88 000484 0004+00 2/2 0/0 0/0 .sbss l_wcsbuf_num */
static int l_wcsbuf_num;
/* 8007C4AC-8007C714 076DEC 0268+00 1/1 0/0 0/0 .text RwgWallCorrectSort__4dBgWFP9dBgS_AcchUs */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dBgW::RwgWallCorrectSort(dBgS_Acch* param_0, u16 param_1) {
nofralloc
#include "asm/d/bg/d_bg_w/RwgWallCorrectSort__4dBgWFP9dBgS_AcchUs.s"
}
#pragma pop
/* 8007C714-8007C808 077054 00F4+00 1/1 0/0 0/0 .text WallCorrectRpSort__4dBgWFP9dBgS_Acchi */
void dBgW::WallCorrectRpSort(dBgS_Acch* param_0, int param_1) {
if (!pm_node_tree[param_1].Cross(param_0->GetWallBmdCylP())) {
return;
}
cBgD_Tree_t* puVar9 = &pm_bgd->m_tree_tbl[param_1];
if ((puVar9->m_flag & 1)) {
if (pm_blk[puVar9->m_id[0]].m_wall_idx != 0xFFFF) {
RwgWallCorrectSort(param_0, pm_blk[puVar9->m_id[0]].m_wall_idx);
}
if (pm_blk[puVar9->m_id[0]].m_roof_idx != 0xFFFF) {
RwgWallCorrectSort(param_0, pm_blk[puVar9->m_id[0]].m_roof_idx);
}
return;
}
for (int i = 0; i < 8; i++) {
if (puVar9->m_id[i] != 0xFFFF) {
WallCorrectRpSort(param_0, puVar9->m_id[i]);
}
}
}
/* 8007C808-8007C910 077148 0108+00 1/1 0/0 0/0 .text WallCorrectGrpRpSort__4dBgWFP9dBgS_Acchii */
bool dBgW::WallCorrectGrpRpSort(dBgS_Acch* param_0, int param_1, int param_2) {
if (!pm_grp[param_1].m_aab.Cross(param_0->GetWallBmdCylP())) {
return false;
}
if (ChkGrpThrough(param_1, param_0->GetGrpPassChk(), param_2)) {
return false;
}
if (pm_bgd->m_g_tbl[param_1].m_tree_idx != 0xFFFF) {
WallCorrectRpSort(param_0, pm_bgd->m_g_tbl[param_1].m_tree_idx);
}
s32 uVar1 = pm_bgd->m_g_tbl[param_1].m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
WallCorrectGrpRpSort(param_0, uVar1, param_2 + 1);
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
return false;
}
/* 8007C910-8007D0DC 077250 07CC+00 1/0 1/0 0/0 .text WallCorrectSort__4dBgWFP9dBgS_Acch
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dBgW::WallCorrectSort(dBgS_Acch* param_0) {
nofralloc
#include "asm/d/bg/d_bg_w/WallCorrectSort__4dBgWFP9dBgS_Acch.s"
}
#pragma pop
/* 8007D0DC-8007D208 077A1C 012C+00 1/1 0/0 0/0 .text RwgRoofChk__4dBgWFUsP12dBgS_RoofChk
*/
bool dBgW::RwgRoofChk(u16 param_0, dBgS_RoofChk* param_1) {
bool rv = false;
f32 crossY;
while (true) {
if (pm_tri[param_0].m_plane.getCrossY(*param_1->GetPosP(), &crossY) &&
crossY > param_1->GetPosP()->y && crossY < param_1->GetNowY())
{
cBgD_Tri_t* tri_data = &pm_bgd->m_t_tbl[param_0];
if (cM3d_CrossY_Tri(pm_vtx_tbl[tri_data->m_vtx_idx0], pm_vtx_tbl[tri_data->m_vtx_idx1],
pm_vtx_tbl[tri_data->m_vtx_idx2], pm_tri[param_0].m_plane,
(const Vec*)param_1->GetPosP()))
{
if (!ChkPolyThrough(param_0, param_1->GetPolyPassChk())) {
param_1->SetNowY(crossY);
param_1->SetPolyIndex(param_0);
rv = true;
}
}
}
if (pm_rwg[param_0].m_next == 0xFFFF)
break;
param_0 = pm_rwg[param_0].m_next;
}
return rv;
}
/* 8007D208-8007D330 077B48 0128+00 1/1 0/0 0/0 .text RoofChkRp__4dBgWFP12dBgS_RoofChki
*/
bool dBgW::RoofChkRp(dBgS_RoofChk* param_0, int param_1) {
cBgW_NodeTree* tree = &pm_node_tree[param_1];
if (!tree->CrossY(param_0->GetPosP()) || !tree->UnderPlaneYUnder(param_0->GetNowY()) ||
tree->TopPlaneYUnder(param_0->GetPosP()->y))
{
return false;
}
cBgD_Tree_t* puVar9 = &pm_bgd->m_tree_tbl[param_1];
if ((puVar9->m_flag & 1)) {
if (pm_blk[puVar9->m_id[0]].m_roof_idx != 0xFFFF &&
RwgRoofChk(pm_blk[puVar9->m_id[0]].m_roof_idx, param_0))
{
return true;
}
return false;
}
bool rv = false;
for (int i = 0; i < 8; i++) {
if (puVar9->m_id[i] != 0xFFFF && RoofChkRp(param_0, puVar9->m_id[i])) {
rv = true;
}
}
return rv;
}
/* 8007D330-8007D470 077C70 0140+00 1/1 0/0 0/0 .text RoofChkGrpRp__4dBgWFP12dBgS_RoofChkii */
bool dBgW::RoofChkGrpRp(dBgS_RoofChk* param_0, int param_1, int param_2) {
cBgW_GrpElm* grp = &pm_grp[param_1];
if (!grp->m_aab.CrossY(param_0->GetPosP()) ||
!grp->m_aab.UnderPlaneYUnder(param_0->GetNowY()) ||
grp->m_aab.TopPlaneYUnder(param_0->GetPosP()->y))
{
return false;
}
if (ChkGrpThrough(param_1, param_0->GetGrpPassChk(), param_2)) {
return false;
}
bool uVar6 = false;
cBgD_Grp_t* data = &pm_bgd->m_g_tbl[param_1];
if (data->m_tree_idx != 0xFFFF && RoofChkRp(param_0, data->m_tree_idx)) {
uVar6 = true;
}
s32 uVar1 = data->m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
if (RoofChkGrpRp(param_0, uVar1, param_2 + 1)) {
uVar6 = true;
}
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
return uVar6;
}
/* 8007D470-8007D498 077DB0 0028+00 1/0 1/0 0/0 .text RoofChk__4dBgWFP12dBgS_RoofChk */
bool dBgW::RoofChk(dBgS_RoofChk* pchk) {
return RoofChkGrpRp(pchk, m_rootGrpIdx, 1);
}
/* 8007D498-8007D5C4 077DD8 012C+00 1/1 0/0 0/0 .text RwgSplGrpChk__4dBgWFUsP14dBgS_SplGrpChk */
bool dBgW::RwgSplGrpChk(u16 param_0, dBgS_SplGrpChk* param_1) {
bool rv = false;
f32 crossY;
while (true) {
if (pm_tri[param_0].m_plane.getCrossY(param_1->GetPosP(), &crossY) &&
crossY < param_1->GetRoof() && crossY > param_1->GetHeight())
{
cBgD_Tri_t* tri_data = &pm_bgd->m_t_tbl[param_0];
if (cM3d_CrossY_Tri(pm_vtx_tbl[tri_data->m_vtx_idx0], pm_vtx_tbl[tri_data->m_vtx_idx1],
pm_vtx_tbl[tri_data->m_vtx_idx2], pm_tri[param_0].m_plane,
(const Vec*)&param_1->GetPosP()))
{
if (!ChkPolyThrough(param_0, param_1->GetPolyPassChk())) {
param_1->SetHeight(crossY);
param_1->SetPolyIndex(param_0);
rv = true;
}
}
}
if (pm_rwg[param_0].m_next == 0xFFFF)
break;
param_0 = pm_rwg[param_0].m_next;
}
return rv;
}
/* 8007D5C4-8007D6F0 077F04 012C+00 1/1 0/0 0/0 .text SplGrpChkRp__4dBgWFP14dBgS_SplGrpChki */
bool dBgW::SplGrpChkRp(dBgS_SplGrpChk* param_0, int param_1) {
cBgW_NodeTree* tree = &pm_node_tree[param_1];
if (!tree->CrossY(&param_0->GetPosP()) || !tree->UnderPlaneYUnder(param_0->GetRoof()) ||
tree->TopPlaneYUnder(param_0->GetHeight()))
{
return false;
}
cBgD_Tree_t* puVar9 = &pm_bgd->m_tree_tbl[param_1];
if ((puVar9->m_flag & 1)) {
if (pm_blk[puVar9->m_id[0]].m_gnd_idx != 0xFFFF &&
RwgSplGrpChk(pm_blk[puVar9->m_id[0]].m_gnd_idx, param_0))
{
return true;
}
return false;
}
bool rv = false;
for (int i = 0; i < 8; i++) {
if (puVar9->m_id[i] != 0xFFFF && SplGrpChkRp(param_0, puVar9->m_id[i])) {
rv = true;
}
}
return rv;
}
/* 8007D6F0-8007D830 078030 0140+00 1/1 0/0 0/0 .text SplGrpChkGrpRp__4dBgWFP14dBgS_SplGrpChkii */
bool dBgW::SplGrpChkGrpRp(dBgS_SplGrpChk* param_0, int param_1, int param_2) {
cBgW_GrpElm* grp = &pm_grp[param_1];
if (!grp->m_aab.CrossY(&param_0->GetPosP()) ||
!grp->m_aab.UnderPlaneYUnder(param_0->GetRoof()) ||
grp->m_aab.TopPlaneYUnder(param_0->GetHeight()))
{
return false;
}
if (ChkGrpThrough(param_1, param_0->GetGrpPassChk(), param_2)) {
return false;
}
bool uVar6 = false;
cBgD_Grp_t* data = &pm_bgd->m_g_tbl[param_1];
if (data->m_tree_idx != 0xFFFF && SplGrpChkRp(param_0, data->m_tree_idx)) {
uVar6 = true;
}
s32 uVar1 = data->m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
if (SplGrpChkGrpRp(param_0, uVar1, param_2 + 1)) {
uVar6 = true;
}
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
return uVar6;
}
/* 8007D830-8007D858 078170 0028+00 1/0 1/0 0/0 .text SplGrpChk__4dBgWFP14dBgS_SplGrpChk
*/
bool dBgW::SplGrpChk(dBgS_SplGrpChk* pchk) {
return SplGrpChkGrpRp(pchk, m_rootGrpIdx, 1);
}
/* 8007D858-8007D8E8 078198 0090+00 1/1 0/0 0/0 .text RwgCaptPoly__4dBgWFiR13dBgS_CaptPoly */
void dBgW::RwgCaptPoly(int param_0, dBgS_CaptPoly& param_1) {
while (true) {
cBgW_RwgElm* puVar2 = &pm_rwg[param_0];
param_1.m_callback(param_1, pm_vtx_tbl, pm_bgd->m_t_tbl[param_0].m_vtx_idx0,
pm_bgd->m_t_tbl[param_0].m_vtx_idx1, pm_bgd->m_t_tbl[param_0].m_vtx_idx2,
&pm_tri[param_0].m_plane);
if (puVar2->m_next == 0xFFFF)
break;
param_0 = puVar2->m_next;
}
}
/* 8007D8E8-8007DA04 078228 011C+00 1/1 0/0 0/0 .text CaptPolyRp__4dBgWFR13dBgS_CaptPolyi
*/
void dBgW::CaptPolyRp(dBgS_CaptPoly& param_0, int param_1) {
if (!pm_node_tree[param_1].Cross(param_0.GetBndP())) {
return;
}
cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[param_1];
if (tree_data->m_flag & 1) {
if (pm_blk[tree_data->m_id[0]].m_wall_idx != 0xFFFF) {
RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_wall_idx, param_0);
}
if (pm_blk[tree_data->m_id[0]].m_roof_idx != 0xFFFF) {
RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_roof_idx, param_0);
}
if (pm_blk[tree_data->m_id[0]].m_gnd_idx != 0xFFFF) {
RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_gnd_idx, param_0);
}
return;
}
for (int i = 0; i < 8; i++) {
if (tree_data->m_id[i] == 0xFFFF) {
continue;
}
CaptPolyRp(param_0, tree_data->m_id[i]);
}
}
/* 8007DA04-8007DAF8 078344 00F4+00 1/1 0/0 0/0 .text CaptPolyGrpRp__4dBgWFR13dBgS_CaptPolyii */
void dBgW::CaptPolyGrpRp(dBgS_CaptPoly& param_0, int param_1, int param_2) {
cBgW_GrpElm* grp = &pm_grp[param_1];
if (!grp->m_aab.Cross(param_0.GetBndP())) {
return;
}
if (ChkGrpThrough(param_1, param_0.GetGrpPassChk(), param_2)) {
return;
}
cBgD_Grp_t* data = &pm_bgd->m_g_tbl[param_1];
if (pm_bgd->m_g_tbl[param_1].m_tree_idx != 0xFFFF) {
CaptPolyRp(param_0, pm_bgd->m_g_tbl[param_1].m_tree_idx);
}
s32 uVar1 = pm_bgd->m_g_tbl[param_1].m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
CaptPolyGrpRp(param_0, uVar1, param_2 + 1);
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
}
/* 8007DAF8-8007DB20 078438 0028+00 1/0 1/0 0/0 .text CaptPoly__4dBgWFR13dBgS_CaptPoly */
void dBgW::CaptPoly(dBgS_CaptPoly& poly) {
CaptPolyGrpRp(poly, m_rootGrpIdx, 1);
}
/* 8007DB20-8007DC70 078460 0150+00 1/1 0/0 0/0 .text RwgSphChk__4dBgWFUsP11dBgS_SphChkPv
*/
// vtable order
#ifdef NONMATCHING
bool dBgW::RwgSphChk(u16 param_0, dBgS_SphChk* param_1, void* param_2) {
cM3dGTri acStack_50;
cBgW_RwgElm* puVar4;
cBgD_Tri_t* puVar5;
bool uVar3 = false;
while (true) {
puVar4 = &pm_rwg[param_0];
if (!ChkPolyThrough(param_0, param_1->GetPolyPassChk())) {
puVar5 = &pm_bgd->m_t_tbl[param_0];
acStack_50.setBg(&pm_vtx_tbl[puVar5->field_0x0], &pm_vtx_tbl[puVar5->field_0x2],
&pm_vtx_tbl[puVar5->field_0x4], &pm_tri[param_0].m_plane);
if (param_1->cross(&acStack_50)) {
param_1->mCallback(param_1, pm_vtx_tbl, puVar5->field_0x0, puVar5->field_0x2,
puVar5->field_0x4, &pm_tri[param_0].m_plane, param_2);
param_1->SetPolyIndex(param_0);
uVar3 = true;
}
}
if (puVar4->m_next == 0xFFFF)
break;
param_0 = puVar4->m_next;
}
return uVar3;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm bool dBgW::RwgSphChk(u16 param_0, dBgS_SphChk* param_1, void* param_2) {
nofralloc
#include "asm/d/bg/d_bg_w/RwgSphChk__4dBgWFUsP11dBgS_SphChkPv.s"
}
#pragma pop
#endif
/* 8007DC70-8007DDE0 0785B0 0170+00 1/1 0/0 0/0 .text SphChkRp__4dBgWFP11dBgS_SphChkPvi
*/
bool dBgW::SphChkRp(dBgS_SphChk* param_0, void* param_1, int param_2) {
if (!pm_node_tree[param_2].Cross(param_0)) {
return false;
}
cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[param_2];
bool rv = false;
if (tree_data->m_flag & 1) {
if (pm_blk[tree_data->m_id[0]].m_gnd_idx != 0xFFFF &&
RwgSphChk(pm_blk[tree_data->m_id[0]].m_gnd_idx, param_0, param_1))
{
rv = true;
}
if (pm_blk[tree_data->m_id[0]].m_roof_idx != 0xFFFF &&
RwgSphChk(pm_blk[tree_data->m_id[0]].m_roof_idx, param_0, param_1))
{
rv = true;
}
if (pm_blk[tree_data->m_id[0]].m_wall_idx != 0xFFFF &&
RwgSphChk(pm_blk[tree_data->m_id[0]].m_wall_idx, param_0, param_1))
{
rv = true;
}
return rv;
}
for (int i = 0; i < 8; i++) {
if (tree_data->m_id[i] == 0xFFFF) {
continue;
}
if (SphChkRp(param_0, param_1, tree_data->m_id[i])) {
rv = true;
}
}
return rv;
}
/* 8007DDE0-8007DF00 078720 0120+00 1/1 0/0 0/0 .text SphChkGrpRp__4dBgWFP11dBgS_SphChkPvii */
bool dBgW::SphChkGrpRp(dBgS_SphChk* param_0, void* param_1, int param_2, int param_3) {
if (!pm_grp[param_2].m_aab.Cross(param_0)) {
return false;
}
if (ChkGrpThrough(param_2, param_0->GetGrpPassChk(), param_3)) {
return false;
}
bool uVar6 = false;
cBgD_Grp_t* data = &pm_bgd->m_g_tbl[param_2];
if (data->m_tree_idx != 0xFFFF && SphChkRp(param_0, param_1, data->m_tree_idx)) {
uVar6 = true;
}
s32 uVar1 = data->m_first_child;
while (true) {
if (uVar1 == 0xFFFF) {
break;
}
if (SphChkGrpRp(param_0, param_1, uVar1, param_3 + 1)) {
uVar6 = true;
}
uVar1 = pm_bgd->m_g_tbl[uVar1].m_next_sibling;
}
return uVar6;
}
/* 8007DF00-8007DF28 078840 0028+00 1/0 1/0 0/0 .text SphChk__4dBgWFP11dBgS_SphChkPv */
bool dBgW::SphChk(dBgS_SphChk* pchk, void* param_1) {
return SphChkGrpRp(pchk, param_1, m_rootGrpIdx, 1);
}
/* 8007DF28-8007DF58 078868 0030+00 1/0 1/0 0/0 .text GetPolyGrpRoomInfId__4dBgWFRC13cBgS_PolyInfo
*/
u8 dBgW::GetPolyGrpRoomInfId(cBgS_PolyInfo const& poly) {
return GetGrpInf(poly) & 0xFF;
}
/* 8007DF58-8007DF88 078898 0030+00 1/0 1/0 0/0 .text GetGrpSoundId__4dBgWFRC13cBgS_PolyInfo */
u8 dBgW::GetGrpSoundId(cBgS_PolyInfo const& poly) {
return GetGrpInf(poly) >> 11;
}
/* 8007DF88-8007DFC4 0788C8 003C+00 1/0 0/0 0/0 .text
* CrrPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz */
void dBgW::CrrPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos,
csXyz* i_angle, csXyz* i_shapeAngle) {
if (m_crr_func) {
m_crr_func(this, i_actor_ptr, i_poly, param_2, i_pos, i_angle, i_shapeAngle);
}
}
/* 8007DFC4-8007E000 078904 003C+00 1/0 0/0 0/0 .text
* TransPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz */
void dBgW::TransPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos,
csXyz* i_angle, csXyz* i_shapeAngle) {
if (m_crr_func) {
m_crr_func(this, i_actor_ptr, i_poly, param_2, i_pos, i_angle, i_shapeAngle);
}
}
/* 8007E000-8007E02C 078940 002C+00 1/0 0/0 0/0 .text
* MatrixCrrPos__4dBgWFRC13cBgS_PolyInfoPvbP4cXyzP5csXyzP5csXyz */
void dBgW::MatrixCrrPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos,
csXyz* i_angle, csXyz* i_shapeAngle) {
CrrPos(i_poly, i_actor_ptr, param_2, i_pos, i_angle, i_shapeAngle);
}
/* 8007E02C-8007E360 07896C 0334+00 1/0 1/0 0/0 .text ChkPolyThrough__4dBgWFiP16cBgS_PolyPassChk
*/
// should match when dHorse_c member function table is setup
#ifdef NONMATCHING
bool dBgW::ChkPolyThrough(int poly_index, cBgS_PolyPassChk* ppass_chk) {
if (ppass_chk == NULL) {
return false;
}
dBgS_PolyPassChk* chk = (dBgS_PolyPassChk*)ppass_chk;
if (chk->ChkObj() && GetPolyObjThrough(poly_index)) {
return true;
}
if (chk->ChkCam() && GetPolyCamThrough(poly_index)) {
return true;
}
if ((chk->ChkLink() && GetPolyLinkThrough(poly_index)) ||
(chk->ChkHorse() && GetPolyLinkThrough(poly_index)))
{
return true;
}
if (chk->ChkArrow() && GetPolyArrowThrough(poly_index)) {
return true;
}
if (chk->ChkBomb() && GetPolyBombThrough(poly_index)) {
return true;
}
if (chk->ChkBoomerang() && GetPolyBoomerangThrough(poly_index)) {
return true;
}
if (chk->ChkRope() && GetPolyRopeThrough(poly_index)) {
return true;
}
if (chk->ChkUnderwaterRoof() && GetUnderwaterRoofCode(poly_index)) {
return true;
}
int info_f00 = GetPolyInf1(poly_index, 0xF00, 8);
if (info_f00 == 8 && chk->ChkNoHorse()) {
return true;
}
if (info_f00 == 9) {
if (chk->ChkNoHorse()) {
return true;
}
cXyz pos(pm_tri[poly_index].m_plane.mNormal);
if (chk->ChkHorse() && i_dComIfGp_getHorseActor() != NULL) {
if (!i_dComIfGp_getHorseActor()->checkSpecialWallHit(pos)) {
return true;
}
}
}
if (chk->ChkStatue() && GetSpecialCode(poly_index) == 7) {
return true;
}
if (chk->ChkIronBall() && GetIronBallThrough(poly_index)) {
return true;
}
return false;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm bool dBgW::ChkPolyThrough(int param_0, cBgS_PolyPassChk* param_1) {
nofralloc
#include "asm/d/bg/d_bg_w/ChkPolyThrough__4dBgWFiP16cBgS_PolyPassChk.s"
}
#pragma pop
#endif
/* 8007E360-8007E3D8 078CA0 0078+00 1/0 1/0 0/0 .text
* ChkShdwDrawThrough__4dBgWFiP16cBgS_PolyPassChk */
bool dBgW::ChkShdwDrawThrough(int poly_index, cBgS_PolyPassChk*) {
if (GetShdwThrough(poly_index)) {
return true;
}
return GetPolyArrowThrough(poly_index);
}
/* 8007E3D8-8007E444 078D18 006C+00 1/0 1/0 0/0 .text ChkGrpThrough__4dBgWFiP15cBgS_GrpPassChki */
bool dBgW::ChkGrpThrough(int i_grp_idx, cBgS_GrpPassChk* i_passChk, int i_depth) {
if (i_depth != 2 || i_passChk == NULL) {
return false;
}
if ((pm_bgd->m_g_tbl[i_grp_idx].m_info & 0x100) == 0 &&
((dBgS_GrpPassChk*)i_passChk)->MaskNormalGrp())
{
return false;
}
if ((pm_bgd->m_g_tbl[i_grp_idx].m_info & 0x100) &&
((dBgS_GrpPassChk*)i_passChk)->MaskWaterGrp())
{
return false;
}
return true;
}
/* 8007E444-8007E474 078D84 0030+00 1/0 1/0 0/0 .text
* CallRideCallBack__4dBgWFP10fopAc_ac_cP10fopAc_ac_c */
void dBgW::CallRideCallBack(fopAc_ac_c* param_0, fopAc_ac_c* param_1) {
if (m_ride_callback != NULL) {
m_ride_callback(this, param_0, param_1);
}
}
/* 8007E474-8007E4A4 078DB4 0030+00 1/0 1/0 0/0 .text
* CallArrowStickCallBack__4dBgWFP10fopAc_ac_cP10fopAc_ac_cR4cXyz */
void dBgW::CallArrowStickCallBack(fopAc_ac_c* param_0, fopAc_ac_c* param_1, cXyz& param_2) {
if (m_arrow_stick_callback) {
m_arrow_stick_callback(this, param_0, param_1, param_2);
}
}
/* 8007E4A4-8007E4B4 078DE4 0010+00 1/0 1/0 0/0 .text OffMoveFlag__4dBgWFv */
void dBgW::OffMoveFlag() {
m_flags &= ~1;
}
/* 8007E4B4-8007E4C0 078DF4 000C+00 1/0 1/0 0/0 .text ChkMoveFlag__4dBgWCFv */
u32 dBgW::ChkMoveFlag() const {
return m_flags & 1;
}
/* 8007E4C0-8007E548 078E00 0088+00 0/0 0/0 1/1 .text dBgW_NewSet__FP6cBgD_tUlPA3_A4_f */
dBgW* dBgW_NewSet(cBgD_t* pbgd, u32 flags, Mtx* pbase_mtx) {
dBgW* nw = new dBgW();
if (nw == NULL) {
return NULL;
}
if (nw->Set(pbgd, flags, pbase_mtx)) {
return NULL;
}
return nw;
}
/* 8007E548-8007E5A8 078E88 0060+00 1/0 0/0 0/0 .text __dt__4dBgWFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
// asm dBgW::~dBgW() {
extern "C" asm void __dt__4dBgWFv() {
nofralloc
#include "asm/d/bg/d_bg_w/__dt__4dBgWFv.s"
}
#pragma pop
/* ############################################################################################## */
/* 80450F88-80450F90 -00001 0008+00 0/0 4/4 0/0 .sbss None */
/* 80450F88 0001+00 data_80450F88 None */
/* 80450F89 0001+00 data_80450F89 None */
/* 80450F8A 0001+00 data_80450F8A None */
/* 80450F8B 0005+00 data_80450F8B None */
extern u8 struct_80450F88[8];
u8 struct_80450F88[8];