Files
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

220 lines
9.0 KiB
C++

//
// camera/replay/ReplayFreeCamera.h
//
// Copyright (C) 1999-2012 Rockstar Games. All Rights Reserved.
//
#ifndef REPLAY_FREE_CAMERA_H
#define REPLAY_FREE_CAMERA_H
#include "camera/replay/ReplayBaseCamera.h"
#if GTA_REPLAY
#include "camera/helpers/Interpolator.h"
#include "camera/helpers/DampedSpring.h"
#include "scene/RegdRefTypes.h"
#include "system/control.h"
#include "physics/WorldProbe/shapetestresults.h"
class camReplayFreeCameraMetadata;
struct sReplayMarkerInfo;
namespace rage
{
class fwEntity;
}
class camReplayFreeCamera : public camReplayBaseCamera
{
DECLARE_RTTI_DERIVED_CLASS(camReplayFreeCamera, camReplayBaseCamera);
public:
template <class _T> friend class camFactoryHelper; //Allow the factory helper class to access the protected constructor.
protected:
camReplayFreeCamera(const camBaseObjectMetadata& metadata);
#if KEYBOARD_MOUSE_SUPPORT
enum eMouseInputModes
{
NO_INPUT,
ROTATION,
LOOKAT_ORBIT,
LOOKAT_OFFSET,
LOOKAT_VERTICALTRANSLATION
};
#endif
public:
void ResetForNewAttachEntity();
void ResetForNewLookAtEntity();
void BlendFromCamera(const camBaseCamera& sourceCamera, const s32 sourceMarkerIndex);
bool IsBlendingFromCamera() const;
u32 GetCameraBlendingFromNameHash() const { return m_CameraToBlendFrom ? m_CameraToBlendFrom->GetNameHash() : 0; }
float GetMaxPhaseToHaltBlendMovement() const { return m_MaxPhaseToHaltBlendMovement; }
float GetCurrentPhaseForBlend(float currentTime, bool shouldClampToMaxPhase = true) const;
bool HasFollowOrLookAtTarget() const { return (m_AttachEntity != NULL || m_LookAtEntity != NULL); }
bool IsPositionOutsidePlayerLimits(const Vector3& position) const;
bool IsBlendingPositionInvalid() const { return m_IsBlendingPositionInvalid; }
void GetMinMaxFov(float& minFov, float& maxFov) const;
void GetDefaultFov(float& defaultFov) const;
virtual bool Init(const s32 markerIndex, const bool shouldForceDefaultFrame = false);
virtual bool ShouldFallbackToGameplayCamera() const;
#if GTA_REPLAY
virtual void GetDefaultFrame(camFrame& frame) const;
#endif // GTA_REPLAY
#if __BANK
void DebugGetDesiredPosition(Vector3& desiredPosition) const { desiredPosition.Set(m_DesiredPosition); }
void DebugGetRelativeAttachHeadingPitchAndRoll(float& heading, float& pitch, float& roll) const { heading = m_AttachEntityRelativeHeading; pitch = m_AttachEntityRelativePitch; roll = m_AttachEntityRelativeRoll; }
virtual void DebugRender();
void DebugGetBlendType(char* phaseText) const;
#endif // __BANK
protected:
bool SetToSafePosition(Vector3& cameraPosition, bool shouldFlagWarning = false, bool shouldFlagBlendingWarning = false, const CEntity* entity = NULL) const;
virtual bool Update();
void UpdateAttachEntityMatrix();
bool ComputeSafePosition(const CEntity& playerPed, Vector3& cameraPosition) const;
void UpdateMaxPhaseToHaltBlend();
void ResetCamera();
void UpdateControl(const CControl& control, Vector3& desiredTranslation, Vector2& desiredLookAtOffsetTranslation, Vector3& desiredRotation, float& desiredZoom);
#if KEYBOARD_MOUSE_SUPPORT
static bool IsMouseLookInputActive(const CControl& control);
#endif
void UpdateTranslationControl(const CControl& control, Vector3& desiredTranslation, Vector2& desiredLookAtOffsetTranslation);
void ComputeTranslationInput(const CControl& control, Vector3& translationInput, Vector2& lookAtOffsetInput KEYBOARD_MOUSE_ONLY(, s32& mouseInputMode)) const;
void UpdateRotationControl(const CControl& control, Vector3& desiredRotation);
void ComputeRotationInput(const CControl& control, Vector3& rotationInput KEYBOARD_MOUSE_ONLY(, s32& mouseInputMode)) const;
void UpdateZoomControl(const CControl& control, float& desiredZoom);
void ComputeZoomInput(const CControl& control, float& zoomInput) const;
bool GetShouldResetCamera(const CControl& control) const;
void UpdateZoom(const float desiredZoom);
void UpdateRotation(const Vector3& desiredRotation, const Vector2& desiredLookAtOffsetTranslation);
void UpdatePosition(const Vector3& desiredTranslation);
bool UpdateCollisionWithAttachEntity(const CEntity& attachEntityToUse, Vector3& cameraPosition);
void UpdateCollisionOrigin(const CEntity& attachEntityToUse, float& collisionTestRadius);
void ComputeCollisionOrigin(const CEntity& attachEntityToUse, float& collisionTestRadius, Vector3& collisionOrigin) const;
void UpdateCollisionRootPosition(const CEntity& attachEntityToUse, float& collisionTestRadius);
void ComputeCollisionRootPosition(const CEntity& attachEntityToUse, const Vector3& collisionOrigin, float& collisionTestRadius, Vector3& collisionRootPosition) const;
bool UpdateCollision(const Vector3& initialPosition, Vector3& cameraPosition) const;
float ComputeFilteredHitTValue(const WorldProbe::CShapeTestFixedResults<>& shapeTestResults, bool isSphereTest) const;
void LoadEntities(const sReplayMarkerInfo& markerInfo, camFrame& frame);
virtual void PostUpdate();
void UpdateBlendPhaseConsideringWater(const Vector3& positionToApply, float& phase);
void UpdatePortalTracker();
float ComputeBoundRadius(const CEntity* entity);
void ComputeLookAtFrameWithOffset( const Vector3& lookAtPoint,
const Vector3& cameraPosition,
const Vector2& lookAtOffsetScreenSpace,
const float fov,
const float roll,
Matrix34& resultWorldMatrix);
virtual void SaveMarkerCameraInfo(sReplayMarkerInfo& markerInfo, const camFrame& camFrame) const;
virtual void LoadMarkerCameraInfo(sReplayMarkerInfo& markerInfo, camFrame& camFrame);
virtual void ValidateEntities(sReplayMarkerInfo& markerInfo);
void RenderCameraConstraintMarker(bool constrainedThisFrame );
const camReplayFreeCameraMetadata& m_Metadata;
mutable camFrame m_ResetFrame;
camDampedSpring m_CollisionTestRadiusSpring;
camDampedSpring m_RollCorrectionBlendLevelSpring;
camInterpolator m_PhaseInterpolatorIn;
camInterpolator m_PhaseInterpolatorOut;
camInterpolator m_PhaseInterpolatorInOut;
Matrix34 m_AttachEntityMatrix;
Matrix34 m_PreviousAttachEntityMatrix;
Vector3 m_CollisionOrigin;
Vector3 m_CollisionRootPosition;
Vector3 m_DesiredPosition;
Vector3 m_TranslationInputThisUpdate;
Vector2 m_LookAtOffset;
Vector2 m_CachedNormalisedHorizontalTranslationInput;
Vector2 m_CachedNormalisedHeadingPitchTranslationInput;
RegdConstCamBaseCamera m_CameraToBlendFrom;
RegdConstEnt m_AttachEntity;
RegdConstEnt m_LookAtEntity;
s32 m_LastComputedEntityForBoundRadius;
mutable s32 m_LastEditingMarkerIndex;
s32 m_BlendSourceMarkerIndex;
#if KEYBOARD_MOUSE_SUPPORT
s32 m_MouseInputMode;
#endif
u32 m_DurationOfMaxStickInputForRollCorrection;
u32 m_NumCollisionUpdatesPerformedWithAttachEntity;
u32 m_LastConstrainedTime;
u32 m_PreviousAttachTime;
float m_CachedVerticalTranslationInputSign;
float m_CachedHorizontalLookAtOffsetInputSign;
float m_CachedVerticalLookAtOffsetInputSign;
float m_CachedRollRotationInputSign;
float m_HorizontalSpeed;
float m_VerticalSpeed;
float m_HorizontalLookAtOffsetSpeed;
float m_VerticalLookAtOffsetSpeed;
float m_LookAtRoll;
float m_HeadingPitchSpeed;
float m_RollSpeed;
float m_ZoomSpeed;
float m_SmoothedWaterHeight;
float m_SmoothedWaterHeightPostUpdate;
float m_AttachEntityRelativeHeading;
float m_AttachEntityRelativePitch;
float m_AttachEntityRelativeRoll;
float m_MaxPhaseToHaltBlendMovement;
//we use this to keep track of the last blend ratio that represent a valid position for the camera.
//This will help us during transition in and out of water.
float m_LastValidPhase;
bool m_AttachEntityIsInVehicle;
bool m_BlendHalted;
bool m_IsANewMarker;
bool m_ShouldUpdateMaxPhaseToHaltBlend;
bool m_ResetForNewAttachEntityThisUpdate;
bool m_IsBlendingPositionInvalid;
private:
//Forbid copy construction and assignment.
camReplayFreeCamera(const camReplayFreeCamera& other);
camReplayFreeCamera& operator=(const camReplayFreeCamera& other);
};
//Used to disable the free camera from re-probing every frame in certain locations.
#define MAX_INTERIOR_NAME 25
struct sDisableReprobingInteriors
{
BANK_ONLY(char interiorName[MAX_INTERIOR_NAME];)
u32 interiorHash;
s32 interiorRoom;
};
//Used to disable the free camera entering certain locations with incorrect collision data.
struct sAdditionalCollisionInteriorChecks
{
BANK_ONLY(char interiorName[MAX_INTERIOR_NAME];)
u32 interiorHash;
s32 interiorRoom;
float interiorMaxZHeight;
};
//Used to disable the free camera entering certain locations with incorrect collision data.
#define MAX_MODEL_NAME 64
struct sAdditionalObjectsChecks
{
BANK_ONLY(char modelName[MAX_MODEL_NAME];)
u32 modelHash;
float zOffset;
};
#endif // GTA_REPLAY
#endif // REPLAY_FREE_CAMERA_H