1#include "Library/MapObj/SubActorLodExecutor.h"
2
3#include "Library/LiveActor/ActorFlagFunction.h"
4#include "Library/LiveActor/ActorModelFunction.h"
5#include "Library/LiveActor/LiveActor.h"
6#include "Library/LiveActor/LiveActorFunction.h"
7#include "Library/Model/ModelShapeUtil.h"
8#include "Library/Placement/PlacementFunction.h"
9
10namespace al {
11SubActorLodExecutor::SubActorLodExecutor(LiveActor* actor, const ActorInitInfo& info,
12 s32 subActorInfoIndex)
13 : mActor(actor), mSubActorInfoIndex(subActorInfoIndex) {
14 LiveActor* subActor = getLodSubActor();
15
16 const char* cubeMapUnitName = nullptr;
17 tryGetStringArg(arg: &cubeMapUnitName, initInfo: info, key: "CubeMapUnitName");
18
19 if (cubeMapUnitName != nullptr)
20 forceApplyCubeMap(actor: subActor, cubeMapName: cubeMapUnitName);
21
22 subActor->makeActorDead();
23}
24
25void SubActorLodExecutor::control() {
26 ModelKeeper* modelKeeper = mActor->getModelKeeper();
27 LiveActor* subActor = getLodSubActor();
28
29 if (mLodAction == LodAction::HideActor)
30 hideModel(actor: mActor);
31 else if (mLodAction == LodAction::KillSubActor)
32 subActor->makeActorDead();
33 mLodAction = LodAction::None;
34
35 if (isLessMaxLodLevelNoClamp(modelKeeper))
36 showModelIfHide(actor: mActor);
37 else if (isDead(actor: subActor))
38 subActor->makeActorAlive();
39
40 if (isGreaterEqualMaxLodLevelNoClamp(modelKeeper) && !isHideModel(actor: mActor))
41 mLodAction = LodAction::HideActor;
42 else if (isLessMaxLodLevelNoClamp(modelKeeper) && isAlive(actor: subActor))
43 mLodAction = LodAction::KillSubActor;
44}
45
46LiveActor* SubActorLodExecutor::getLodSubActor() {
47 return getSubActor(actor: mActor, index: mSubActorInfoIndex);
48}
49} // namespace al
50