1#pragma once
2
3#include <basis/seadTypes.h>
4
5namespace al {
6class CollisionPartsFilterOnlySpecialPurpose;
7class LiveActor;
8} // namespace al
9class In2DAreaMoveControl;
10class IUseDimension;
11
12class ActorDimensionKeeper {
13public:
14 ActorDimensionKeeper(const al::LiveActor* actor);
15 void validate();
16 void invalidate();
17 void forceChange2DKeep();
18 void forceEndChange2DKeep();
19 bool update();
20
21 bool getIs2D() const { return mIs2D; }
22
23 bool getIsIn2DArea() const { return mIsIn2DArea; }
24
25 bool getIsCurrently2D() const { return mIsCurrently2D; }
26
27 bool getIsCanChange2D() const { return mIsCanChange2D; }
28
29 bool getIsCanChange3D() const { return mIsCanChange3D; }
30
31private:
32 const al::LiveActor* mLiveActor;
33 bool mIsValid = true;
34 bool mIs2D = false;
35 bool mIsIn2DArea = false;
36 bool mIsCurrently2D = false;
37 bool mIsCanChange2D = false;
38 bool mIsCanChange3D = false;
39 In2DAreaMoveControl* mIn2DAreaMoveControl = nullptr;
40};
41
42static_assert(sizeof(ActorDimensionKeeper) == 0x18);
43
44namespace rs {
45
46ActorDimensionKeeper* createDimensionKeeper(const al::LiveActor* actor);
47void updateDimensionKeeper(ActorDimensionKeeper* keeper);
48
49const char* getSpecialPurposeName2DOnly();
50void createAndSetFilter2DOnly(al::LiveActor* actor);
51al::CollisionPartsFilterOnlySpecialPurpose* createCollisionPartsFilter2DOnly();
52
53bool is2D(const IUseDimension* dimension);
54bool isIn2DArea(const IUseDimension* dimension);
55bool isChange2D(const IUseDimension* dimension);
56bool isChange3D(const IUseDimension* dimension);
57bool is3D(const IUseDimension* dimension);
58void snap2D(al::LiveActor* actor, const IUseDimension* dimension, f32 unk_distance);
59void snap2DGravity(al::LiveActor* actor, const IUseDimension* dimension, f32 unk_distance);
60
61} // namespace rs
62