| 1 | #pragma once |
| 2 | |
| 3 | #include <math/seadVector.h> |
| 4 | |
| 5 | namespace al { |
| 6 | class CameraPoser; |
| 7 | class PlacementInfo; |
| 8 | class Rail; |
| 9 | class RailRider; |
| 10 | |
| 11 | class CameraLimitRailKeeper { |
| 12 | public: |
| 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 | |
| 24 | private: |
| 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 | |
| 48 | static_assert(sizeof(CameraLimitRailKeeper) == 0x48); |
| 49 | } // namespace al |
| 50 | |