mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-05-11 01:38:30 +00:00
102 lines
3.7 KiB
C++
102 lines
3.7 KiB
C++
#include "Project/Clipping/ClippingDirector.h"
|
|
|
|
#include "Library/Area/AreaObjDirector.h"
|
|
#include "Library/Clipping/ClippingActorHolder.h"
|
|
#include "Library/Clipping/ClippingActorInfo.h"
|
|
#include "Library/Clipping/ClippingGroupHolder.h"
|
|
#include "Library/Clipping/ClippingJudge.h"
|
|
#include "Library/Placement/PlacementFunction.h"
|
|
#include "Project/Clipping/ClippingFarAreaObserver.h"
|
|
#include "Project/Clipping/ViewInfoCtrl.h"
|
|
|
|
namespace al {
|
|
|
|
ClippingDirector::ClippingDirector(s32 maxActors, const AreaObjDirector* areaObjDirector,
|
|
const PlayerHolder* playerHolder,
|
|
const SceneCameraInfo* sceneCameraInfo) {
|
|
mFarAreaObserver = new ClippingFarAreaObserver(areaObjDirector, playerHolder);
|
|
mClippingJudge = new ClippingJudge(mFarAreaObserver, sceneCameraInfo);
|
|
mClippingActorHolder = new ClippingActorHolder(maxActors);
|
|
mGroupHolder = new ClippingGroupHolder();
|
|
mViewInfoCtrl = new ViewInfoCtrl(playerHolder, sceneCameraInfo);
|
|
}
|
|
|
|
ClippingDirector::~ClippingDirector() {
|
|
if (mClippingActorHolder) {
|
|
delete mClippingActorHolder;
|
|
mClippingActorHolder = nullptr;
|
|
}
|
|
}
|
|
|
|
void ClippingDirector::endInit(const AreaObjDirector* areaObjDirector) {
|
|
mViewInfoCtrl->initViewCtrlAreaGroup(areaObjDirector->getAreaObjGroup("ViewCtrlArea"));
|
|
mFarAreaObserver->endInit();
|
|
mClippingActorHolder->endInit(mGroupHolder);
|
|
}
|
|
|
|
void ClippingDirector::setDefaultFarClipDistance(f32 distance) {
|
|
mFarAreaObserver->setDefaultFarClipDistance(distance);
|
|
}
|
|
|
|
void ClippingDirector::setDefaultFarClipDistanceSub(f32 distance) {
|
|
mFarAreaObserver->setDefaultFarClipDistanceSub(distance);
|
|
}
|
|
|
|
f32 ClippingDirector::getFarClipDistance() const {
|
|
return mFarAreaObserver->getFarClipDistance();
|
|
}
|
|
|
|
void ClippingDirector::registerActor(LiveActor* liveActor, const ViewIdHolder* idHolder) {
|
|
ClippingActorInfo* clippingActorInfo = mClippingActorHolder->registerActor(liveActor);
|
|
clippingActorInfo->initViewGroup(idHolder);
|
|
mViewInfoCtrl->initActorInfo(clippingActorInfo);
|
|
}
|
|
|
|
void ClippingDirector::addToGroupClipping(LiveActor* liveActor,
|
|
const ActorInitInfo& actorInitInfo) {
|
|
if (alPlacementFunction::isEnableGroupClipping(actorInitInfo))
|
|
mClippingActorHolder->initGroupClipping(liveActor, actorInitInfo);
|
|
}
|
|
|
|
void ClippingDirector::onGroupClipping(LiveActor* liveActor) {
|
|
ClippingActorInfo* clippingActorInfo = mClippingActorHolder->find(liveActor);
|
|
if (clippingActorInfo->isGroupClippingInit()) {
|
|
mClippingActorHolder->onGroupClipping(liveActor);
|
|
mGroupHolder->reentry(clippingActorInfo);
|
|
clippingActorInfo->setGroupClippingEnable(true);
|
|
}
|
|
}
|
|
|
|
void ClippingDirector::offGroupClipping(LiveActor* liveActor) {
|
|
ClippingActorInfo* clippingActorInfo = mClippingActorHolder->find(liveActor);
|
|
if (clippingActorInfo->isGroupClippingInit()) {
|
|
mClippingActorHolder->offGroupClipping(liveActor);
|
|
mGroupHolder->leave(clippingActorInfo);
|
|
clippingActorInfo->setGroupClippingEnable(false);
|
|
}
|
|
}
|
|
|
|
void ClippingDirector::execute() {
|
|
if (!mIsExecute)
|
|
return;
|
|
mFarAreaObserver->update();
|
|
mClippingJudge->update();
|
|
if (mViewInfoCtrl->update())
|
|
mClippingActorHolder->updateFarClipLevel();
|
|
mClippingActorHolder->update(mClippingJudge);
|
|
mGroupHolder->update(mClippingJudge);
|
|
}
|
|
|
|
void ClippingDirector::startCheckViewCtrlByCameraPos() {
|
|
mViewInfoCtrl->startCheckByCameraPos();
|
|
}
|
|
|
|
void ClippingDirector::startCheckViewCtrlByLookAtPos() {
|
|
mViewInfoCtrl->startCheckByLookAtPos();
|
|
}
|
|
|
|
void ClippingDirector::startCheckViewCtrlByPlayerPos() {
|
|
mViewInfoCtrl->startCheckByPlayerPos();
|
|
}
|
|
} // namespace al
|