Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
CharacterCamera1stPersonVehicle.c
Go to the documentation of this file.
1
2// *************************************************************************************
3// ! CharacterCamera1stPersonVehicle - 1st person camera when character is in vehicle
4// *************************************************************************************
5//---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
7{
8 IEntity m_OwnerVehicle;
9 protected float m_fAngleFirstPerson;
10 protected float m_fAngleFirstPersonScale;
11
12 //-----------------------------------------------------------------------------
14 {
15 m_ApplyHeadBob = false;
16 }
17
18 //-----------------------------------------------------------------------------
19 override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
20 {
21 super.OnActivate(pPrevCamera, pPrevCameraResult);
22
23 if (m_pCompartmentAccess)
24 {
25 BaseCompartmentSlot compartment = m_pCompartmentAccess.GetCompartment();
26 if (compartment)
27 {
28 m_OwnerVehicle = compartment.GetOwner();
29
31 {
32 SCR_VehicleCameraDataComponent vehicleCamDataComp = SCR_VehicleCameraDataComponent.Cast(m_OwnerVehicle.FindComponent(SCR_VehicleCameraDataComponent));
33 if (vehicleCamDataComp)
34 {
35 SCR_VehicleCameraDataComponentClass vehicleCamData = SCR_VehicleCameraDataComponentClass.Cast(vehicleCamDataComp.GetComponentData(m_OwnerVehicle));
36 if (vehicleCamData)
37 {
38 m_fRollFactor = vehicleCamData.m_fRollFactor;
39 m_fPitchFactor = vehicleCamData.m_fPitchFactor;
40 m_fAngleFirstPerson = vehicleCamData.m_fAngleFirstPerson * Math.DEG2RAD;
41 }
42 }
43
44 if (m_ControllerComponent && m_ControllerComponent.IsGadgetInHands())
46 else
48 }
49 }
50 }
51
52 CharacterCamera3rdPersonVehicle characterCamera3rdPersonVehicle = CharacterCamera3rdPersonVehicle.Cast(pPrevCamera);
53 if (characterCamera3rdPersonVehicle)
54 {
55 m_fRollSmooth = characterCamera3rdPersonVehicle.m_fRollSmooth;
56 m_fRollSmoothVel = characterCamera3rdPersonVehicle.m_fRollSmoothVel;
57 m_fPitchSmooth = characterCamera3rdPersonVehicle.m_fPitchSmooth;
58 m_fPitchSmoothVel = characterCamera3rdPersonVehicle.m_fPitchSmoothVel;
59
60 if (m_OwnerVehicle && m_OwnerCharacter)
61 {
62 // Offset rotation of 3rd person camera if player is sitting sideways in vehicle
63 float thirdPersonCameraOffset = (m_OwnerVehicle.GetYawPitchRoll()[0] - m_OwnerCharacter.GetYawPitchRoll()[0]) * Math.DEG2RAD;
64
65 if (!float.AlmostEqual(thirdPersonCameraOffset, 0))
66 {
67 vector angles = m_Input.GetLookAtAngles();
68 angles[0] = angles[0] - thirdPersonCameraOffset;
69 m_Input.SetLookAtAngles(angles);
70 }
71 }
72 }
73
74 m_bCameraTransition = false;
75 }
76
77 //-----------------------------------------------------------------------------
78
79 override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
80 {
81 if (!m_bCameraTransition)
82 {
83 m_UseLookPositionOverrideLS = true;
84
85 // Prevent camera from moving behind the character as it orbits around the head.
86 float yawOffset = -0.5 * m_CharacterHeadAimingComponent.GetLookAngles()[0];
87 vector additiveYaw = { yawOffset, 0.0, 0.0 };
88
89 // Camera moves forward as the player looks sideways (providing better view off the shoulders when pitching down).
90 const float OneBy90 = 1.0 / 90.0;
91 float t = Math.Clamp(Math.AbsFloat(additiveYaw[0] * OneBy90), 0.0, 1.0);
92 float yOffset = 0.03 * t;
93 float zOffset = -0.07 - 0.13 * t;
94 vector offsetLS = { m_OffsetLS[0], m_OffsetLS[1] + yOffset, zOffset };
95
96 vector resultTM[4];
97 m_CharacterHeadAimingComponent.GetLookTransformationLS(GetCameraBoneIndex(), EDirectBoneMode.RelativePosition, offsetLS, additiveYaw, resultTM);
98 m_LookPositionOverrideLS = resultTM[3];
99
100 m_CharacterHeadAimingComponent.SetPitchLimitReductionMultiplier(0.5); // Less aggressive pitch reduction.
101 }
102
103 super.OnUpdate(pDt, pOutResult);
104 pOutResult.m_fUseHeading = 0.0;
105 AddVehiclePitchRoll(m_OwnerVehicle, pDt, pOutResult.m_CameraTM);
106
107 // Specific case for character lying down, where assumption for world-up fails
108 // If we want to allow such cases on a 'daily basis', reconsider how seating
109 // and vehicle cameras work in first person :)
110 if (sm_TagLyingCamera != -1 && sm_TagItemUpdateCols != -1)
111 {
112 CharacterAnimationComponent characterAnimationComponent = m_OwnerCharacter.GetAnimationComponent();
113 if (characterAnimationComponent && characterAnimationComponent.IsPrimaryTag(sm_TagLyingCamera))
114 {
115 // The character has very odd orientation in this case, the entity transformation retains its world up relation,
116 // but the character body is not lying flat, just chilling, so let's deploy some quick magic here:
117 pOutResult.m_vBaseAngles = m_CharacterHeadAimingComponent.GetAimingRotation();
118 pOutResult.m_fUseHeading = 0.0;
119 pOutResult.m_iDirectBoneMode = EDirectBoneMode.RelativePosition;
120 pOutResult.m_iDirectBone = GetCameraBoneIndex();
121 pOutResult.m_bAllowInterpolation = true;
122
123 vector additiveRotation = "0 0 0";
124 vector offset = m_OffsetLS;
125 m_CharacterHeadAimingComponent.GetLookTransformationLS(pOutResult.m_iDirectBone, pOutResult.m_iDirectBoneMode, offset, additiveRotation, pOutResult.m_CameraTM);
126 if( m_ApplyHeadBob )
127 m_CharacterCameraHandler.AddViewBobToTransform(pOutResult.m_CameraTM, 1, false);
128
129 vector rotMat[3];
130 if (!characterAnimationComponent.IsPrimaryTag(sm_TagItemUpdateCols))
131 Math3D.AnglesToMatrix(Vector(0, 90, 0), rotMat); // Already laying
132 else
133 {
134 vector camMatrix[4]; // Entering, exiting
135 m_OwnerCharacter.GetAnimation().GetBoneMatrix(m_OwnerCharacter.GetAnimation().GetBoneIndex("Head"), camMatrix);
136 vector camAngles = Math3D.MatrixToAngles(camMatrix);
137 Math3D.AnglesToMatrix(Vector(0, -camAngles[1], 0), rotMat);
138 }
139
140 //Math3D.AnglesToMatrix(Vector(0, -camAngles[1], 0), rotMat);
141 Math3D.MatrixMultiply3(rotMat, pOutResult.m_CameraTM, pOutResult.m_CameraTM);
142 return;
143 }
144 }
145
146 // Rotate camera if not having gadget in hands
147 if (float.AlmostEqual(m_fAngleFirstPerson, 0))
148 return;
149
150 // First person camera angle offset only for pilot
151 Vehicle vehicle = Vehicle.Cast(m_OwnerVehicle);
152 if (!vehicle || vehicle.GetPilot() != m_OwnerCharacter)
153 return;
154
155 if (m_ControllerComponent && m_ControllerComponent.IsGadgetInHands())
156 m_fAngleFirstPersonScale -= pDt * 3;
157 else
158 m_fAngleFirstPersonScale += pDt * 3;
159
161
162 SCR_Math3D.RotateAround(pOutResult.m_CameraTM, pOutResult.m_CameraTM[3], pOutResult.m_CameraTM[0], m_fAngleFirstPerson * m_fAngleFirstPersonScale, pOutResult.m_CameraTM);
163 }
164
165 //-----------------------------------------------------------------------------
166 override void OnAfterCameraUpdate(float pDt, bool pIsKeyframe, inout vector transformMS[4])
167 {
168 }
169
170 //-----------------------------------------------------------------------------
171 override float GetBaseFOV()
172 {
173 CameraManager cameraManager = GetGame().GetCameraManager();
174 if (!cameraManager)
175 return 0;
176
177 return cameraManager.GetVehicleFOV();
178 }
179};
180// *************************************************************************************
181// ! CharacterCamera1stPersonVehicleTransition - 1st person camera when character is getting in/out vehicle
182// ************************************************************************************
183class CharacterCamera1stPersonVehicleTransition extends CharacterCamera1stPersonVehicle
184{
185 protected bool m_isExiting = false;
186
187 //-----------------------------------------------------------------------------
188 override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
189 {
190 super.OnActivate(pPrevCamera, pPrevCameraResult);
191 m_bCameraTransition = true;
192 m_isExiting = false;
193 }
194
195 override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
196 {
197 super.OnUpdate(pDt, pOutResult);
198 if (m_pCompartmentAccess)
199 {
200 if (m_pCompartmentAccess.IsGettingOut())
201 m_isExiting = true;
202
203 if (!m_pCompartmentAccess.IsInCompartment() && m_isExiting)
204 {
205 pOutResult.m_bAllowInterpolation = false;
206 pOutResult.m_fUseHeading = 1.0;
207 }
208 }
209 }
210}
211//---- REFACTOR NOTE END ----
ArmaReforgerScripted GetGame()
Definition game.c:1398
ref array< string > angles
CharacterInputContext m_Input
EDirectBoneMode
enum EVehicleType IEntity
override void OnAfterCameraUpdate(float pDt, bool pIsKeyframe, inout vector transformMS[4])
override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
void CharacterCamera1stPersonVehicle(CameraHandlerComponent pCameraHandler)
override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
Definition Math.c:13
Contains various scripted 3D math functions.
Definition SCR_Math3D.c:3
enum EPhysicsLayerPresets Vehicle
Definition gameLib.c:24
proto native vector Vector(float x, float y, float z)