metaforce/Runtime/MP1/CPlayerVisor.hpp

93 lines
3.3 KiB
C++
Raw Permalink Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2017-02-11 19:17:18 -08:00
#include "Runtime/Audio/CSfxManager.hpp"
2022-03-22 22:35:13 -07:00
#include "Runtime/CPlayerState.hpp"
#include "Runtime/Camera/CCameraFilter.hpp"
#include "Runtime/Graphics/CModel.hpp"
2022-03-22 22:35:13 -07:00
#include "Runtime/RetroTypes.hpp"
#include "Runtime/rstl.hpp"
#include <zeus/CVector2f.hpp>
2021-04-10 01:42:06 -07:00
namespace metaforce {
2017-02-11 19:17:18 -08:00
class CStateManager;
2017-05-21 09:01:04 -07:00
class CTargetingManager;
2017-02-11 19:17:18 -08:00
2018-12-07 21:30:43 -08:00
namespace MP1 {
2017-02-11 19:17:18 -08:00
2018-12-07 21:30:43 -08:00
class CPlayerVisor {
struct SScanTarget {
TUniqueId x0_objId = kInvalidUniqueId;
float x4_timer = 0.f;
float x8_inRangeTimer = 0.f;
bool xc_inBox = false;
};
2018-12-07 21:30:43 -08:00
enum class EScanWindowState { NotInScanVisor, Idle, Scan };
2018-12-07 21:30:43 -08:00
rstl::reserved_vector<zeus::CVector2f, 3> x0_scanWindowSizes;
CPlayerState::EPlayerVisor x1c_curVisor = CPlayerState::EPlayerVisor::Combat;
CPlayerState::EPlayerVisor x20_nextVisor = CPlayerState::EPlayerVisor::Combat;
float x24_visorSfxVol = 1.f; // used to be u8
bool x25_24_visorTransitioning : 1 = false;
bool x25_25_ : 1 = false;
2018-12-07 21:30:43 -08:00
float x28_ = 0.f;
float x2c_scanDimInterp = 1.f;
EScanWindowState x30_prevState = EScanWindowState::NotInScanVisor;
EScanWindowState x34_nextState = EScanWindowState::NotInScanVisor;
float x38_windowInterpDuration = 0.f;
float x3c_windowInterpTimer = 0.f;
zeus::CVector2f x40_prevWindowDims;
zeus::CVector2f x48_interpWindowDims;
zeus::CVector2f x50_nextWindowDims;
float x58_scanMagInterp = 1.f;
CSfxHandle x5c_visorLoopSfx;
CSfxHandle x60_scanningLoopSfx;
2022-03-22 22:35:13 -07:00
CCameraFilterPass x64_scanDim;
2018-12-07 21:30:43 -08:00
CCameraBlurPass x90_xrayBlur;
float xc4_vpScaleX = 1.f;
float xc8_vpScaleY = 1.f;
2022-03-22 22:35:13 -07:00
TCachedToken<CModel> xcc_scanFrameCorner;
TCachedToken<CModel> xd8_scanFrameCenterSide;
TCachedToken<CModel> xe4_scanFrameCenterTop;
TCachedToken<CModel> xf0_scanFrameStretchSide;
TCachedToken<CModel> xfc_scanFrameStretchTop;
TCachedToken<CModel> x108_newScanPane;
TCachedToken<CModel> x114_scanShield;
2018-12-07 21:30:43 -08:00
int x120_assetLockCountdown = 0;
2022-03-22 22:35:13 -07:00
TCachedToken<CModel> x124_scanIconNoncritical;
TCachedToken<CModel> x130_scanIconCritical;
2018-12-07 21:30:43 -08:00
rstl::reserved_vector<SScanTarget, 64> x13c_scanTargets;
TLockedToken<CTexture> x540_xrayPalette;
float x54c_scanFrameColorInterp = 0.f;
float x550_scanFrameColorImpulseInterp = 0.f;
2018-12-07 21:30:43 -08:00
int FindEmptyInactiveScanTarget() const;
int FindCachedInactiveScanTarget(TUniqueId uid) const;
bool DrawScanObjectIndicators(const CStateManager& mgr);
2018-12-07 21:30:43 -08:00
void UpdateScanObjectIndicators(const CStateManager& mgr, float dt);
void UpdateScanWindow(float dt, const CStateManager& mgr);
EScanWindowState GetDesiredScanWindowState(const CStateManager& mgr) const;
void LockUnlockAssets();
void DrawScanEffect(const CStateManager& mgr, CTargetingManager* tgtMgr);
void DrawXRayEffect(const CStateManager& mgr);
void DrawThermalEffect(const CStateManager& mgr);
2018-12-07 21:30:43 -08:00
void UpdateCurrentVisor(float transFactor);
void FinishTransitionIn();
void BeginTransitionIn(const CStateManager& mgr);
void FinishTransitionOut(const CStateManager& mgr);
void BeginTransitionOut();
2017-02-11 19:17:18 -08:00
public:
explicit CPlayerVisor(CStateManager& stateMgr);
2018-12-07 21:30:43 -08:00
~CPlayerVisor();
void Update(float dt, const CStateManager& stateMgr);
void Draw(const CStateManager& stateMgr, CTargetingManager* tgtManager);
2018-12-07 21:30:43 -08:00
void Touch();
float GetDesiredViewportScaleX(const CStateManager& stateMgr) const;
float GetDesiredViewportScaleY(const CStateManager& stateMgr) const;
2017-02-11 19:17:18 -08:00
};
2018-12-07 21:30:43 -08:00
} // namespace MP1
2021-04-10 01:42:06 -07:00
} // namespace metaforce