From fdc216a6f2b242528219654bda747c1ec0fb8d7a Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Wed, 20 Dec 2023 04:52:05 -0800 Subject: [PATCH] d_cc_mass_s --- include/SSystem/SComponent/c_cc_d.h | 2 +- include/d/d_cc_mass_s.h | 8 +-- src/d/d_cc_mass_s.cpp | 85 ++++++++++++++++++++++++++--- src/d/d_kankyo_rain.cpp | 2 +- 4 files changed, 82 insertions(+), 15 deletions(-) diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index d747864d0..ffcf1c47e 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -278,7 +278,7 @@ public: STATIC_ASSERT(0x38 == sizeof(cCcD_CylAttr)); class cCcD_DivideInfo { -private: +public: /* 0x00 */ u32 mRangeBits; /* 0x04 vtable */ public: diff --git a/include/d/d_cc_mass_s.h b/include/d/d_cc_mass_s.h index ec2c3ef65..70374eacb 100644 --- a/include/d/d_cc_mass_s.h +++ b/include/d/d_cc_mass_s.h @@ -7,7 +7,7 @@ typedef void (*dCcMassS_ObjCallback)(fopAc_ac_c*, cXyz*, u32); class dCcMassS_Obj { -private: +public: /* 0x00 */ cCcD_Obj* mpObj; /* 0x04 */ u8 mPriority; /* 0x08 */ dCcMassS_ObjCallback mpCallback; @@ -15,7 +15,7 @@ private: /* 0x14 vtable */ public: - dCcMassS_Obj(); + dCcMassS_Obj() {} virtual ~dCcMassS_Obj() {} void Set(cCcD_Obj* p_obj, u8 priority, dCcMassS_ObjCallback callback); void Clear(); @@ -53,7 +53,7 @@ public: /* 0x00BC */ s32 mMassAreaCount; /* 0x00C0 */ dCcMassS_Obj mMassAreas[2]; /* 0x00F0 */ cCcD_CylAttr mCylAttr; - /* 0x0128 */ u8 field_0x200; + /* 0x0128 */ u8 field_0x128; /* 0x0129 */ u8 mResultCamBit; /* 0x012C */ u32 mFlag; /* 0x0130 */ u32 mResultCam; @@ -72,7 +72,7 @@ public: void SetAttr(f32 radius, f32 height, u8 param_2, u8 param_3) { mCylAttr.SetR(radius); mCylAttr.SetH(height); - field_0x200 = param_2; + field_0x128 = param_2; mResultCamBit = param_3; } void Prepare(); diff --git a/src/d/d_cc_mass_s.cpp b/src/d/d_cc_mass_s.cpp index c1f12f204..a716fd6d9 100644 --- a/src/d/d_cc_mass_s.cpp +++ b/src/d/d_cc_mass_s.cpp @@ -4,21 +4,76 @@ // #include "d/d_cc_mass_s.h" -#include "dolphin/types.h" +#include "JSystem/JUtility/JUTAssert.h" /* 800AC810-800AC920 .text __ct__12dCcMassS_MngFv */ dCcMassS_Mng::dCcMassS_Mng() { - /* Nonmatching */ + Ct(); } /* 800AC920-800AC96C .text Ct__12dCcMassS_MngFv */ void dCcMassS_Mng::Ct() { - /* Nonmatching */ + mFlag = 0; + mResultCam = 0; + mCamTopPos.x = 0.0f; + mCamTopPos.y = -1e+9f; + mCamTopPos.z = 0.0f; + mCamBottomPos.x = 0.0f; + mCamBottomPos.y = -1e+9f; + mCamBottomPos.z = 0.0f; + Clear(); } /* 800AC96C-800ACCB8 .text Prepare__12dCcMassS_MngFv */ void dCcMassS_Mng::Prepare() { /* Nonmatching */ + cM3dGAab local_38; + local_38.ClearForMinMax(); + for (dCcMassS_Obj* mass = mMassObjs; mass < mMassObjs + mMassObjCount; mass++) { + cCcD_Obj* pobj = mass->mpObj; + JUT_ASSERT(61, pobj != 0); + cCcD_ShapeAttr* attr = pobj->GetShapeAttr(); + attr->CalcAabBox(); + local_38.SetMinMax(attr->mAab.mMin); + local_38.SetMinMax(attr->mAab.mMax); + } + for (dCcMassS_Obj* mass = mMassAreas; mass < mMassAreas + mMassAreaCount; mass++) { + cCcD_Obj* parea = mass->mpObj; + JUT_ASSERT(73, parea != 0); + cCcD_ShapeAttr* attr = parea->GetShapeAttr(); + attr->CalcAabBox(); + local_38.SetMinMax(attr->mAab.mMin); + local_38.SetMinMax(attr->mAab.mMax); + } + if (mFlag & 1) { + mCpsAttr.CalcAabBox(); + local_38.SetMinMax(mCpsAttr.mAab.mMin); + local_38.SetMinMax(mCpsAttr.mAab.mMax); + } + mDivideArea.SetArea(local_38); + for (dCcMassS_Obj* mass = mMassObjs; mass < mMassObjs + mMassObjCount; mass++) { + cCcD_Obj* pobj = mass->mpObj; + JUT_ASSERT(93, pobj != 0); + cCcD_ShapeAttr* attr = pobj->GetShapeAttr(); + mDivideArea.CalcDivideInfo(&mass->mDivideInfo, attr->mAab, 0); + } + for (dCcMassS_Obj* mass = mMassAreas; mass < mMassAreas + mMassAreaCount; mass++) { + cCcD_Obj* parea = mass->mpObj; + JUT_ASSERT(104, parea != 0); + cCcD_ShapeAttr* attr = parea->GetShapeAttr(); + mDivideArea.CalcDivideInfo(&mass->mDivideInfo, attr->mAab, 0); + } + if (mFlag & 1) { + mDivideArea.CalcDivideInfo(&mDivideInfo, mCpsAttr.mAab, 0); + } + mCamTopPos.x = 0.0f; + mCamTopPos.y = -1e+9f; + mCamTopPos.z = 0.0f; + mCamTopDist = 1e+9f; + mCamBottomPos.x = 0.0f; + mCamBottomPos.y = -1e+9f; + mCamBottomPos.z = 0.0f; + mCamBottomDist = 1e+9f; } /* 800ACCB8-800AD17C .text Chk__12dCcMassS_MngFP4cXyzPP10fopAc_ac_cP15dCcMassS_HitInf */ @@ -28,7 +83,24 @@ u32 dCcMassS_Mng::Chk(cXyz*, fopAc_ac_c**, dCcMassS_HitInf*) { /* 800AD17C-800AD234 .text Clear__12dCcMassS_MngFv */ void dCcMassS_Mng::Clear() { - /* Nonmatching */ + mMassObjCount = 0; + mMassAreaCount = 0; + for (int i = 0; i < 5; i++) { + mMassObjs[i].mpObj = NULL; + mMassObjs[i].mPriority = 5; + mMassObjs[i].mpCallback = NULL; + mMassObjs[i].mDivideInfo.mRangeBits = 0; + } + for (int i = 0; i < 2; i++) { + mMassAreas[i].mpObj = NULL; + mMassAreas[i].mPriority = 5; + mMassAreas[i].mpCallback = NULL; + mMassAreas[i].mDivideInfo.mRangeBits = 0; + } + mCylAttr.SetR(0.0f); + mCylAttr.SetH(0.0f); + field_0x128 = 0; + mResultCamBit = 4; } /* 800AD234-800AD310 .text Set__12dCcMassS_MngFP8cCcD_ObjUc */ @@ -55,8 +127,3 @@ u8 dCcMassS_Mng::GetResultCam() const { void dCcMassS_Mng::GetCamTopPos(Vec*) { /* Nonmatching */ } - -/* 800AD594-800AD5B0 .text __ct__12dCcMassS_ObjFv */ -dCcMassS_Obj::dCcMassS_Obj() { - /* Nonmatching */ -} diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index 55824b60b..f3dac6ce2 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -782,7 +782,7 @@ void dKyr_poison_light_colision() { dCcMassS_Mng * mass = &dComIfG_Ccsp()->mMass_Mng; dComIfG_Ccsp()->mMass_Mng.mCylAttr.SetR(220.0f); dComIfG_Ccsp()->mMass_Mng.mCylAttr.SetH(140.0f); - mass->field_0x200 = 0x0B; + mass->field_0x128 = 0x0B; mass->mResultCamBit = 0x03; #endif