mirror of https://github.com/PrimeDecomp/prime.git
More CCameraManager progress
This commit is contained in:
parent
3d73c595c0
commit
141d88c0f7
|
@ -145,9 +145,9 @@ GetGlobalCameraTranslation__14CCameraManagerCFRC13CStateManager = .text:0x8000A9
|
||||||
GetCurrentCameraTransform__14CCameraManagerCFRC13CStateManager = .text:0x8000A968; // type:function size:0x68 scope:global
|
GetCurrentCameraTransform__14CCameraManagerCFRC13CStateManager = .text:0x8000A968; // type:function size:0x68 scope:global
|
||||||
RemoveCameraShaker__14CCameraManagerFi = .text:0x8000A9D0; // type:function size:0x50 scope:global
|
RemoveCameraShaker__14CCameraManagerFi = .text:0x8000A9D0; // type:function size:0x50 scope:global
|
||||||
AddCameraShaker__14CCameraManagerFRC16CCameraShakeDatab = .text:0x8000AA20; // type:function size:0x1F0 scope:global
|
AddCameraShaker__14CCameraManagerFRC16CCameraShakeDatab = .text:0x8000AA20; // type:function size:0x1F0 scope:global
|
||||||
fn_8000AC10 = .text:0x8000AC10; // type:function size:0x28
|
push_back__Q24rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>FRC16CCameraShakeData = .text:0x8000AC10; // type:function size:0x28
|
||||||
fn_8000AC38 = .text:0x8000AC38; // type:function size:0x70
|
do_insert_before__Q24rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>FPQ34rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>4nodeRC16CCameraShakeData = .text:0x8000AC38; // type:function size:0x70
|
||||||
fn_8000ACA8 = .text:0x8000ACA8; // type:function size:0x84
|
create_node__Q24rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>FPQ34rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>4nodePQ34rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>4nodeRC16CCameraShakeData = .text:0x8000ACA8; // type:function size:0x84
|
||||||
__dt__16CCameraShakeDataFv = .text:0x8000AD2C; // type:function size:0x7C scope:global
|
__dt__16CCameraShakeDataFv = .text:0x8000AD2C; // type:function size:0x7C scope:global
|
||||||
__ct__16CCameraShakeDataFRC16CCameraShakeData = .text:0x8000ADA8; // type:function size:0x1A8 scope:global
|
__ct__16CCameraShakeDataFRC16CCameraShakeData = .text:0x8000ADA8; // type:function size:0x1A8 scope:global
|
||||||
__dt__22CCameraShakerComponentFv = .text:0x8000AF50; // type:function size:0x48 scope:global
|
__dt__22CCameraShakerComponentFv = .text:0x8000AF50; // type:function size:0x48 scope:global
|
||||||
|
@ -10887,7 +10887,7 @@ Accept__20CInterpolationCameraFR8IVisitor = .text:0x80264FEC; // type:function s
|
||||||
ProcessInput__20CInterpolationCameraFRC11CFinalInputR13CStateManager = .text:0x80265024; // type:function size:0x4 scope:global
|
ProcessInput__20CInterpolationCameraFRC11CFinalInputR13CStateManager = .text:0x80265024; // type:function size:0x4 scope:global
|
||||||
Think__20CInterpolationCameraFfR13CStateManager = .text:0x80265028; // type:function size:0x2EC scope:global
|
Think__20CInterpolationCameraFfR13CStateManager = .text:0x80265028; // type:function size:0x2EC scope:global
|
||||||
fn_80265314 = .text:0x80265314; // type:function size:0x6C
|
fn_80265314 = .text:0x80265314; // type:function size:0x6C
|
||||||
SetInterpolation__20CInterpolationCameraFRC12CTransform4fRC9CVector3ffff9TUniqueIdbR13CStateManager = .text:0x80265380; // type:function size:0x158 scope:global
|
SetInterpolation__20CInterpolationCameraFRC12CTransform4f9CVector3ffff9TUniqueIdbR13CStateManager = .text:0x80265380; // type:function size:0x158 scope:global
|
||||||
InterpolateSinusoidal__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3fff = .text:0x802654D8; // type:function size:0x3E8 scope:global
|
InterpolateSinusoidal__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3fff = .text:0x802654D8; // type:function size:0x3E8 scope:global
|
||||||
InterpolateWithDistance__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3ffffff = .text:0x802658C0; // type:function size:0x54C scope:global
|
InterpolateWithDistance__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3ffffff = .text:0x802658C0; // type:function size:0x54C scope:global
|
||||||
Reset__20CInterpolationCameraFRC12CTransform4fR13CStateManager = .text:0x80265E0C; // type:function size:0x4 scope:global
|
Reset__20CInterpolationCameraFRC12CTransform4fR13CStateManager = .text:0x80265E0C; // type:function size:0x4 scope:global
|
||||||
|
|
|
@ -145,9 +145,9 @@ GetGlobalCameraTranslation__14CCameraManagerCFRC13CStateManager = .text:0x8000A9
|
||||||
GetCurrentCameraTransform__14CCameraManagerCFRC13CStateManager = .text:0x8000A9E4; // type:function size:0x68 scope:global
|
GetCurrentCameraTransform__14CCameraManagerCFRC13CStateManager = .text:0x8000A9E4; // type:function size:0x68 scope:global
|
||||||
RemoveCameraShaker__14CCameraManagerFi = .text:0x8000AA4C; // type:function size:0x50 scope:global
|
RemoveCameraShaker__14CCameraManagerFi = .text:0x8000AA4C; // type:function size:0x50 scope:global
|
||||||
AddCameraShaker__14CCameraManagerFRC16CCameraShakeDatab = .text:0x8000AA9C; // type:function size:0x1F0 scope:global
|
AddCameraShaker__14CCameraManagerFRC16CCameraShakeDatab = .text:0x8000AA9C; // type:function size:0x1F0 scope:global
|
||||||
fn_8000AC10 = .text:0x8000AC8C; // type:function size:0x28 scope:global
|
push_back__Q24rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>FRC16CCameraShakeData = .text:0x8000AC8C; // type:function size:0x28 scope:global
|
||||||
fn_8000AC38 = .text:0x8000ACB4; // type:function size:0x70 scope:global
|
do_insert_before__Q24rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>FPQ34rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>4nodeRC16CCameraShakeData = .text:0x8000ACB4; // type:function size:0x70 scope:global
|
||||||
fn_8000ACA8 = .text:0x8000AD24; // type:function size:0x84 scope:global
|
create_node__Q24rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>FPQ34rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>4nodePQ34rstl51list<16CCameraShakeData,Q24rstl17rmemory_allocator>4nodeRC16CCameraShakeData = .text:0x8000AD24; // type:function size:0x84 scope:global
|
||||||
__dt__16CCameraShakeDataFv = .text:0x8000ADA8; // type:function size:0x7C scope:global
|
__dt__16CCameraShakeDataFv = .text:0x8000ADA8; // type:function size:0x7C scope:global
|
||||||
__ct__16CCameraShakeDataFRC16CCameraShakeData = .text:0x8000AE24; // type:function size:0x1A8 scope:global
|
__ct__16CCameraShakeDataFRC16CCameraShakeData = .text:0x8000AE24; // type:function size:0x1A8 scope:global
|
||||||
__dt__22CCameraShakerComponentFv = .text:0x8000AFCC; // type:function size:0x48 scope:global
|
__dt__22CCameraShakerComponentFv = .text:0x8000AFCC; // type:function size:0x48 scope:global
|
||||||
|
@ -10899,7 +10899,7 @@ Accept__20CInterpolationCameraFR8IVisitor = .text:0x80265068; // type:function s
|
||||||
ProcessInput__20CInterpolationCameraFRC11CFinalInputR13CStateManager = .text:0x802650A0; // type:function size:0x4 scope:global
|
ProcessInput__20CInterpolationCameraFRC11CFinalInputR13CStateManager = .text:0x802650A0; // type:function size:0x4 scope:global
|
||||||
Think__20CInterpolationCameraFfR13CStateManager = .text:0x802650A4; // type:function size:0x2EC scope:global
|
Think__20CInterpolationCameraFfR13CStateManager = .text:0x802650A4; // type:function size:0x2EC scope:global
|
||||||
fn_80265314 = .text:0x80265390; // type:function size:0x6C scope:global
|
fn_80265314 = .text:0x80265390; // type:function size:0x6C scope:global
|
||||||
SetInterpolation__20CInterpolationCameraFRC12CTransform4fRC9CVector3ffff9TUniqueIdbR13CStateManager = .text:0x802653FC; // type:function size:0x158 scope:global
|
SetInterpolation__20CInterpolationCameraFRC12CTransform4f9CVector3ffff9TUniqueIdbR13CStateManager = .text:0x802653FC; // type:function size:0x158 scope:global
|
||||||
InterpolateSinusoidal__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3fff = .text:0x80265554; // type:function size:0x3E8 scope:global
|
InterpolateSinusoidal__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3fff = .text:0x80265554; // type:function size:0x3E8 scope:global
|
||||||
InterpolateWithDistance__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3ffffff = .text:0x8026593C; // type:function size:0x54C scope:global
|
InterpolateWithDistance__20CInterpolationCameraFR12CTransform4fRC9CVector3fRC9CVector3ffffff = .text:0x8026593C; // type:function size:0x54C scope:global
|
||||||
Reset__20CInterpolationCameraFRC12CTransform4fR13CStateManager = .text:0x80265E88; // type:function size:0x4 scope:global
|
Reset__20CInterpolationCameraFRC12CTransform4fR13CStateManager = .text:0x80265E88; // type:function size:0x4 scope:global
|
||||||
|
|
|
@ -206,6 +206,7 @@ public:
|
||||||
static ushort TranslateSFXID(ushort);
|
static ushort TranslateSFXID(ushort);
|
||||||
|
|
||||||
static void PitchBend(CSfxHandle handle, int pitch);
|
static void PitchBend(CSfxHandle handle, int pitch);
|
||||||
|
static void SetDuration(CSfxHandle handle, float duration);
|
||||||
static ushort GetReverbAmount();
|
static ushort GetReverbAmount();
|
||||||
|
|
||||||
static CSfxHandle SfxStart(ushort id, short vol, short pan, bool useAcoustics,
|
static CSfxHandle SfxStart(ushort id, short vol, short pan, bool useAcoustics,
|
||||||
|
|
|
@ -159,6 +159,9 @@ public:
|
||||||
void SetLookAtOffset(CVector3f vec) { x1b4_lookAtOffset = vec; }
|
void SetLookAtOffset(CVector3f vec) { x1b4_lookAtOffset = vec; }
|
||||||
void SetChaseLookAtOffset(CVector3f vec) { x410_chaseLookAtOffset = vec; }
|
void SetChaseLookAtOffset(CVector3f vec) { x410_chaseLookAtOffset = vec; }
|
||||||
void SetWorldOffset(CVector3f vec); // TODO
|
void SetWorldOffset(CVector3f vec); // TODO
|
||||||
|
EBallCameraState GetState() const { return x400_state; }
|
||||||
|
void SetState(EBallCameraState state);
|
||||||
|
void ApplyCameraHint(CStateManager& mgr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct SFailsafeState {
|
struct SFailsafeState {
|
||||||
|
|
|
@ -20,6 +20,7 @@ class CFinalInput;
|
||||||
class CFirstPersonCamera;
|
class CFirstPersonCamera;
|
||||||
class CGameCamera;
|
class CGameCamera;
|
||||||
class CInterpolationCamera;
|
class CInterpolationCamera;
|
||||||
|
class CScriptCameraHint;
|
||||||
class CScriptWater;
|
class CScriptWater;
|
||||||
class CStateManager;
|
class CStateManager;
|
||||||
|
|
||||||
|
@ -72,7 +73,15 @@ public:
|
||||||
int AddCameraShaker(const CCameraShakeData& data, bool sfx);
|
int AddCameraShaker(const CCameraShakeData& data, bool sfx);
|
||||||
void RemoveCameraShaker(int id);
|
void RemoveCameraShaker(int id);
|
||||||
CTransform4f GetCurrentCameraTransform(const CStateManager& mgr) const;
|
CTransform4f GetCurrentCameraTransform(const CStateManager& mgr) const;
|
||||||
// GetGlobalCameraTranslation__14CCameraManagerCFRC13CStateManager
|
CVector3f GetGlobalCameraTranslation(const CStateManager& mgr) const;
|
||||||
|
bool IsInFirstPersonCamera() const;
|
||||||
|
bool IsInterpolationCameraActive() const;
|
||||||
|
bool ShouldBypassInterpolationCamera() const;
|
||||||
|
void InterpolateToBallCamera(const CTransform4f& xf, TUniqueId camId, const CVector3f& lookPos,
|
||||||
|
float maxTime, float positionSpeed, float rotationSpeed,
|
||||||
|
bool sinusoidal, CStateManager& mgr);
|
||||||
|
void SkipBallCameraCinematic(CStateManager& mgr);
|
||||||
|
void ApplyCameraHint(const CScriptCameraHint& hint, CStateManager& mgr);
|
||||||
// SetSpecialCameras__14CCameraManagerFR18CFirstPersonCameraR11CBallCamera
|
// SetSpecialCameras__14CCameraManagerFR18CFirstPersonCameraR11CBallCamera
|
||||||
|
|
||||||
void SetCurrentFov(float fov) { x3bc_curFov = fov; }
|
void SetCurrentFov(float fov) { x3bc_curFov = fov; }
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "Kyoto/Math/CVector3f.hpp"
|
#include "Kyoto/Math/CVector3f.hpp"
|
||||||
|
|
||||||
struct SCameraShakePoint {
|
struct SCameraShakePoint {
|
||||||
bool x0_useEnvelope;
|
uint x0_useEnvelope;
|
||||||
float x4_value;
|
float x4_value;
|
||||||
float x8_magnitude;
|
float x8_magnitude;
|
||||||
float xc_attackTime;
|
float xc_attackTime;
|
||||||
|
@ -41,7 +41,7 @@ public:
|
||||||
virtual ~CCameraShakerComponent() {}
|
virtual ~CCameraShakerComponent() {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool x4_useModulation;
|
uint x4_useModulation;
|
||||||
SCameraShakePoint x8_am;
|
SCameraShakePoint x8_am;
|
||||||
SCameraShakePoint x20_fm;
|
SCameraShakePoint x20_fm;
|
||||||
float x38_value;
|
float x38_value;
|
||||||
|
@ -60,17 +60,20 @@ public:
|
||||||
, x44_shakerY()
|
, x44_shakerY()
|
||||||
, x80_shakerZ(true, SCameraShakePoint(false, 0.25f * duration, 0.f, 0.75f * duration, magnitude),
|
, x80_shakerZ(true, SCameraShakePoint(false, 0.25f * duration, 0.f, 0.75f * duration, magnitude),
|
||||||
SCameraShakePoint(true, 0.f, 0.f, 0.5f * duration, 2.f)) {}
|
SCameraShakePoint(true, 0.f, 0.f, 0.5f * duration, 2.f)) {}
|
||||||
CCameraShakeData(const CCameraShakeData&);
|
|
||||||
|
|
||||||
void SetShakerId(int id) { xbc_shakerId = id; }
|
void SetId(int id) { xbc_shakerId = id; }
|
||||||
int GetShakerId() const { return xbc_shakerId; }
|
int GetId() const { return xbc_shakerId; }
|
||||||
void Update(float dt, CStateManager& mgr);
|
void Update(float dt, CStateManager& mgr);
|
||||||
// GeneratePoint__16CCameraShakeDataFfR9CRandom16
|
// GeneratePoint__16CCameraShakeDataFfR9CRandom16
|
||||||
|
float GetSomething() const;
|
||||||
|
float GetSomething2() const;
|
||||||
|
|
||||||
float GetDuration() const { return x0_duration; }
|
float GetDuration() const { return x0_duration; }
|
||||||
float GetCurTime() const { return x4_curTime; }
|
float GetCurTime() const { return x4_curTime; }
|
||||||
CVector3f GetPoint() const; // { return xc4_sfxPos; }
|
CVector3f GetPoint() const; // { return xc4_sfxPos; }
|
||||||
bool Done() const { return x4_curTime >= x0_duration; }
|
bool Done() const { return x4_curTime >= x0_duration; }
|
||||||
|
uint GetFlags() const { return xc0_flags; }
|
||||||
|
const CVector3f& GetSfxPos() const { return xc4_sfxPos; }
|
||||||
|
|
||||||
static CCameraShakeData skChargedShotCameraShakeData;
|
static CCameraShakeData skChargedShotCameraShakeData;
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,26 @@ class CFirstPersonCamera : public CGameCamera {
|
||||||
public:
|
public:
|
||||||
CFirstPersonCamera(const TUniqueId& uid, const CTransform4f& xf, TUniqueId watchedObj,
|
CFirstPersonCamera(const TUniqueId& uid, const CTransform4f& xf, TUniqueId watchedObj,
|
||||||
float orbitCameraSpeed, float fov, float nearz, float farz, float aspect);
|
float orbitCameraSpeed, float fov, float nearz, float farz, float aspect);
|
||||||
|
|
||||||
|
// CEntity
|
||||||
|
~CFirstPersonCamera() override;
|
||||||
|
void Accept(IVisitor& visitor) override;
|
||||||
|
void PreThink(float dt, CStateManager& mgr) override;
|
||||||
|
void Think(float dt, CStateManager& mgr) override;
|
||||||
|
|
||||||
|
// CActor
|
||||||
|
void Render(const CStateManager&) const override;
|
||||||
|
|
||||||
|
// CGameCamera
|
||||||
|
void ProcessInput(const CFinalInput& input, CStateManager& mgr) override;
|
||||||
|
void Reset(const CTransform4f& xf, CStateManager& mgr) override;
|
||||||
|
|
||||||
void SetScriptPitchId(TUniqueId uid) { x1c4_pitchId = uid; }
|
void SetScriptPitchId(TUniqueId uid) { x1c4_pitchId = uid; }
|
||||||
void ProcessInput(const CFinalInput& input, CStateManager& mgr);
|
// UpdateElevation__18CFirstPersonCameraFR13CStateManager
|
||||||
void Reset(const CTransform4f& xf, CStateManager& mgr);
|
// UpdateTransform__18CFirstPersonCameraFR13CStateManagerf
|
||||||
|
// GetGunFollowTransform__18CFirstPersonCameraCFv
|
||||||
|
// SetLockCamera__18CFirstPersonCameraFb
|
||||||
|
void SkipCinematic();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float x188_orbitCameraSpeed;
|
float x188_orbitCameraSpeed;
|
||||||
|
|
|
@ -30,6 +30,7 @@ public:
|
||||||
// ConvertToScreenSpace__11CGameCameraCFRC9CVector3f
|
// ConvertToScreenSpace__11CGameCameraCFRC9CVector3f
|
||||||
// ValidateCameraTransform__11CGameCameraFRC12CTransform4fRC12CTransform4f
|
// ValidateCameraTransform__11CGameCameraFRC12CTransform4fRC12CTransform4f
|
||||||
// ShouldTryRender__11CGameCameraCFv
|
// ShouldTryRender__11CGameCameraCFv
|
||||||
|
void SkipFovInterpolation();
|
||||||
|
|
||||||
TUniqueId GetWatchedObject() const { return xe8_watchedObject; }
|
TUniqueId GetWatchedObject() const { return xe8_watchedObject; }
|
||||||
float GetFov() const { return x15c_currentFov; }
|
float GetFov() const { return x15c_currentFov; }
|
||||||
|
|
|
@ -6,9 +6,15 @@
|
||||||
class CInterpolationCamera : public CGameCamera {
|
class CInterpolationCamera : public CGameCamera {
|
||||||
public:
|
public:
|
||||||
CInterpolationCamera(TUniqueId uid, const CTransform4f& xf);
|
CInterpolationCamera(TUniqueId uid, const CTransform4f& xf);
|
||||||
|
|
||||||
// CGameCamera
|
// CGameCamera
|
||||||
void ProcessInput(const CFinalInput&, CStateManager& mgr) override;
|
void ProcessInput(const CFinalInput&, CStateManager& mgr) override;
|
||||||
void Reset(const CTransform4f&, CStateManager& mgr) override;
|
void Reset(const CTransform4f&, CStateManager& mgr) override;
|
||||||
|
|
||||||
|
void SetInterpolation(const CTransform4f& xf, CVector3f lookPos, float maxTime,
|
||||||
|
float positionSpeed, float rotationSpeed, TUniqueId targetId,
|
||||||
|
bool sinusoidal, CStateManager& mgr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TUniqueId x188_targetId;
|
TUniqueId x188_targetId;
|
||||||
float x18c_time;
|
float x18c_time;
|
||||||
|
|
|
@ -213,6 +213,8 @@ public:
|
||||||
void RemoveOrbitDisableSource(TUniqueId uid);
|
void RemoveOrbitDisableSource(TUniqueId uid);
|
||||||
void ResetAimTargetPrediction(TUniqueId target);
|
void ResetAimTargetPrediction(TUniqueId target);
|
||||||
void DoSfxEffects(CSfxHandle sfx);
|
void DoSfxEffects(CSfxHandle sfx);
|
||||||
|
void UnFreeze(CStateManager& mgr);
|
||||||
|
void UpdateCinematicState(CStateManager& mgr);
|
||||||
|
|
||||||
CPlayerGun* PlayerGun() { return x490_gun.get(); }
|
CPlayerGun* PlayerGun() { return x490_gun.get(); }
|
||||||
const CPlayerGun* GetPlayerGun() const { return x490_gun.get(); }
|
const CPlayerGun* GetPlayerGun() const { return x490_gun.get(); }
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
#ifndef _CSCRIPTCAMERAHINT
|
||||||
|
#define _CSCRIPTCAMERAHINT
|
||||||
|
|
||||||
|
#include "MetroidPrime/CActor.hpp"
|
||||||
|
#include "MetroidPrime/Cameras/CBallCamera.hpp"
|
||||||
|
#include "MetroidPrime/Cameras/CCameraHint.hpp"
|
||||||
|
#include "MetroidPrime/TGameTypes.hpp"
|
||||||
|
|
||||||
|
#include "Kyoto/Math/CTransform4f.hpp"
|
||||||
|
|
||||||
|
#include "rstl/reserved_vector.hpp"
|
||||||
|
|
||||||
|
class CCameraSpring;
|
||||||
|
|
||||||
|
class CScriptCameraHint : public CActor {
|
||||||
|
public:
|
||||||
|
CScriptCameraHint(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
|
||||||
|
const CTransform4f& xf, bool active, int priority,
|
||||||
|
CBallCamera::EBallCameraBehaviour behavior, int overrideFlags, float minDist,
|
||||||
|
float maxDist, float backwardsDist, const CCameraSpring&, const CCameraSpring&,
|
||||||
|
float, const CVector3f&, const CVector3f&, float);
|
||||||
|
|
||||||
|
// CEntity
|
||||||
|
~CScriptCameraHint() override;
|
||||||
|
void Accept(IVisitor& visitor) override;
|
||||||
|
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
|
||||||
|
|
||||||
|
// GetOverrideFlags__17CScriptCameraHintCFv
|
||||||
|
// GetBehaviourType__17CScriptCameraHintCFv
|
||||||
|
int GetPriority() const { return xe8_priority; }
|
||||||
|
// OverrideCameraInfo__17CScriptCameraHintFP11CBallCamera
|
||||||
|
|
||||||
|
private:
|
||||||
|
int xe8_priority;
|
||||||
|
CCameraHint xec_hint;
|
||||||
|
rstl::reserved_vector< TUniqueId, 8 > x150_helpers;
|
||||||
|
TUniqueId x164_delegatedCamera;
|
||||||
|
bool x166_inactive;
|
||||||
|
CTransform4f x168_origXf;
|
||||||
|
};
|
||||||
|
CHECK_SIZEOF(CScriptCameraHint, 0x198)
|
||||||
|
|
||||||
|
#endif // _CSCRIPTCAMERAHINT
|
|
@ -37,12 +37,10 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
const_pointer_iterator operator+(int v) const {
|
const_pointer_iterator operator+(int v) const {
|
||||||
const_pointer_iterator it = *this;
|
return const_pointer_iterator(this->current + v);
|
||||||
return it += v;
|
|
||||||
}
|
}
|
||||||
const_pointer_iterator operator-(int v) const {
|
const_pointer_iterator operator-(int v) const {
|
||||||
const_pointer_iterator it = *this;
|
return const_pointer_iterator(this->current - v);
|
||||||
return it -= v;
|
|
||||||
}
|
}
|
||||||
difference_type operator-(const const_pointer_iterator& other) const {
|
difference_type operator-(const const_pointer_iterator& other) const {
|
||||||
return this->current - other.current;
|
return this->current - other.current;
|
||||||
|
@ -77,9 +75,8 @@ public:
|
||||||
typedef typename base::iterator_category iterator_category;
|
typedef typename base::iterator_category iterator_category;
|
||||||
typedef typename base::value_type value_type;
|
typedef typename base::value_type value_type;
|
||||||
|
|
||||||
pointer_iterator() : const_pointer_iterator< T, Vec, Alloc >(nullptr) {}
|
pointer_iterator() : base(nullptr) {}
|
||||||
pointer_iterator(T* begin) : const_pointer_iterator< T, Vec, Alloc >(begin) {}
|
pointer_iterator(T* begin) : base(begin) {}
|
||||||
void operator=(const T& other) { rstl::construct(this->current, other); }
|
|
||||||
T& operator*() { return *this->current; }
|
T& operator*() { return *this->current; }
|
||||||
// TODO map says const, but breaks CScriptMazeNode::GenerateObjects
|
// TODO map says const, but breaks CScriptMazeNode::GenerateObjects
|
||||||
T* operator->() { return this->current; }
|
T* operator->() { return this->current; }
|
||||||
|
@ -104,12 +101,10 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
pointer_iterator operator+(int v) const {
|
pointer_iterator operator+(int v) const {
|
||||||
pointer_iterator it = *this;
|
return pointer_iterator(current + v);
|
||||||
return it += v;
|
|
||||||
}
|
}
|
||||||
pointer_iterator operator-(int v) const {
|
pointer_iterator operator-(int v) const {
|
||||||
pointer_iterator it = *this;
|
return pointer_iterator(current - v);
|
||||||
return it -= v;
|
|
||||||
}
|
}
|
||||||
// HACK: non-const operator- is required to match vector::insert
|
// HACK: non-const operator- is required to match vector::insert
|
||||||
difference_type operator-(const pointer_iterator& other) { return this->current - other.current; }
|
difference_type operator-(const pointer_iterator& other) { return this->current - other.current; }
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
#include "rstl/iterator.hpp"
|
||||||
#include "rstl/pointer_iterator.hpp"
|
#include "rstl/pointer_iterator.hpp"
|
||||||
#include "rstl/rmemory_allocator.hpp"
|
#include "rstl/rmemory_allocator.hpp"
|
||||||
|
|
||||||
|
@ -215,17 +216,17 @@ typename vector< T, Alloc >::iterator vector< T, Alloc >::erase(iterator it) {
|
||||||
return erase(it, it + 1);
|
return erase(it, it + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO nonmatching (CCameraManager::RemoveCinemaCamera)
|
||||||
template < typename T, typename Alloc >
|
template < typename T, typename Alloc >
|
||||||
typename vector< T, Alloc >::iterator vector< T, Alloc >::erase(iterator first, iterator last) {
|
typename vector< T, Alloc >::iterator vector< T, Alloc >::erase(iterator first, iterator last) {
|
||||||
destroy(first, last);
|
destroy(first, last);
|
||||||
|
|
||||||
iterator start = begin();
|
iterator start = begin();
|
||||||
int newCount = rstl::distance(first, start);
|
int newCount = start - first;
|
||||||
|
|
||||||
iterator moved = start + newCount;
|
iterator moved = start + newCount;
|
||||||
for (iterator it = last; it != end(); ++it) {
|
for (iterator it = last; it != end(); ++moved, ++newCount, ++it) {
|
||||||
construct(&*moved, *it);
|
construct(&*moved, *it);
|
||||||
++moved;
|
|
||||||
++newCount;
|
|
||||||
}
|
}
|
||||||
x4_count = newCount;
|
x4_count = newCount;
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,28 @@
|
||||||
#include "MetroidPrime/Cameras/CCameraManager.hpp"
|
#include "MetroidPrime/Cameras/CCameraManager.hpp"
|
||||||
|
|
||||||
#include "MetroidPrime/CFluidPlaneCPU.hpp"
|
|
||||||
#include "MetroidPrime/CRumbleManager.hpp"
|
|
||||||
#include "MetroidPrime/Cameras/CBallCamera.hpp"
|
#include "MetroidPrime/Cameras/CBallCamera.hpp"
|
||||||
|
#include "MetroidPrime/ScriptObjects/CScriptCameraHint.hpp"
|
||||||
#include "MetroidPrime/Cameras/CCinematicCamera.hpp"
|
#include "MetroidPrime/Cameras/CCinematicCamera.hpp"
|
||||||
#include "MetroidPrime/Cameras/CFirstPersonCamera.hpp"
|
#include "MetroidPrime/Cameras/CFirstPersonCamera.hpp"
|
||||||
#include "MetroidPrime/Cameras/CGameCamera.hpp"
|
#include "MetroidPrime/Cameras/CGameCamera.hpp"
|
||||||
#include "MetroidPrime/Cameras/CInterpolationCamera.hpp"
|
#include "MetroidPrime/Cameras/CInterpolationCamera.hpp"
|
||||||
|
#include "MetroidPrime/CExplosion.hpp"
|
||||||
|
#include "MetroidPrime/CFluidPlaneCPU.hpp"
|
||||||
|
#include "MetroidPrime/CRumbleManager.hpp"
|
||||||
#include "MetroidPrime/Player/CPlayer.hpp"
|
#include "MetroidPrime/Player/CPlayer.hpp"
|
||||||
|
#include "MetroidPrime/Player/CPlayerGun.hpp"
|
||||||
#include "MetroidPrime/ScriptObjects/CScriptWater.hpp"
|
#include "MetroidPrime/ScriptObjects/CScriptWater.hpp"
|
||||||
|
#include "MetroidPrime/SFX/Misc.h"
|
||||||
#include "MetroidPrime/Tweaks/CTweakGame.hpp"
|
#include "MetroidPrime/Tweaks/CTweakGame.hpp"
|
||||||
#include "MetroidPrime/Tweaks/CTweakPlayer.hpp"
|
#include "MetroidPrime/Tweaks/CTweakPlayer.hpp"
|
||||||
|
#include "MetroidPrime/Weapons/CWeapon.hpp"
|
||||||
|
|
||||||
#include "Kyoto/Audio/CSfxManager.hpp"
|
#include "Kyoto/Audio/CSfxManager.hpp"
|
||||||
#include "Kyoto/Graphics/CGraphics.hpp"
|
#include "Kyoto/Graphics/CGraphics.hpp"
|
||||||
#include "Kyoto/Input/CFinalInput.hpp"
|
#include "Kyoto/Input/CFinalInput.hpp"
|
||||||
|
|
||||||
#include "rstl/algorithm.hpp"
|
#include "rstl/algorithm.hpp"
|
||||||
|
#include "rstl/math.hpp"
|
||||||
|
|
||||||
float CCameraManager::sFirstPersonFOV = 55.f;
|
float CCameraManager::sFirstPersonFOV = 55.f;
|
||||||
float CCameraManager::sThirdPersonFOV = 60.f;
|
float CCameraManager::sThirdPersonFOV = 60.f;
|
||||||
|
@ -325,3 +331,148 @@ void CCameraManager::RemoveCinemaCamera(TUniqueId uid, CStateManager& mgr) {
|
||||||
x4_cineCameras.erase(it);
|
x4_cineCameras.erase(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO nonmatching: regswap
|
||||||
|
void CCameraManager::EnterCinematic(CStateManager& mgr) {
|
||||||
|
mgr.Player()->PlayerGun()->CancelFiring(mgr);
|
||||||
|
mgr.Player()->UnFreeze(mgr);
|
||||||
|
|
||||||
|
CObjectList& objList = mgr.ObjectListById(kOL_All);
|
||||||
|
int idx = objList.GetFirstObjectIndex();
|
||||||
|
while (idx != -1) {
|
||||||
|
if (CExplosion* explosion = TCastToPtr< CExplosion >(objList[idx])) {
|
||||||
|
mgr.DeleteObjectRequest(explosion->GetUniqueId());
|
||||||
|
} else if (CWeapon* weapon = TCastToPtr< CWeapon >(objList[idx])) {
|
||||||
|
if (weapon->GetActive() &&
|
||||||
|
(weapon->GetAttribField() & kPA_KeepInCinematic) != kPA_KeepInCinematic) {
|
||||||
|
CPatterned* patterned = TCastToPtr< CPatterned >(mgr.ObjectById(weapon->GetOwnerId()));
|
||||||
|
CPlayer* player = TCastToPtr< CPlayer >(mgr.ObjectById(weapon->GetOwnerId()));
|
||||||
|
if (patterned || player) {
|
||||||
|
mgr.DeleteObjectRequest(weapon->GetUniqueId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idx = objList.GetNextObjectIndex(idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCameraManager::SkipCinematic(CStateManager& mgr) {
|
||||||
|
CCinematicCamera* ent = static_cast< CCinematicCamera* >(mgr.ObjectById(GetCurrentCameraId()));
|
||||||
|
while (ent) {
|
||||||
|
ent->SetActive(false);
|
||||||
|
ent->WasDeactivated(mgr);
|
||||||
|
ent = TCastToPtr< CCinematicCamera >(&CurrentCamera(mgr));
|
||||||
|
}
|
||||||
|
mgr.Player()->UpdateCinematicState(mgr);
|
||||||
|
x7c_fpCamera->SkipCinematic();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: nonmatching
|
||||||
|
int CCameraManager::AddCameraShaker(const CCameraShakeData& data, bool sfx) {
|
||||||
|
CCameraShakeData shakeData = data;
|
||||||
|
shakeData.SetId(++x2c_lastShakeId);
|
||||||
|
x14_shakers.push_back(shakeData);
|
||||||
|
if (xa0_24_pendingRumble != true) {
|
||||||
|
xa0_24_pendingRumble = true;
|
||||||
|
x90_rumbleCooldown = 0.5f;
|
||||||
|
}
|
||||||
|
float duration = data.GetDuration();
|
||||||
|
if (sfx && duration > 0.f) {
|
||||||
|
float component1 = data.GetSomething2();
|
||||||
|
float component2 = data.GetSomething();
|
||||||
|
if (component2 > component1) {
|
||||||
|
component1 = component2;
|
||||||
|
}
|
||||||
|
float volF = CMath::Clamp(100.f, component1 * 9.f + 100.f, 127.f);
|
||||||
|
uchar vol = static_cast< uchar >(volF);
|
||||||
|
CSfxHandle sfxHandle;
|
||||||
|
if (data.GetFlags() & 0x1) {
|
||||||
|
CVector3f pos = data.GetSfxPos();
|
||||||
|
sfxHandle =
|
||||||
|
CSfxManager::AddEmitter(SFXamb_x_rumble_lp_00, pos, CVector3f::Zero(), vol, false, false);
|
||||||
|
} else {
|
||||||
|
sfxHandle =
|
||||||
|
CSfxManager::SfxStart(SFXamb_x_rumble_lp_00, vol, 64, false, CSfxManager::kMedPriority);
|
||||||
|
}
|
||||||
|
CSfxManager::SetDuration(sfxHandle, duration);
|
||||||
|
}
|
||||||
|
return x2c_lastShakeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCameraManager::RemoveCameraShaker(int id) {
|
||||||
|
rstl::list< CCameraShakeData >::iterator it = x14_shakers.begin();
|
||||||
|
while (it != x14_shakers.end()) {
|
||||||
|
if (it->GetId() == id) {
|
||||||
|
x14_shakers.erase(it);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CTransform4f CCameraManager::GetCurrentCameraTransform(const CStateManager& mgr) const {
|
||||||
|
return GetCurrentCamera(mgr).GetTransform() * CTransform4f::Translate(x30_shakeOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
CVector3f CCameraManager::GetGlobalCameraTranslation(const CStateManager& mgr) const {
|
||||||
|
return GetCurrentCamera(mgr).GetTransform().Rotate(x30_shakeOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCameraManager::IsInCinematicCamera() const { return !x4_cineCameras.empty(); }
|
||||||
|
|
||||||
|
bool CCameraManager::IsInFirstPersonCamera() const {
|
||||||
|
return x0_curCameraId == x7c_fpCamera->GetUniqueId();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCameraManager::IsInterpolationCameraActive() const { return x88_interpCamera->GetActive(); }
|
||||||
|
|
||||||
|
bool CCameraManager::ShouldBypassInterpolationCamera() const { return false; }
|
||||||
|
|
||||||
|
void CCameraManager::SetPlayerCamera(CStateManager& mgr, TUniqueId uid) {
|
||||||
|
if (!x88_interpCamera->GetActive()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
x88_interpCamera->SetActive(false);
|
||||||
|
x80_ballCamera->SkipFovInterpolation();
|
||||||
|
if (!ShouldBypassInterpolationCamera()) {
|
||||||
|
SetCurrentCameraId(uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCameraManager::InterpolateToBallCamera(const CTransform4f& xf, TUniqueId camId,
|
||||||
|
const CVector3f& lookPos, float maxTime,
|
||||||
|
float positionSpeed, float rotationSpeed,
|
||||||
|
bool sinusoidal, CStateManager& mgr) {
|
||||||
|
if (IsInFirstPersonCamera()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
x88_interpCamera->SetInterpolation(xf, lookPos, maxTime, positionSpeed, rotationSpeed, camId,
|
||||||
|
sinusoidal, mgr);
|
||||||
|
if (!ShouldBypassInterpolationCamera()) {
|
||||||
|
SetCurrentCameraId(x88_interpCamera->GetUniqueId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCameraManager::SkipBallCameraCinematic(CStateManager& mgr) {
|
||||||
|
if (IsInCinematicCamera()) {
|
||||||
|
x80_ballCamera->TeleportCamera(GetLastCineCamera(mgr).GetTransform(), mgr);
|
||||||
|
x80_ballCamera->SetFovInterpolation(GetLastCineCamera(mgr).GetFov(), x80_ballCamera->GetFov(),
|
||||||
|
1.f, 0.f);
|
||||||
|
SkipCinematic(mgr);
|
||||||
|
SetCurrentCameraId(x80_ballCamera->GetUniqueId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCameraManager::ApplyCameraHint(const CScriptCameraHint& hint, CStateManager& mgr) {
|
||||||
|
if (x80_ballCamera->GetState() == CBallCamera::kBCS_ToBall) {
|
||||||
|
x80_ballCamera->SetState(CBallCamera::kBCS_Default);
|
||||||
|
mgr.Player()->SetCameraState(CPlayer::kCS_Ball, mgr);
|
||||||
|
}
|
||||||
|
|
||||||
|
CScriptCameraHint* oldHint = TCastToPtr<CScriptCameraHint>(mgr.ObjectById(xa6_camHintId));
|
||||||
|
xa6_camHintId = hint.GetUniqueId();
|
||||||
|
xa8_hintPriority = hint.GetPriority();
|
||||||
|
|
||||||
|
CTransform4f camXf = GetCurrentCameraTransform(mgr);
|
||||||
|
x80_ballCamera->ApplyCameraHint(mgr);
|
||||||
|
}
|
||||||
|
|
|
@ -20,14 +20,14 @@ void CScriptCameraShaker::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId ob
|
||||||
CGameArea::EOcclusionState occState =
|
CGameArea::EOcclusionState occState =
|
||||||
area.IsLoaded() ? area.GetOcclusionState() : CGameArea::kOS_Occluded;
|
area.IsLoaded() ? area.GetOcclusionState() : CGameArea::kOS_Occluded;
|
||||||
if (occState != CGameArea::kOS_Occluded) {
|
if (occState != CGameArea::kOS_Occluded) {
|
||||||
x34_shakeData.SetShakerId(stateMgr.CameraManager()->AddCameraShaker(x34_shakeData, false));
|
x34_shakeData.SetId(stateMgr.CameraManager()->AddCameraShaker(x34_shakeData, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kSM_Deactivate: {
|
case kSM_Deactivate: {
|
||||||
if (GetActive())
|
if (GetActive())
|
||||||
stateMgr.CameraManager()->RemoveCameraShaker(x34_shakeData.GetShakerId());
|
stateMgr.CameraManager()->RemoveCameraShaker(x34_shakeData.GetId());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue