mirror of
https://github.com/GTAmodding/re3.git
synced 2021-02-19 17:49:54 +01:00
470 lines
14 KiB
C++
470 lines
14 KiB
C++
#pragma once
|
|
|
|
#include "Placeable.h"
|
|
|
|
class CEntity;
|
|
class CPed;
|
|
class CAutomobile;
|
|
|
|
#define NUMBER_OF_VECTORS_FOR_AVERAGE 2
|
|
|
|
struct CCam
|
|
{
|
|
enum CamMode
|
|
{
|
|
MODE_TOPDOWN1 = 1,
|
|
MODE_TOPDOWN2,
|
|
MODE_BEHINDCAR,
|
|
MODE_FOLLOWPED,
|
|
MODE_AIMING,
|
|
MODE_DEBUG,
|
|
MODE_SNIPER,
|
|
MODE_ROCKET,
|
|
MODE_MODELVIEW,
|
|
MODE_BILL,
|
|
MODE_SYPHON,
|
|
MODE_CIRCLE,
|
|
MODE_CHEESYZOOM,
|
|
MODE_WHEELCAM,
|
|
MODE_FIXED,
|
|
MODE_FIRSTPERSON,
|
|
MODE_FLYBY,
|
|
MODE_CAMONASTRING,
|
|
MODE_REACTIONCAM,
|
|
MODE_FOLLOWPEDWITHBINDING,
|
|
MODE_CHRISWITHBINDINGPLUSROTATION,
|
|
MODE_BEHINDBOAT,
|
|
MODE_PLAYERFALLENWATER,
|
|
MODE_CAMONTRAINROOF,
|
|
MODE_CAMRUNNINGSIDETRAIN,
|
|
MODE_BLOODONTHETRACKS,
|
|
MODE_IMTHEPASSENGERWOOWOO,
|
|
MODE_SYPHONCRIMINFRONT,
|
|
MODE_PEDSDEADBABY,
|
|
MODE_CUSHYPILLOWSARSE,
|
|
MODE_LOOKATCARS,
|
|
MODE_ARRESTCAMONE,
|
|
MODE_ARRESTCAMTWO,
|
|
MODE_M16FIRSTPERSON_34,
|
|
MODE_SPECIALFIXEDFORSYPHON,
|
|
MODE_FIGHT,
|
|
MODE_TOPDOWNPED,
|
|
MODE_SNIPER_RUN_AROUND,
|
|
MODE_ROCKET_RUN_AROUND,
|
|
MODE_FIRSTPERSONPEDONPC_40,
|
|
MODE_FIRSTPERSONPEDONPC_41,
|
|
MODE_FIRSTPERSONPEDONPC_42,
|
|
MODE_EDITOR,
|
|
MODE_M16FIRSTPERSON_44
|
|
};
|
|
|
|
bool bBelowMinDist; //used for follow ped mode
|
|
bool bBehindPlayerDesired; //used for follow ped mode
|
|
bool m_bCamLookingAtVector;
|
|
bool m_bCollisionChecksOn;
|
|
bool m_bFixingBeta; //used for camera on a string
|
|
bool m_bTheHeightFixerVehicleIsATrain;
|
|
bool LookBehindCamWasInFront;
|
|
bool LookingBehind;
|
|
bool LookingLeft; // 32
|
|
bool LookingRight;
|
|
bool ResetStatics; //for interpolation type stuff to work
|
|
bool Rotating;
|
|
|
|
int16 Mode; // CameraMode
|
|
uint32 m_uiFinishTime; // 52
|
|
|
|
int m_iDoCollisionChecksOnFrameNum;
|
|
int m_iDoCollisionCheckEveryNumOfFrames;
|
|
int m_iFrameNumWereAt; // 64
|
|
int m_iRunningVectorArrayPos;
|
|
int m_iRunningVectorCounter;
|
|
int DirectionWasLooking;
|
|
|
|
float f_max_role_angle; //=DEGTORAD(5.0f);
|
|
float f_Roll; //used for adding a slight roll to the camera in the
|
|
float f_rollSpeed;
|
|
float m_fSyphonModeTargetZOffSet;
|
|
float m_fUnknownZOffSet;
|
|
float m_fAmountFractionObscured;
|
|
float m_fAlphaSpeedOverOneFrame; // 100
|
|
float m_fBetaSpeedOverOneFrame;
|
|
float m_fBufferedTargetBeta;
|
|
float m_fBufferedTargetOrientation;
|
|
float m_fBufferedTargetOrientationSpeed;
|
|
float m_fCamBufferedHeight;
|
|
float m_fCamBufferedHeightSpeed;
|
|
float m_fCloseInPedHeightOffset;
|
|
float m_fCloseInPedHeightOffsetSpeed; // 132
|
|
float m_fCloseInCarHeightOffset;
|
|
float m_fCloseInCarHeightOffsetSpeed;
|
|
float m_fDimensionOfHighestNearCar;
|
|
float m_fDistanceBeforeChanges;
|
|
float m_fFovSpeedOverOneFrame;
|
|
float m_fMinDistAwayFromCamWhenInterPolating;
|
|
float m_fPedBetweenCameraHeightOffset;
|
|
float m_fPlayerInFrontSyphonAngleOffSet; // 164
|
|
float m_fRadiusForDead;
|
|
float m_fRealGroundDist; //used for follow ped mode
|
|
float m_fTargetBeta;
|
|
float m_fTimeElapsedFloat;
|
|
|
|
float m_fTransitionBeta;
|
|
float m_fTrueBeta;
|
|
float m_fTrueAlpha; // 200
|
|
float m_fInitialPlayerOrientation; //used for first person
|
|
|
|
float Alpha;
|
|
float AlphaSpeed;
|
|
float FOV;
|
|
float FOVSpeed;
|
|
float Beta;
|
|
float BetaSpeed;
|
|
float Distance; // 232
|
|
float DistanceSpeed;
|
|
float CA_MIN_DISTANCE;
|
|
float CA_MAX_DISTANCE;
|
|
float SpeedVar;
|
|
|
|
// ped onfoot zoom distance
|
|
float m_fTargetZoomGroundOne;
|
|
float m_fTargetZoomGroundTwo; // 256
|
|
float m_fTargetZoomGroundThree;
|
|
// ped onfoot alpha angle offset
|
|
float m_fTargetZoomOneZExtra;
|
|
float m_fTargetZoomTwoZExtra;
|
|
float m_fTargetZoomThreeZExtra;
|
|
|
|
float m_fTargetZoomZCloseIn;
|
|
float m_fMinRealGroundDist;
|
|
float m_fTargetCloseInDist;
|
|
|
|
CVector m_cvecTargetCoorsForFudgeInter; // 360
|
|
CVector m_cvecCamFixedModeVector; // 372
|
|
CVector m_cvecCamFixedModeSource; // 384
|
|
CVector m_cvecCamFixedModeUpOffSet; // 396
|
|
CVector m_vecLastAboveWaterCamPosition; //408 //helper for when the player has gone under the water
|
|
CVector m_vecBufferedPlayerBodyOffset; // 420
|
|
|
|
// The three vectors that determine this camera for this frame
|
|
CVector Front; // 432 // Direction of looking in
|
|
CVector Source; // Coors in world space
|
|
CVector SourceBeforeLookBehind;
|
|
CVector Up; // Just that
|
|
CVector m_arrPreviousVectors[NUMBER_OF_VECTORS_FOR_AVERAGE]; // used to average stuff
|
|
CEntity *CamTargetEntity;
|
|
|
|
float m_fCameraDistance;
|
|
float m_fIdealAlpha;
|
|
float m_fPlayerVelocity;
|
|
CAutomobile *m_pLastCarEntered; // So interpolation works
|
|
CPed *m_pLastPedLookedAt;// So interpolation works
|
|
bool m_bFirstPersonRunAboutActive;
|
|
|
|
|
|
void GetVectorsReadyForRW(void);
|
|
CVector DoAverageOnVector(const CVector &vec);
|
|
float GetPedBetaAngleForClearView(const CVector &Target, float Dist, float BetaOffset, bool checkBuildings, bool checkVehicles, bool checkPeds, bool checkObjects, bool checkDummies);
|
|
void WorkOutCamHeightWeeCar(CVector &TargetCoors, float TargetOrientation);
|
|
void WorkOutCamHeight(const CVector &TargetCoors, float TargetOrientation, float TargetHeight);
|
|
bool RotCamIfInFrontCar(CVector &TargetCoors, float TargetOrientation);
|
|
bool FixCamIfObscured(CVector &TargetCoors, float TargetHeight, float TargetOrientation);
|
|
void Cam_On_A_String_Unobscured(const CVector &TargetCoors, float BaseDist);
|
|
void FixCamWhenObscuredByVehicle(const CVector &TargetCoors);
|
|
|
|
void Process_Debug(float *vec, float a, float b, float c);
|
|
void Process_FollowPed(const CVector &CameraTarget, float TargetOrientation, float, float);
|
|
void Process_BehindCar(const CVector &CameraTarget, float TargetOrientation, float, float);
|
|
void Process_Cam_On_A_String(const CVector &CameraTarget, float TargetOrientation, float, float);
|
|
};
|
|
static_assert(sizeof(CCam) == 0x1A4, "CCam: wrong size");
|
|
static_assert(offsetof(CCam, Alpha) == 0xA8, "CCam: error");
|
|
static_assert(offsetof(CCam, Front) == 0x140, "CCam: error");
|
|
|
|
struct CCamPathSplines
|
|
{
|
|
float m_arr_PathData[800];
|
|
};
|
|
|
|
struct CTrainCamNode
|
|
{
|
|
CVector m_cvecCamPosition;
|
|
CVector m_cvecPointToLookAt;
|
|
CVector m_cvecMinPointInRange;
|
|
CVector m_cvecMaxPointInRange;
|
|
float m_fDesiredFOV;
|
|
float m_fNearClip;
|
|
};
|
|
|
|
struct CQueuedMode
|
|
{
|
|
int16 Mode;
|
|
float Duration;
|
|
int16 MinZoom;
|
|
int16 MaxZoom;
|
|
};
|
|
|
|
enum
|
|
{
|
|
LOOKING_BEHIND,
|
|
LOOKING_LEFT,
|
|
LOOKING_RIGHT,
|
|
LOOKING_FORWARD,
|
|
};
|
|
|
|
enum
|
|
{
|
|
// TODO: figure out
|
|
FADE_0,
|
|
FADE_1, // mid fade
|
|
FADE_2,
|
|
|
|
FADE_OUT,
|
|
FADE_IN,
|
|
};
|
|
|
|
enum
|
|
{
|
|
MBLUR_NONE,
|
|
MBLUR_SNIPER,
|
|
MBLUR_NORMAL,
|
|
MBLUR_INTRO1, // green camera
|
|
MBLUR_INTRO2, // unused
|
|
MBLUR_INTRO3, // bank scene
|
|
MBLUR_INTRO4, // jail break scene
|
|
MBLUR_INTRO5, // explosion
|
|
MBLUR_INTRO6, // player shot
|
|
MBLUR_UNUSED, // pinkish
|
|
};
|
|
|
|
struct CCamera : public CPlaceable
|
|
{
|
|
bool m_bAboveGroundTrainNodesLoaded;
|
|
bool m_bBelowGroundTrainNodesLoaded;
|
|
bool m_bCamDirectlyBehind;
|
|
bool m_bCamDirectlyInFront;
|
|
bool m_bCameraJustRestored;
|
|
bool m_bcutsceneFinished;
|
|
bool m_bCullZoneChecksOn;
|
|
bool m_bFirstPersonBeingUsed;
|
|
bool m_bJustJumpedOutOf1stPersonBecauseOfTarget;
|
|
bool m_bIdleOn;
|
|
bool m_bInATunnelAndABigVehicle;
|
|
bool m_bInitialNodeFound;
|
|
bool m_bInitialNoNodeStaticsSet;
|
|
bool m_bIgnoreFadingStuffForMusic;
|
|
bool m_bPlayerIsInGarage;
|
|
bool m_bJustCameOutOfGarage;
|
|
bool m_bJustInitalised;
|
|
bool m_bJust_Switched;
|
|
bool m_bLookingAtPlayer;
|
|
bool m_bLookingAtVector;
|
|
bool m_bMoveCamToAvoidGeom;
|
|
bool m_bObbeCinematicPedCamOn;
|
|
bool m_bObbeCinematicCarCamOn;
|
|
bool m_bRestoreByJumpCut;
|
|
bool m_bUseNearClipScript;
|
|
bool m_bStartInterScript;
|
|
bool m_bStartingSpline;
|
|
bool m_bTargetJustBeenOnTrain;
|
|
bool m_bTargetJustCameOffTrain;
|
|
bool m_bUseSpecialFovTrain;
|
|
bool m_bUseTransitionBeta;
|
|
bool m_bUseScriptZoomValuePed;
|
|
bool m_bUseScriptZoomValueCar;
|
|
bool m_bWaitForInterpolToFinish;
|
|
bool m_bItsOkToLookJustAtThePlayer;
|
|
bool m_bWantsToSwitchWidescreenOff;
|
|
bool m_WideScreenOn;
|
|
bool m_1rstPersonRunCloseToAWall;
|
|
bool m_bHeadBob;
|
|
bool m_bFailedCullZoneTestPreviously;
|
|
|
|
bool m_FadeTargetIsSplashScreen;
|
|
|
|
bool WorldViewerBeingUsed;
|
|
uint8 ActiveCam;
|
|
uint32 m_uiCamShakeStart;
|
|
uint32 m_uiFirstPersonCamLastInputTime;
|
|
// where are those?
|
|
//bool m_bVehicleSuspenHigh;
|
|
//bool m_bEnable1rstPersonCamCntrlsScript;
|
|
//bool m_bAllow1rstPersonWeaponsCamera;
|
|
|
|
uint32 m_uiLongestTimeInMill;
|
|
uint32 m_uiNumberOfTrainCamNodes;
|
|
uint8 m_uiTransitionJUSTStarted;
|
|
uint8 m_uiTransitionState; // 0:one mode 1:transition
|
|
|
|
uint32 m_uiTimeLastChange;
|
|
uint32 m_uiTimeWeEnteredIdle;
|
|
uint32 m_uiTimeTransitionStart;
|
|
uint32 m_uiTransitionDuration;
|
|
int m_BlurBlue;
|
|
int m_BlurGreen;
|
|
int m_BlurRed;
|
|
int m_BlurType;
|
|
|
|
uint32 unknown;
|
|
int m_iWorkOutSpeedThisNumFrames;
|
|
int m_iNumFramesSoFar;
|
|
|
|
|
|
int m_iCurrentTrainCamNode;
|
|
int m_motionBlur;
|
|
int m_imotionBlurAddAlpha;
|
|
int m_iCheckCullZoneThisNumFrames;
|
|
int m_iZoneCullFrameNumWereAt;
|
|
int WhoIsInControlOfTheCamera;
|
|
|
|
float CamFrontXNorm;
|
|
float CamFrontYNorm;
|
|
float CarZoomIndicator;
|
|
float CarZoomValue;
|
|
float CarZoomValueSmooth;
|
|
|
|
float DistanceToWater;
|
|
float FOVDuringInter;
|
|
float LODDistMultiplier;
|
|
float GenerationDistMultiplier;
|
|
float m_fAlphaSpeedAtStartInter;
|
|
float m_fAlphaWhenInterPol;
|
|
float m_fAlphaDuringInterPol;
|
|
float m_fBetaDuringInterPol;
|
|
float m_fBetaSpeedAtStartInter;
|
|
float m_fBetaWhenInterPol;
|
|
float m_fFOVWhenInterPol;
|
|
float m_fFOVSpeedAtStartInter;
|
|
float m_fStartingBetaForInterPol;
|
|
float m_fStartingAlphaForInterPol;
|
|
float m_PedOrientForBehindOrInFront;
|
|
float m_CameraAverageSpeed;
|
|
float m_CameraSpeedSoFar;
|
|
float m_fCamShakeForce;
|
|
float m_fCarZoomValueScript;
|
|
float m_fFovForTrain;
|
|
float m_fFOV_Wide_Screen;
|
|
float m_fNearClipScript;
|
|
float m_fOldBetaDiff;
|
|
float m_fPedZoomValue;
|
|
|
|
float m_fPedZoomValueScript;
|
|
float m_fPedZoomValueSmooth;
|
|
float m_fPositionAlongSpline;
|
|
float m_ScreenReductionPercentage;
|
|
float m_ScreenReductionSpeed;
|
|
float m_AlphaForPlayerAnim1rstPerson;
|
|
float Orientation;
|
|
float PedZoomIndicator;
|
|
float PlayerExhaustion;
|
|
float SoundDistUp, SoundDistLeft, SoundDistRight;
|
|
float SoundDistUpAsRead, SoundDistLeftAsRead, SoundDistRightAsRead;
|
|
float SoundDistUpAsReadOld, SoundDistLeftAsReadOld, SoundDistRightAsReadOld;
|
|
float m_fWideScreenReductionAmount;
|
|
float m_fStartingFOVForInterPol;
|
|
|
|
// not static yet
|
|
float m_fMouseAccelHorzntl;// acceleration multiplier for 1st person controls
|
|
float m_fMouseAccelVertical;// acceleration multiplier for 1st person controls
|
|
float m_f3rdPersonCHairMultX;
|
|
float m_f3rdPersonCHairMultY;
|
|
|
|
|
|
CCam Cams[3];
|
|
void *pToGarageWeAreIn;
|
|
void *pToGarageWeAreInForHackAvoidFirstPerson;
|
|
CQueuedMode m_PlayerMode;
|
|
CQueuedMode PlayerWeaponMode;
|
|
CVector m_PreviousCameraPosition;
|
|
CVector m_RealPreviousCameraPosition;
|
|
CVector m_cvecAimingTargetCoors;
|
|
CVector m_vecFixedModeVector;
|
|
|
|
// one of those has to go
|
|
CVector m_vecFixedModeSource;
|
|
CVector m_vecFixedModeUpOffSet;
|
|
// CVector m_vecCutSceneOffset;
|
|
CVector m_cvecStartingSourceForInterPol;
|
|
CVector m_cvecStartingTargetForInterPol;
|
|
CVector m_cvecStartingUpForInterPol;
|
|
CVector m_cvecSourceSpeedAtStartInter;
|
|
CVector m_cvecTargetSpeedAtStartInter;
|
|
CVector m_cvecUpSpeedAtStartInter;
|
|
CVector m_vecSourceWhenInterPol;
|
|
CVector m_vecTargetWhenInterPol;
|
|
CVector m_vecUpWhenInterPol;
|
|
CVector m_vecClearGeometryVec;
|
|
|
|
CVector m_vecGameCamPos;
|
|
CVector SourceDuringInter;
|
|
CVector TargetDuringInter;
|
|
CVector UpDuringInter;
|
|
RwCamera *m_pRwCamera;
|
|
CEntity *pTargetEntity;
|
|
CCamPathSplines m_arrPathArray[4];
|
|
CTrainCamNode m_arrTrainCamNode[800];
|
|
CMatrix m_cameraMatrix;
|
|
bool m_bGarageFixedCamPositionSet;
|
|
bool m_vecDoingSpecialInterPolation;
|
|
bool m_bScriptParametersSetForInterPol;
|
|
bool m_bFading;
|
|
bool m_bMusicFading;
|
|
CMatrix m_viewMatrix;
|
|
CVector m_vecFrustumNormals[4];
|
|
CVector m_vecOldSourceForInter;
|
|
CVector m_vecOldFrontForInter;
|
|
CVector m_vecOldUpForInter;
|
|
|
|
float m_vecOldFOVForInter;
|
|
float m_fFLOATingFade;
|
|
float m_fFLOATingFadeMusic;
|
|
float m_fTimeToFadeOut;
|
|
float m_fTimeToFadeMusic;
|
|
float m_fFractionInterToStopMovingTarget;
|
|
float m_fFractionInterToStopCatchUpTarget;
|
|
float m_fGaitSwayBuffer;
|
|
float m_fScriptPercentageInterToStopMoving;
|
|
float m_fScriptPercentageInterToCatchUp;
|
|
|
|
uint32 m_fScriptTimeForInterPolation;
|
|
|
|
|
|
int16 m_iFadingDirection;
|
|
int m_iModeObbeCamIsInForCar;
|
|
int16 m_iModeToGoTo;
|
|
int16 m_iMusicFadingDirection;
|
|
int16 m_iTypeOfSwitch;
|
|
|
|
uint32 m_uiFadeTimeStarted;
|
|
uint32 m_uiFadeTimeStartedMusic;
|
|
|
|
|
|
CMatrix &GetCameraMatrix(void) { return m_cameraMatrix; }
|
|
CVector &GetGameCamPosition(void) { return m_vecGameCamPos; }
|
|
bool IsPointVisible(const CVector ¢er, const CMatrix *mat);
|
|
bool IsSphereVisible(const CVector ¢er, float radius, const CMatrix *mat);
|
|
bool IsBoxVisible(RwV3d *box, const CMatrix *mat);
|
|
int GetLookDirection(void);
|
|
|
|
void Fade(float timeout, int16 direction);
|
|
int GetScreenFadeStatus(void);
|
|
void ProcessFade(void);
|
|
void ProcessMusicFade(void);
|
|
void SetFadeColour(uint8 r, uint8 g, uint8 b);
|
|
|
|
void SetMotionBlur(int r, int g, int b, int a, int type);
|
|
void SetMotionBlurAlpha(int a);
|
|
void RenderMotionBlur(void);
|
|
|
|
void DrawBordersForWideScreen(void);
|
|
};
|
|
static_assert(offsetof(CCamera, m_WideScreenOn) == 0x70, "CCamera: error");
|
|
static_assert(offsetof(CCamera, WorldViewerBeingUsed) == 0x75, "CCamera: error");
|
|
static_assert(offsetof(CCamera, m_uiNumberOfTrainCamNodes) == 0x84, "CCamera: error");
|
|
static_assert(offsetof(CCamera, m_uiTransitionState) == 0x89, "CCamera: error");
|
|
static_assert(offsetof(CCamera, m_uiTimeTransitionStart) == 0x94, "CCamera: error");
|
|
static_assert(offsetof(CCamera, m_BlurBlue) == 0x9C, "CCamera: error");
|
|
static_assert(offsetof(CCamera, Cams) == 0x1A4, "CCamera: error");
|
|
static_assert(sizeof(CCamera) == 0xE9D8, "CCamera: wrong size");
|
|
extern CCamera &TheCamera;
|