2018-10-07 03:42:33 +00:00
|
|
|
#pragma once
|
2017-02-12 03:17:18 +00:00
|
|
|
|
2019-09-28 02:53:03 +00:00
|
|
|
#include "Runtime/Audio/CSfxManager.hpp"
|
2022-03-23 05:35:13 +00:00
|
|
|
#include "Runtime/CPlayerState.hpp"
|
2019-09-28 02:53:03 +00:00
|
|
|
#include "Runtime/Camera/CCameraFilter.hpp"
|
|
|
|
#include "Runtime/Graphics/CModel.hpp"
|
|
|
|
#include "Runtime/Graphics/Shaders/CColoredQuadFilter.hpp"
|
|
|
|
#include "Runtime/Graphics/Shaders/CTexturedQuadFilter.hpp"
|
2022-03-23 05:35:13 +00:00
|
|
|
#include "Runtime/RetroTypes.hpp"
|
|
|
|
#include "Runtime/rstl.hpp"
|
2019-09-28 02:53:03 +00:00
|
|
|
|
|
|
|
#include <zeus/CVector2f.hpp>
|
2017-05-29 19:55:44 +00:00
|
|
|
|
2021-04-10 08:42:06 +00:00
|
|
|
namespace metaforce {
|
2017-02-12 03:17:18 +00:00
|
|
|
class CStateManager;
|
2017-05-21 16:01:04 +00:00
|
|
|
class CTargetingManager;
|
2017-02-12 03:17:18 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
namespace MP1 {
|
2017-02-12 03:17:18 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
class CPlayerVisor {
|
|
|
|
struct SScanTarget {
|
|
|
|
TUniqueId x0_objId = kInvalidUniqueId;
|
|
|
|
float x4_timer = 0.f;
|
|
|
|
float x8_inRangeTimer = 0.f;
|
|
|
|
bool xc_inBox = false;
|
|
|
|
};
|
2017-05-29 19:55:44 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
enum class EScanWindowState { NotInScanVisor, Idle, Scan };
|
2017-05-29 19:55:44 +00:00
|
|
|
|
2018-12-08 05:30:43 +00: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
|
2020-04-21 07:22:41 +00:00
|
|
|
bool x25_24_visorTransitioning : 1 = false;
|
|
|
|
bool x25_25_ : 1 = false;
|
2018-12-08 05:30:43 +00: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-23 05:35:13 +00:00
|
|
|
CCameraFilterPass x64_scanDim;
|
2018-12-08 05:30:43 +00:00
|
|
|
CCameraBlurPass x90_xrayBlur;
|
|
|
|
float xc4_vpScaleX = 1.f;
|
|
|
|
float xc8_vpScaleY = 1.f;
|
2022-03-23 05:35:13 +00: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-08 05:30:43 +00:00
|
|
|
int x120_assetLockCountdown = 0;
|
2022-03-23 05:35:13 +00:00
|
|
|
TCachedToken<CModel> x124_scanIconNoncritical;
|
|
|
|
TCachedToken<CModel> x130_scanIconCritical;
|
2018-12-08 05:30:43 +00:00
|
|
|
rstl::reserved_vector<SScanTarget, 64> x13c_scanTargets;
|
|
|
|
TLockedToken<CTexture> x540_xrayPalette;
|
|
|
|
float x54c_scanFrameColorInterp = 0.f;
|
|
|
|
float x550_scanFrameColorImpulseInterp = 0.f;
|
2017-05-29 19:55:44 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
int FindEmptyInactiveScanTarget() const;
|
|
|
|
int FindCachedInactiveScanTarget(TUniqueId uid) const;
|
2022-03-06 00:26:52 +00:00
|
|
|
bool DrawScanObjectIndicators(const CStateManager& mgr);
|
2018-12-08 05:30:43 +00:00
|
|
|
void UpdateScanObjectIndicators(const CStateManager& mgr, float dt);
|
|
|
|
void UpdateScanWindow(float dt, const CStateManager& mgr);
|
|
|
|
EScanWindowState GetDesiredScanWindowState(const CStateManager& mgr) const;
|
|
|
|
void LockUnlockAssets();
|
2020-04-10 01:28:50 +00:00
|
|
|
void DrawScanEffect(const CStateManager& mgr, CTargetingManager* tgtMgr);
|
2020-04-05 10:54:43 +00:00
|
|
|
void DrawXRayEffect(const CStateManager& mgr);
|
|
|
|
void DrawThermalEffect(const CStateManager& mgr);
|
2018-12-08 05:30:43 +00:00
|
|
|
void UpdateCurrentVisor(float transFactor);
|
|
|
|
void FinishTransitionIn();
|
|
|
|
void BeginTransitionIn(const CStateManager& mgr);
|
|
|
|
void FinishTransitionOut(const CStateManager& mgr);
|
|
|
|
void BeginTransitionOut();
|
2017-05-29 19:55:44 +00:00
|
|
|
|
2017-02-12 03:17:18 +00:00
|
|
|
public:
|
2020-03-31 03:52:22 +00:00
|
|
|
explicit CPlayerVisor(CStateManager& stateMgr);
|
2018-12-08 05:30:43 +00:00
|
|
|
~CPlayerVisor();
|
|
|
|
void Update(float dt, const CStateManager& stateMgr);
|
2020-04-10 01:28:50 +00:00
|
|
|
void Draw(const CStateManager& stateMgr, CTargetingManager* tgtManager);
|
2018-12-08 05:30:43 +00:00
|
|
|
void Touch();
|
|
|
|
float GetDesiredViewportScaleX(const CStateManager& stateMgr) const;
|
|
|
|
float GetDesiredViewportScaleY(const CStateManager& stateMgr) const;
|
2017-02-12 03:17:18 +00:00
|
|
|
};
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
} // namespace MP1
|
2021-04-10 08:42:06 +00:00
|
|
|
} // namespace metaforce
|