1#include "Project/Clipping/ClippingDirector.h"
2
3#include "Library/Area/AreaObjDirector.h"
4#include "Library/Clipping/ClippingActorHolder.h"
5#include "Library/Clipping/ClippingActorInfo.h"
6#include "Library/Clipping/ClippingGroupHolder.h"
7#include "Library/Clipping/ClippingJudge.h"
8#include "Library/Placement/PlacementFunction.h"
9#include "Project/Clipping/ClippingFarAreaObserver.h"
10#include "Project/Clipping/ViewInfoCtrl.h"
11
12namespace al {
13
14ClippingDirector::ClippingDirector(s32 maxActors, const AreaObjDirector* areaObjDirector,
15 const PlayerHolder* playerHolder,
16 const SceneCameraInfo* sceneCameraInfo) {
17 mFarAreaObserver = new ClippingFarAreaObserver(areaObjDirector, playerHolder);
18 mClippingJudge = new ClippingJudge(mFarAreaObserver, sceneCameraInfo);
19 mClippingActorHolder = new ClippingActorHolder(maxActors);
20 mGroupHolder = new ClippingGroupHolder();
21 mViewInfoCtrl = new ViewInfoCtrl(playerHolder, sceneCameraInfo);
22}
23
24ClippingDirector::~ClippingDirector() {
25 if (mClippingActorHolder) {
26 delete mClippingActorHolder;
27 mClippingActorHolder = nullptr;
28 }
29}
30
31void ClippingDirector::endInit(const AreaObjDirector* areaObjDirector) {
32 mViewInfoCtrl->initViewCtrlAreaGroup(areaObjDirector->getAreaObjGroup(name: "ViewCtrlArea"));
33 mFarAreaObserver->endInit();
34 mClippingActorHolder->endInit(mGroupHolder);
35}
36
37void ClippingDirector::setDefaultFarClipDistance(f32 distance) {
38 mFarAreaObserver->setDefaultFarClipDistance(distance);
39}
40
41void ClippingDirector::setDefaultFarClipDistanceSub(f32 distance) {
42 mFarAreaObserver->setDefaultFarClipDistanceSub(distance);
43}
44
45f32 ClippingDirector::getFarClipDistance() const {
46 return mFarAreaObserver->getFarClipDistance();
47}
48
49void ClippingDirector::registerActor(LiveActor* liveActor, const ViewIdHolder* idHolder) {
50 ClippingActorInfo* clippingActorInfo = mClippingActorHolder->registerActor(liveActor);
51 clippingActorInfo->initViewGroup(idHolder);
52 mViewInfoCtrl->initActorInfo(clippingActorInfo);
53}
54
55void ClippingDirector::addToGroupClipping(LiveActor* liveActor,
56 const ActorInitInfo& actorInitInfo) {
57 if (alPlacementFunction::isEnableGroupClipping(initInfo: actorInitInfo))
58 mClippingActorHolder->initGroupClipping(liveActor, actorInitInfo);
59}
60
61void ClippingDirector::onGroupClipping(LiveActor* liveActor) {
62 ClippingActorInfo* clippingActorInfo = mClippingActorHolder->find(liveActor);
63 if (clippingActorInfo->isGroupClippingInit()) {
64 mClippingActorHolder->onGroupClipping(liveActor);
65 mGroupHolder->reentry(clippingActorInfo);
66 clippingActorInfo->setIsEnableGroupClipping(true);
67 }
68}
69
70void ClippingDirector::offGroupClipping(LiveActor* liveActor) {
71 ClippingActorInfo* clippingActorInfo = mClippingActorHolder->find(liveActor);
72 if (clippingActorInfo->isGroupClippingInit()) {
73 mClippingActorHolder->offGroupClipping(liveActor);
74 mGroupHolder->leave(clippingActorInfo);
75 clippingActorInfo->setIsEnableGroupClipping(false);
76 }
77}
78
79void ClippingDirector::execute() {
80 if (!mIsExecute)
81 return;
82 mFarAreaObserver->update();
83 mClippingJudge->update();
84 if (mViewInfoCtrl->update())
85 mClippingActorHolder->updateFarClipLevel();
86 mClippingActorHolder->update(mClippingJudge);
87 mGroupHolder->update(mClippingJudge);
88}
89
90void ClippingDirector::startCheckViewCtrlByCameraPos() {
91 mViewInfoCtrl->startCheckByCameraPos();
92}
93
94void ClippingDirector::startCheckViewCtrlByLookAtPos() {
95 mViewInfoCtrl->startCheckByLookAtPos();
96}
97
98void ClippingDirector::startCheckViewCtrlByPlayerPos() {
99 mViewInfoCtrl->startCheckByPlayerPos();
100}
101} // namespace al
102