1#pragma once
2
3#include <math/seadVector.h>
4
5namespace al {
6class CameraPoser;
7class PlacementInfo;
8class Rail;
9class RailRider;
10
11class CameraLimitRailKeeper {
12public:
13 CameraLimitRailKeeper();
14
15 void init(const PlacementInfo& info, s32 viewCount);
16 void updateRider(const CameraPoser* poser);
17 RailRider* getRider(const CameraPoser* poser) const;
18 void calcCameraDirH(sead::Vector3f* out, const CameraPoser* poser) const;
19 bool isNearInsideRailPoint(const CameraPoser* poser, f32 approx) const;
20 const sead::Vector3f& getRailPos(const CameraPoser* poser) const;
21 f32 calcDistanceFromNearestRailPos(const sead::Vector3f& pos) const;
22 void calcNearestRailPos(sead::Vector3f* out, const sead::Vector3f& pos) const;
23
24private:
25 Rail* mRail = nullptr;
26 RailRider** mRiders = nullptr;
27 s32 mRiderCount = 0;
28 s32 mCameraLookAtDir = 0;
29 f32 mActivateDistance = 1000.0f;
30 f32 mDegreeMargin = 40.0f;
31 f32 mAngleElevation = 20.0f;
32 f32 mAngleElevation2 = 20.0f;
33 s32 mAngleElevationIterpStep = 60;
34 s32 mAngleElevationResetStep = 60;
35 f32 mCameraDistance = 2000.0f;
36 f32 mCameraDistanceMin = 250.0f;
37 f32 mCameraDistanceMax = 4000.0f;
38 f32 mOffsetY = 120.0f;
39 bool mIsApplyAngleElevation = false;
40 bool mIsResetAngleElevation = false;
41 bool mIsFixedAngle = false;
42 bool mIsApplyCameraDistance = false;
43 bool mIsApplyCameraDistanceRange = false;
44 bool mIsApplyOffsetY = false;
45 bool mIsInvalidCheckCollision = false;
46};
47
48static_assert(sizeof(CameraLimitRailKeeper) == 0x48);
49} // namespace al
50