mirror of
https://github.com/zeldaret/ss
synced 2026-07-01 11:48:50 -04:00
Updated CC collision (#80)
* c_cc_d soooo close * d_cc_shape_colliders -> d_cc_d * ported over changes from #43 * Oops, didnt save * use better collision functions in bombf * bombf fixes * bombf actorPostCreate matching * fix * small fix for cCcD_UnkAttr Set function * more cleanup(?) for c_cc_d * d_cc_mass_s OK * Initial d_cc_s setup * some easy funcs --------- Co-authored-by: robojumper <robojumper@gmail.com>
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
#include "d/col/cc/d_cc_s.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/col/c/c_cc_d.h"
|
||||
#include "d/col/c/c_m3d_g_aab.h"
|
||||
#include "f/f_base.h"
|
||||
#include "rvl/MTX/mtx.h"
|
||||
|
||||
dCcS *dCcS::sInstance;
|
||||
|
||||
dCcS *dCcS::GetInstance() {
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
void dCcS::Ct_cCcS() {
|
||||
for (cCcD_Obj **end = mpObjAt + ARRAY_LENGTH(mpObjAt), **obj = mpObjAt; obj < end; ++obj) {
|
||||
*obj = nullptr;
|
||||
}
|
||||
mObjAtCount = 0;
|
||||
|
||||
for (cCcD_Obj **end = mpObjTg + ARRAY_LENGTH(mpObjTg), **obj = mpObjTg; obj < end; ++obj) {
|
||||
*obj = nullptr;
|
||||
}
|
||||
mObjTgCount = 0;
|
||||
|
||||
for (cCcD_Obj **end = mpObjCo + ARRAY_LENGTH(mpObjCo), **obj = mpObjCo; obj < end; ++obj) {
|
||||
*obj = nullptr;
|
||||
}
|
||||
mObjCoCount = 0;
|
||||
|
||||
for (cCcD_Obj **end = mpObj + ARRAY_LENGTH(mpObj), **obj = mpObj; obj < end; ++obj) {
|
||||
*obj = nullptr;
|
||||
}
|
||||
mObjCount = 0;
|
||||
|
||||
for (UNKTYPE **end = mpUnk + ARRAY_LENGTH(mpUnk), **obj = mpUnk; obj < end; ++obj) {
|
||||
*obj = nullptr;
|
||||
}
|
||||
mUnkCount = 0;
|
||||
}
|
||||
|
||||
dCcS::dCcS() {
|
||||
sInstance = this;
|
||||
}
|
||||
|
||||
dCcS::~dCcS() {
|
||||
sInstance = nullptr;
|
||||
}
|
||||
|
||||
void dCcS::Ct() {
|
||||
Ct_cCcS();
|
||||
mMassMng.Ct();
|
||||
ClearArea();
|
||||
}
|
||||
|
||||
void dCcS::Dt() {
|
||||
Ct_cCcS();
|
||||
ClearArea();
|
||||
}
|
||||
|
||||
bool dCcS::ChkRemoveActor(dAcObjBase_c *pActor) {
|
||||
bool ret = false;
|
||||
if (pActor && (pActor->delete_request || pActor->lifecycle_state == fBase_c::TO_BE_DELETED)) {
|
||||
ret = true;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool dCcS::ChkNoHitAtTg(cCcD_Obj *, cCcD_Obj *) {}
|
||||
|
||||
bool dCcS::ChkAtTgCommonHitInf(cCcD_Obj *, cCcD_Obj *) {}
|
||||
|
||||
void dCcS::ChkAtTg() {}
|
||||
|
||||
bool dCcS::ChkNoHitCo(cCcD_Obj *, cCcD_Obj *) {}
|
||||
|
||||
void dCcS::SetCoCommonHitInf(cCcD_Obj *, mVec3_c *, cCcD_Obj *, mVec3_c *, f32) {}
|
||||
|
||||
void dCcS::ChkCo() {}
|
||||
|
||||
bool dCcS::ChkSheildFrontRange(cCcD_Obj *, cCcD_Obj *) {}
|
||||
|
||||
bool dCcS::ChkShield(cCcD_Obj *, cCcD_Obj *, cCcD_ShieldChkCallback *) {}
|
||||
|
||||
bool dCcS::ChkAtTgHitAfterCross(bool, bool, cCcD_Obj *, cCcD_Obj *) {}
|
||||
|
||||
void dCcS::SetCoObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *) {}
|
||||
|
||||
void dCcS::SetPosCorrect(cCcD_Obj *, mVec3_c *, cCcD_Obj *, mVec3_c *, f32) {}
|
||||
|
||||
void dCcS::CalcParticleAngle(cCcD_Obj *, cCcD_Obj *, mAng3_c *, bool) {}
|
||||
|
||||
void dCcS::fn_80356fd0(mVec3_c *, cCcD_Obj *, cCcD_Obj *) {}
|
||||
|
||||
u32 dCcS::ProcAtTgHitmark(cCcD_Obj *, cCcD_Obj *, mVec3_c *, u32, mVec3_c *) {}
|
||||
|
||||
void dCcS::SetAtTgObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *, mVec3_c *, bool) {}
|
||||
|
||||
bool dCcS::ChkCamera(mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32) {}
|
||||
|
||||
bool dCcS::ChkCameraPoint(
|
||||
const mVec3_c &, const mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32
|
||||
) {}
|
||||
|
||||
bool dCcS::ChkCo(const mVec3_c &, dAcObjBase_c *) {}
|
||||
|
||||
bool dCcS::fn_80357c90(const mVec3_c &, const mVec3_c &, u32, UNKTYPE **) {}
|
||||
|
||||
void dCcS::Set(cCcD_Obj *) {}
|
||||
|
||||
void dCcS::MoveAfterCheck() {}
|
||||
|
||||
void dCcS::RemoveDeadObj() {}
|
||||
|
||||
void dCcS::CalcArea() {
|
||||
if (mbAreaSet) {
|
||||
return;
|
||||
}
|
||||
|
||||
cM3dGAab aab;
|
||||
aab.ClearForMinMax();
|
||||
for (cCcD_Obj **obj = mpObj; obj < mpObj + mObjCount; ++obj) {
|
||||
cCcD_ShapeAttr *attr = (*obj)->GetShapeAttr();
|
||||
attr->CalcAabBox();
|
||||
aab.SetMinMax(attr->GetWorkAab());
|
||||
}
|
||||
// TODO
|
||||
}
|
||||
|
||||
void dCcS::Move() {
|
||||
RemoveDeadObj();
|
||||
CalcArea();
|
||||
ChkAtTg();
|
||||
ChkCo();
|
||||
for (int i = 0; i < mObjTgCount; ++i) {
|
||||
mpObjTg[i]->SetTg_0x4B(0);
|
||||
}
|
||||
MoveAfterCheck();
|
||||
AdjustHitPos();
|
||||
mObjAtCount = 0;
|
||||
mObjTgCount = 0;
|
||||
mObjCoCount = 0;
|
||||
mObjCount = 0;
|
||||
mUnkCount = 0;
|
||||
mbAreaSet = false;
|
||||
ClearArea();
|
||||
}
|
||||
|
||||
void dCcS::MassClear() {
|
||||
mMassMng.Clear();
|
||||
}
|
||||
|
||||
void dCcS::SetArea(mMtx_c *pMtx) {
|
||||
if (mAreaCount >= 16) {
|
||||
return;
|
||||
}
|
||||
|
||||
// non-match: Huh
|
||||
mAreas[mAreaCount].mInv = mAreas[mAreaCount].mMtx = *pMtx;
|
||||
|
||||
PSMTXInverse(mAreas[mAreaCount].mInv, mAreas[mAreaCount].mInv);
|
||||
mAreaCount++;
|
||||
}
|
||||
|
||||
void dCcS::ClearArea() {
|
||||
mAreaCount = 0;
|
||||
}
|
||||
|
||||
extern "C" void *STAGE_MANAGER;
|
||||
extern "C" bool fn_8019A7A0(void *stg, f32 *, f32 *);
|
||||
void dCcS::AdjustHitPos() {
|
||||
f32 x, z;
|
||||
if (STAGE_MANAGER && fn_8019A7A0(STAGE_MANAGER, &x, &z)) {
|
||||
for (cCcD_Obj **obj = mpObj; obj < mpObj + mObjCount; ++obj) {
|
||||
(*obj)->AdjustHitPos(x, z);
|
||||
(*obj)->GetShapeAttr()->TranslateXZ(x, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user