OdysseyDecomp/lib/al/Library/Area/AreaObjMtxConnecter.cpp

95 lines
3.3 KiB
C++

#include "Library/Area/AreaObjMtxConnecter.h"
#include "Library/Area/AreaObj.h"
#include "Library/Area/ValidatorBase.h"
#include "Library/Collision/PartsMtxConnector.h"
#include "Library/Placement/PlacementFunction.h"
namespace al {
AreaObjMtxConnecter::AreaObjMtxConnecter(AreaObj* areaObj, const PlacementInfo& placementInfo)
: mAreaObj(areaObj), mPlacementInfo(placementInfo) {
mMatrix = mAreaObj->getAreaMtx();
}
bool AreaObjMtxConnecter::trySetParentMtx(const sead::Matrix34f* parentMtx,
const PlacementInfo& placementInfo,
const ValidatorBase* validatorBase) {
if (!isEqualPlacementId(mPlacementInfo, placementInfo))
return false;
mMtxConnector = new MtxConnector();
mMtxConnector->init(parentMtx);
if (validatorBase)
mValidatorBase = validatorBase;
return true;
}
bool AreaObjMtxConnecter::trySyncParentMtx(const sead::Matrix34f* parentMtx,
const PlacementInfo& placementInfo,
const ValidatorBase* validatorBase) {
if (!isEqualPlacementId(mPlacementInfo, placementInfo))
return false;
mMatrix = *parentMtx;
mMtxConnector = new MtxConnector();
mMtxConnector->init(parentMtx);
if (validatorBase)
mValidatorBase = validatorBase;
return true;
}
void AreaObjMtxConnecter::update() {
if (mValidatorBase) {
if (mValidatorBase->validate() && !mAreaObj->isValid())
mAreaObj->validate();
else if (!mValidatorBase->validate() && mAreaObj->isValid())
mAreaObj->invalidate();
}
if (mMtxConnector)
mMtxConnector->multMtx(mAreaObj->getAreaMtxPtr(), mMatrix);
}
AreaObjMtxConnecterHolder::AreaObjMtxConnecterHolder(s32 capacity) : mCapacity(capacity) {
mMtxConnectors = new AreaObjMtxConnecter*[mCapacity];
for (s32 i = 0; i < mCapacity; i++)
mMtxConnectors[i] = nullptr;
}
bool AreaObjMtxConnecterHolder::tryAddArea(AreaObj* areaObj, const PlacementInfo& placementInfo) {
if (calcLinkChildNum(placementInfo, "NoDelete_FollowMtxTarget") == 0)
return false;
PlacementInfo linkPlacementInfo;
getLinksInfo(&linkPlacementInfo, placementInfo, "NoDelete_FollowMtxTarget");
mMtxConnectors[mNumConnectors] = new AreaObjMtxConnecter(areaObj, linkPlacementInfo);
mNumConnectors++;
return true;
}
void AreaObjMtxConnecterHolder::registerParentMtx(const sead::Matrix34f* parentMtx,
const PlacementInfo& placementInfo,
const ValidatorBase* validatorBase) {
for (s32 i = 0; i < mNumConnectors; i++)
mMtxConnectors[i]->trySetParentMtx(parentMtx, placementInfo, validatorBase);
}
void AreaObjMtxConnecterHolder::registerSyncParentMtx(const sead::Matrix34f* parentMtx,
const PlacementInfo& placementInfo,
const ValidatorBase* validatorBase) {
for (s32 i = 0; i < mNumConnectors; i++)
mMtxConnectors[i]->trySyncParentMtx(parentMtx, placementInfo, validatorBase);
}
void AreaObjMtxConnecterHolder::update() {
for (s32 i = 0; i < mNumConnectors; i++)
mMtxConnectors[i]->update();
}
} // namespace al