mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-29 20:14:41 +00:00
63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
#include "Library/Area/TrafficAreaDirector.h"
|
|
|
|
#include "Library/Area/AreaObjGroup.h"
|
|
#include "Library/Area/TrafficArea.h"
|
|
#include "Library/LiveActor/ActorClippingFunction.h"
|
|
#include "Library/LiveActor/ActorPoseUtil.h"
|
|
|
|
namespace al {
|
|
TrafficAreaDirector::TrafficAreaDirector(const AreaObjGroup* areaObjGroup,
|
|
const ITrafficAreaUpdateJudge* trafficAreaUpdateJudge)
|
|
: mTrafficAreaUpdateJudge(trafficAreaUpdateJudge) {
|
|
mTrafficAreaCount = areaObjGroup->getSize();
|
|
mTrafficAreas = new TrafficArea*[mTrafficAreaCount];
|
|
|
|
for (s32 i = 0; i < mTrafficAreaCount; i++)
|
|
mTrafficAreas[i] = (TrafficArea*)areaObjGroup->getAreaObj(i);
|
|
}
|
|
|
|
bool TrafficAreaDirector::tryPermitEnterCar(const sead::Vector3f& position) {
|
|
TrafficArea* trafficArea = tryFindArea(position);
|
|
|
|
if (!trafficArea)
|
|
return true;
|
|
|
|
return trafficArea->tryPermitEnterCar();
|
|
}
|
|
|
|
TrafficArea* TrafficAreaDirector::tryFindArea(const sead::Vector3f& position) const {
|
|
for (s32 i = 0; i < mTrafficAreaCount; i++)
|
|
if (mTrafficAreas[i]->isInVolume(position))
|
|
return mTrafficAreas[i];
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
bool TrafficAreaDirector::tryPermitEnterNpcAndSyncDrawClipping(LiveActor* actor) {
|
|
TrafficArea* trafficArea = tryFindArea(getTrans(actor));
|
|
|
|
if (!trafficArea) {
|
|
if (alActorFunction::isDrawClipping(actor))
|
|
offDrawClipping(actor);
|
|
|
|
return true;
|
|
}
|
|
|
|
if (!trafficArea->tryPermitEnterNpc())
|
|
return false;
|
|
|
|
if (!alActorFunction::isDrawClipping(actor))
|
|
onDrawClipping(actor);
|
|
|
|
return true;
|
|
}
|
|
|
|
void TrafficAreaDirector::execute() {
|
|
if (mTrafficAreaUpdateJudge && !mTrafficAreaUpdateJudge->judge())
|
|
return;
|
|
|
|
for (s32 i = 0; i < mTrafficAreaCount; i++)
|
|
mTrafficAreas[i]->reset();
|
|
}
|
|
} // namespace al
|