1#pragma once
2
3#include <gfx/seadCamera.h>
4#include <gfx/seadProjection.h>
5
6#include "Library/Camera/CameraPoserFunction.h"
7#include "Library/Nerve/NerveExecutor.h"
8#include "Library/Yaml/ByamlIter.h"
9
10namespace al {
11class CameraPoser;
12struct CameraStartInfo;
13
14class CameraVerticalAbsorber : public NerveExecutor {
15public:
16 CameraVerticalAbsorber(const CameraPoser* cameraParent, bool isCameraPosAbsorb);
17 ~CameraVerticalAbsorber();
18 void exeAbsorb();
19 void exeFollow();
20 void exeFollowAbsolute();
21 void exeFollowClimbPole();
22 void exeFollowGround();
23 void invalidate();
24 bool isAbsorbing() const;
25 bool isValid() const;
26 void liberateAbsorb();
27 void load(const ByamlIter&);
28 void makeLookAtCamera(sead::LookAtCamera*) const;
29 void start(const sead::Vector3f&, const CameraStartInfo&);
30 void tryResetAbsorbVecIfInCollision(const sead::Vector3f&);
31 void update();
32
33private:
34 const CameraPoser* mCameraPoser;
35 sead::LookAtCamera mLookAtCamera;
36 sead::PerspectiveProjection mProjection;
37 sead::Vector3f mTargetInterp;
38 f32 mLerp1;
39 f32 mAbsorbScreenPosUp;
40 f32 mAbsorbScreenPosDown;
41 bool mIsAdvanceAbsorbUp;
42 f32 mAdvanceAbsorbScreenPosUp;
43 bool mIsExistCollisionUnderTarget;
44 sead::Vector3f mUnderTargetCollisionPos;
45 sead::Vector3f mUnderTargetCollisionNormal;
46 f32 mLerp2;
47 f32 mKeepInFrameOffsetUp;
48 f32 mKeepInFrameOffsetDown;
49 f32 mHighJumpJudgeSpeedV;
50 sead::Vector3f mPrevTargetTrans;
51 sead::Vector3f mTargetFront;
52 sead::Vector3f mPrevTargetFront;
53 bool mIsNoCameraPosAbsorb;
54 bool mIsInvalidated;
55 bool unk_unusedBool;
56 bool mIsStopUpdate;
57 bool mIsKeepInFrame;
58};
59
60static_assert(sizeof(CameraVerticalAbsorber) == 0x1B0);
61
62} // namespace al
63