prime/include/MetroidPrime/Cameras/CCameraManager.hpp

163 lines
5.5 KiB
C++
Raw Normal View History

#ifndef _CCAMERAMANAGER
#define _CCAMERAMANAGER
#include "types.h"
#include "MetroidPrime/CGameArea.hpp"
#include "MetroidPrime/Cameras/CCameraShakeData.hpp"
2024-09-22 22:58:50 +00:00
#include "MetroidPrime/TGameTypes.hpp"
#include "Kyoto/Math/CVector3f.hpp"
#include "rstl/list.hpp"
#include "rstl/pair.hpp"
#include "rstl/reserved_vector.hpp"
#include "rstl/vector.hpp"
class CBallCamera;
class CCameraShakeData;
2024-09-22 22:58:50 +00:00
class CFinalInput;
class CFirstPersonCamera;
class CGameCamera;
class CInterpolationCamera;
2024-09-23 05:56:21 +00:00
class CScriptCameraHint;
2024-09-22 22:58:50 +00:00
class CScriptWater;
class CStateManager;
#ifdef __MWERKS__
#pragma cpp_extensions on
2024-09-22 22:58:50 +00:00
#endif
class CCameraManager {
static float sFirstPersonFOV;
static float sThirdPersonFOV;
static float sNearPlane;
static float sFarPlane;
static float sAspectRatio;
static float lbl_805A6BE4;
static float lbl_805A6BE8;
2024-09-22 22:58:50 +00:00
public:
CCameraManager(TUniqueId curCamera = kInvalidUniqueId);
void CreateCameras(CStateManager& mgr);
void UpdateCameras(float dt, CStateManager& mgr);
void ResetCameras(CStateManager& mgr);
void Render(const CStateManager& mgr);
TUniqueId GetCurrentCameraId() const;
2024-09-22 22:58:50 +00:00
void SetCurrentCameraId(TUniqueId camId);
CGameCamera& CurrentCamera(CStateManager& mgr);
const CGameCamera& GetCurrentCamera(const CStateManager& mgr) const;
const CGameCamera& GetCurrentCinematicCamera(CStateManager& mgr) const;
TUniqueId GetCurrentCinematicCameraId() const;
2024-09-22 22:58:50 +00:00
void Update(float dt, CStateManager& mgr);
void UpdateAudioListener(CStateManager& mgr);
void UpdateScreenShake(float dt, CStateManager& mgr);
void UpdateFilters(float dt, CStateManager& mgr);
2024-09-22 22:58:50 +00:00
void UpdateCameraHints(float dt, CStateManager& mgr);
float GetWaterFarDistance(CStateManager& mgr, const CScriptWater* water);
void SetWaterFogScale(float fogDensityTarget, float fogDensitySpeed);
CFirstPersonCamera* FirstPersonCamera() const /* map */ { return x7c_fpCamera; }
const CFirstPersonCamera* GetFirstPersonCamera() const { return x7c_fpCamera; }
void SetPlayerCamera(CStateManager& mgr, TUniqueId newCamId);
bool IsInCinematicCamera() const;
2024-09-22 22:58:50 +00:00
void AddCinemaCamera(TUniqueId uid, CStateManager& mgr);
void RemoveCinemaCamera(TUniqueId uid, CStateManager& mgr);
void EnterCinematic(CStateManager& mgr);
void StopCinematics(CStateManager& mgr);
int AddCameraShaker(const CCameraShakeData& data, bool sfx);
2024-09-22 22:58:50 +00:00
void RemoveCameraShaker(int id);
CTransform4f GetCurrentCameraTransform(const CStateManager& mgr) const;
2024-09-23 05:56:21 +00:00
CVector3f GetGlobalCameraTranslation(const CStateManager& mgr) const;
bool IsInFirstPersonCamera() const;
bool IsInterpolationCameraActive() const;
bool ShouldBypassInterpolationCamera() const;
void SetupInterpolation(const CTransform4f& xf, TUniqueId camId, CVector3f lookPos,
2024-09-23 05:56:21 +00:00
float maxTime, float positionSpeed, float rotationSpeed,
bool sinusoidal, CStateManager& mgr);
void CinematicCut(CStateManager& mgr);
void UseCameraHint(const CScriptCameraHint& hint, CStateManager& mgr);
void NoCameraHintsLeft(CStateManager& mgr);
void AddCameraHint(TUniqueId uid, CStateManager& mgr);
void DeleteCameraHint(TUniqueId uid, CStateManager& mgr);
void ReallyRemoveCameraHint(TUniqueId uid, CStateManager& mgr);
2024-09-22 22:58:50 +00:00
// SetSpecialCameras__14CCameraManagerFR18CFirstPersonCameraR11CBallCamera
2024-09-30 06:02:23 +00:00
void ResetCameraHint(CStateManager& mgr);
void SetCurrentFov(float fov) { x3bc_curFov = fov; }
2024-09-22 22:58:50 +00:00
int GetFluidCounter() const { return x74_fluidCounter; }
2024-09-22 22:58:50 +00:00
TUniqueId GetFluidId() const { return x78_fluidId; }
2024-09-28 19:43:23 +00:00
bool GetInsideFluid() const { return x74_fluidCounter == 0; }
bool IsInsideFluid() const { return xa0_26_inWater; }
2024-09-22 22:58:50 +00:00
// WasInsideFluid__14CCameraManagerCFv
// SetWasInsideFluid__14CCameraManagerFb
void SetInsideFluid(bool isInside, TUniqueId fluidId);
2024-09-22 22:58:50 +00:00
void ProcessInput(const CFinalInput& input, CStateManager& mgr);
void SetPathCamera(TUniqueId id, CStateManager& mgr);
TUniqueId GetPathCameraId() const;
void SetSpindleCamera(TUniqueId id, CStateManager& mgr);
TUniqueId GetSpindleCameraId() const;
2024-09-30 06:02:23 +00:00
CBallCamera* BallCamera() const { return x80_ballCamera; }
const CBallCamera* GetBallCamera() const { return x80_ballCamera; }
static float GetDefaultThirdPersonVerticalFOV();
static float GetDefaultFirstPersonVerticalFOV();
static float GetDefaultFirstPersonNearClipDistance();
static float GetDefaultFirstPersonFarClipDistance();
static float GetDefaultAspectRatio();
2024-09-22 22:58:50 +00:00
private:
TUniqueId x0_curCameraId;
rstl::vector< TUniqueId > x4_cineCameras;
rstl::list< CCameraShakeData > x14_shakers;
uint x2c_lastShakeId;
CVector3f x30_shakeOffset;
CGameArea::CAreaFog x3c_fog;
int x74_fluidCounter;
TUniqueId x78_fluidId;
CFirstPersonCamera* x7c_fpCamera;
CBallCamera* x80_ballCamera;
int x84_rumbleId;
CInterpolationCamera* x88_interpCamera;
short x8c_;
float x90_rumbleCooldown;
float x94_fogDensityFactor;
float x98_fogDensitySpeed;
float x9c_fogDensityFactorTarget;
union {
struct {
bool xa0_24_pendingRumble : 1;
bool xa0_25_rumbling : 1;
bool xa0_26_inWater : 1;
};
uchar xa0_flags;
};
TUniqueId xa2_spindleCamId;
TUniqueId xa4_pathCamId;
TUniqueId xa6_camHintId;
int xa8_hintPriority;
rstl::reserved_vector< rstl::pair< int, TUniqueId >, 64 > xac_cameraHints;
rstl::reserved_vector< TUniqueId, 64 > x2b0_inactiveCameraHints;
rstl::reserved_vector< TUniqueId, 64 > x334_activeCameraHints;
bool x3b8_24_ : 1;
bool x3b8_25_ : 1;
float x3bc_curFov;
};
CHECK_SIZEOF(CCameraManager, 0x3c0)
#ifdef __MWERKS__
#pragma cpp_extensions reset
2024-09-22 22:58:50 +00:00
#endif
#endif // _CCAMERAMANAGER