mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 15:01:33 -04:00
258 lines
8.3 KiB
C++
258 lines
8.3 KiB
C++
//
|
|
// Generated by dtk
|
|
// Translation Unit: d_cc_mass_s.cpp
|
|
//
|
|
|
|
#include "d/d_cc_mass_s.h"
|
|
#include "d/d_cc_d.h"
|
|
#include "JSystem/JUtility/JUTAssert.h"
|
|
#include "SSystem/SComponent/c_bg_s.h"
|
|
#include "SSystem/SComponent/c_math.h"
|
|
#include "f_op/f_op_actor.h"
|
|
|
|
/* 800AC810-800AC920 .text __ct__12dCcMassS_MngFv */
|
|
dCcMassS_Mng::dCcMassS_Mng() {
|
|
Ct();
|
|
}
|
|
|
|
/* 800AC920-800AC96C .text Ct__12dCcMassS_MngFv */
|
|
void dCcMassS_Mng::Ct() {
|
|
mFlag = 0;
|
|
mResultCam = 0;
|
|
mCamTopPos.x = 0.0f;
|
|
mCamTopPos.y = -G_CM3D_F_INF;
|
|
mCamTopPos.z = 0.0f;
|
|
mCamBottomPos.x = 0.0f;
|
|
mCamBottomPos.y = -G_CM3D_F_INF;
|
|
mCamBottomPos.z = 0.0f;
|
|
Clear();
|
|
}
|
|
|
|
/* 800AC96C-800ACCB8 .text Prepare__12dCcMassS_MngFv */
|
|
void dCcMassS_Mng::Prepare() {
|
|
cM3dGAab area;
|
|
area.ClearForMinMax();
|
|
cCcD_ShapeAttr* attr;
|
|
for (dCcMassS_Obj* mass = mMassObjs; mass < mMassObjs + mMassObjCount; mass++) {
|
|
cCcD_Obj* pobj = mass->GetObj();
|
|
JUT_ASSERT(61, pobj != NULL);
|
|
attr = pobj->GetShapeAttr();
|
|
attr->CalcAabBox();
|
|
area.SetMinMax(attr->GetWorkAab());
|
|
}
|
|
for (dCcMassS_Obj* mass = mMassAreas; mass < mMassAreas + mMassAreaCount; mass++) {
|
|
cCcD_Obj* parea = mass->GetObj();
|
|
JUT_ASSERT(73, parea != NULL);
|
|
attr = parea->GetShapeAttr();
|
|
attr->CalcAabBox();
|
|
area.SetMinMax(attr->GetWorkAab());
|
|
}
|
|
if (mFlag & 1) {
|
|
mCpsAttr.CalcAabBox();
|
|
attr = &mCpsAttr;
|
|
area.SetMinMax(attr->GetWorkAab());
|
|
}
|
|
mDivideArea.SetArea(area);
|
|
for (dCcMassS_Obj* mass = mMassObjs; mass < mMassObjs + mMassObjCount; mass++) {
|
|
cCcD_Obj* pobj = mass->GetObj();
|
|
JUT_ASSERT(93, pobj != NULL);
|
|
cCcD_ShapeAttr* shape = pobj->GetShapeAttr();
|
|
cCcD_DivideInfo* divideInfo = mass->GetPDivideInfo();
|
|
mDivideArea.CalcDivideInfo(divideInfo, shape->GetWorkAab(), 0);
|
|
}
|
|
for (dCcMassS_Obj* mass = mMassAreas; mass < mMassAreas + mMassAreaCount; mass++) {
|
|
cCcD_Obj* parea = mass->GetObj();
|
|
JUT_ASSERT(104, parea != NULL);
|
|
cCcD_ShapeAttr* shape = parea->GetShapeAttr();
|
|
cCcD_DivideInfo* divideInfo = mass->GetPDivideInfo();
|
|
mDivideArea.CalcDivideInfo(divideInfo, shape->GetWorkAab(), 0);
|
|
}
|
|
if (mFlag & 1) {
|
|
mDivideArea.CalcDivideInfo(&mDivideInfo, mCpsAttr.GetWorkAab(), 0);
|
|
}
|
|
mCamTopPos.x = 0.0f;
|
|
mCamTopPos.y = -G_CM3D_F_INF;
|
|
mCamTopPos.z = 0.0f;
|
|
mCamTopDist = G_CM3D_F_INF;
|
|
mCamBottomPos.x = 0.0f;
|
|
mCamBottomPos.y = -G_CM3D_F_INF;
|
|
mCamBottomPos.z = 0.0f;
|
|
mCamBottomDist = G_CM3D_F_INF;
|
|
}
|
|
|
|
/* 800ACCB8-800AD17C .text Chk__12dCcMassS_MngFP4cXyzPP10fopAc_ac_cP15dCcMassS_HitInf */
|
|
u32 dCcMassS_Mng::Chk(cXyz* r29, fopAc_ac_c** r30, dCcMassS_HitInf* r31) {
|
|
cCcD_DivideInfo divideInfo;
|
|
u32 r26 = 0;
|
|
*r30 = NULL;
|
|
mCylAttr.SetC(*r29);
|
|
mCylAttr.CalcAabBox();
|
|
mDivideArea.CalcDivideInfoOverArea(÷Info, mCylAttr.GetWorkAab());
|
|
r31->ClearPointer();
|
|
|
|
if (field_0x128 & 8) {
|
|
for (dCcMassS_Obj* mass = mMassAreas; mass < mMassAreas + mMassAreaCount; mass++) {
|
|
if (!mass->GetPDivideInfo()->Chk(divideInfo)) {
|
|
continue;
|
|
}
|
|
|
|
cCcD_Obj* pobj = mass->GetObj();
|
|
JUT_ASSERT(174, pobj != NULL);
|
|
cCcD_ShapeAttr* shape = pobj->GetShapeAttr();
|
|
|
|
f32 sp10;
|
|
if (pobj->ChkCoSet() && mCylAttr.CrossCo(*shape, &sp10)) {
|
|
r26 |= 0x04;
|
|
*r30 = pobj->GetStts()->GetActor();
|
|
if (r31) {
|
|
r31->SetAreaHitObj(pobj);
|
|
}
|
|
dCcMassS_ObjCallback callback = mass->GetAreaCheckFunc();
|
|
if (callback) {
|
|
callback(pobj->GetStts()->GetActor(), r29, mResultCamBit);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (dCcMassS_Obj* mass = mMassObjs; mass < mMassObjs + mMassObjCount; mass++) {
|
|
if (!mass->GetPDivideInfo()->Chk(divideInfo)) {
|
|
continue;
|
|
}
|
|
|
|
cCcD_Obj* pobj = mass->GetObj();
|
|
dCcD_GObjInf* inf = (dCcD_GObjInf*)pobj->GetGObjInf();
|
|
JUT_ASSERT(214, pobj != NULL);
|
|
cCcD_ShapeAttr* shape = pobj->GetShapeAttr();
|
|
cXyz temp;
|
|
if (pobj->ChkAtSet() && !inf->ChkAtNoMass() &&
|
|
mCylAttr.CrossAtTg(*shape, &temp) && (field_0x128 & 0x1)
|
|
) {
|
|
r26 |= 0x01;
|
|
*r30 = pobj->GetStts()->GetActor();
|
|
if (r31) {
|
|
r31->SetAtHitObj(pobj);
|
|
}
|
|
}
|
|
|
|
f32 sp10;
|
|
if (pobj->ChkCoSet() && mCylAttr.CrossCo(*shape, &sp10) && (field_0x128 & 0x02)) {
|
|
r26 |= 0x02;
|
|
*r30 = pobj->GetStts()->GetActor();
|
|
|
|
if (field_0x128 & 0x10) {
|
|
Vec vec;
|
|
VECSubtract(&(*r30)->current.pos, r29, &vec);
|
|
vec.y = 0;
|
|
f32 vecMag = VECMag(&vec);
|
|
if (cM3d_IsZero(vecMag)) {
|
|
vec.x = 1;
|
|
} else {
|
|
VECScale(&vec, &vec, sp10 / vecMag);
|
|
}
|
|
pobj->GetStts()->PlusCcMove(vec.x, vec.y, vec.z);
|
|
}
|
|
|
|
if (r31) {
|
|
r31->SetCoHitObj(pobj);
|
|
r31->SetCoHitLen(sp10);
|
|
}
|
|
}
|
|
}
|
|
|
|
f32 temp;
|
|
if ((mFlag & 1) && mDivideInfo.Chk(divideInfo) && mCylAttr.CrossCo(mCpsAttr, &temp)) {
|
|
mResultCam |= 1;
|
|
mResultCam |= 1 << (mResultCamBit + 1);
|
|
|
|
if ((mResultCam & 2) || (mResultCam & 8)) {
|
|
f32 plusH = r29->y + mCylAttr.GetH();
|
|
cXyz sp1c;
|
|
sp1c.x = r29->x;
|
|
sp1c.y = plusH;
|
|
sp1c.z = r29->z;
|
|
|
|
if (mCamTopPos.y < 20.0f + plusH) {
|
|
f32 startDist = VECSquareDistance(&sp1c, mCpsAttr.GetStartP());
|
|
if (mCamTopDist > startDist) {
|
|
mCamTopDist = startDist;
|
|
mCamTopPos = sp1c;
|
|
}
|
|
}
|
|
if (mCamBottomPos.y < 20.0f + plusH) {
|
|
f32 endDist = VECSquareDistance(&sp1c, mCpsAttr.GetEndP());
|
|
if (mCamBottomDist > endDist) {
|
|
mCamBottomDist = endDist;
|
|
mCamBottomPos = sp1c;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return r26;
|
|
}
|
|
|
|
/* 800AD17C-800AD234 .text Clear__12dCcMassS_MngFv */
|
|
void dCcMassS_Mng::Clear() {
|
|
mMassObjCount = 0;
|
|
mMassAreaCount = 0;
|
|
for (int i = 0; i < ARRAY_SIZE(mMassObjs); i++) {
|
|
mMassObjs[i].Clear();
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mMassAreas); i++) {
|
|
mMassAreas[i].Clear();
|
|
}
|
|
mCylAttr.SetR(0.0f);
|
|
mCylAttr.SetH(0.0f);
|
|
field_0x128 = 0;
|
|
mResultCamBit = 4;
|
|
}
|
|
|
|
/* 800AD234-800AD310 .text Set__12dCcMassS_MngFP8cCcD_ObjUc */
|
|
void dCcMassS_Mng::Set(cCcD_Obj* i_obj, u8 i_priority) {
|
|
if (mMassObjCount >= (s32)ARRAY_SIZE(mMassObjs)) {
|
|
for (int i = 0; i < (s32)ARRAY_SIZE(mMassObjs); i++) {
|
|
int priority = mMassObjs[i].GetPriority();
|
|
if (priority > i_priority || (priority == i_priority && cM_rndF(1.0f) < 0.5f)) {
|
|
mMassObjs[i].Set(i_obj, i_priority, NULL);
|
|
return;
|
|
}
|
|
}
|
|
} else {
|
|
mMassObjs[mMassObjCount].Set(i_obj, i_priority, NULL);
|
|
mMassObjCount++;
|
|
}
|
|
}
|
|
|
|
/* 800AD310-800AD384 .text SetAreaChk__12dCcMassS_MngFP8cCcD_ObjUcPFP10fopAc_ac_cP4cXyzUl_v */
|
|
void dCcMassS_Mng::SetAreaChk(cCcD_Obj* p_obj, u8 i_priority, dCcMassS_ObjCallback callback) {
|
|
if (mMassAreaCount >= 2) {
|
|
for (int i = 0; i < (s32)ARRAY_SIZE(mMassAreas); i++) {
|
|
if (mMassAreas[i].GetPriority() > i_priority) {
|
|
mMassAreas[i].Set(p_obj, i_priority, callback);
|
|
return;
|
|
}
|
|
}
|
|
} else {
|
|
mMassAreas[mMassAreaCount].Set(p_obj, i_priority, callback);
|
|
mMassAreaCount++;
|
|
}
|
|
}
|
|
|
|
/* 800AD384-800AD3D4 .text SetCam__12dCcMassS_MngFRC8cM3dGCps */
|
|
void dCcMassS_Mng::SetCam(const cM3dGCps& cps) {
|
|
mCpsAttr.SetCps(cps);
|
|
mFlag |= 0x1;
|
|
mResultCam = 0;
|
|
}
|
|
|
|
/* 800AD3D4-800AD3DC .text GetResultCam__12dCcMassS_MngCFv */
|
|
u32 dCcMassS_Mng::GetResultCam() const {
|
|
return mResultCam;
|
|
}
|
|
|
|
/* 800AD3DC-800AD3F8 .text GetCamTopPos__12dCcMassS_MngFP3Vec */
|
|
void dCcMassS_Mng::GetCamTopPos(Vec* outPos) {
|
|
*outPos = mCamTopPos;
|
|
}
|