summaryrefslogtreecommitdiffstats
path: root/src/core/Camera.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/Camera.h')
-rw-r--r--src/core/Camera.h476
1 files changed, 476 insertions, 0 deletions
diff --git a/src/core/Camera.h b/src/core/Camera.h
new file mode 100644
index 00000000..84c3060b
--- /dev/null
+++ b/src/core/Camera.h
@@ -0,0 +1,476 @@
+#pragma once
+#include "Placeable.h"
+
+class CEntity;
+class CPed;
+class CAutomobile;
+
+#define NUMBER_OF_VECTORS_FOR_AVERAGE 2
+
+struct CCam
+{
+ enum
+ {
+ 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);
+ bool Using3rdPersonMouseCam();
+ bool GetWeaponFirstPersonOn();
+
+ 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 = 0,
+ 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;
+
+ static bool &m_bUseMouse3rdPerson;
+
+ CMatrix &GetCameraMatrix(void) { return m_cameraMatrix; }
+ CVector &GetGameCamPosition(void) { return m_vecGameCamPos; }
+ bool IsPointVisible(const CVector &center, const CMatrix *mat);
+ bool IsSphereVisible(const CVector &center, 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 CalculateDerivedValues(void);
+
+ void DrawBordersForWideScreen(void);
+ void Restore(void);
+ void SetWidescreenOff(void);
+
+ void dtor(void) { this->CCamera::~CCamera(); }
+};
+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;