Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
CharacterCamera1stPersonTurret.c
Go to the documentation of this file.
1// *************************************************************************************
2// ! CharacterCamera1stPersonVehicle - 1st person camera when character is in vehicle
3// *************************************************************************************
4//---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
5class CharacterCamera1stPersonTurret extends CharacterCamera1stPerson
6{
7
13 protected float m_fLRAngleAdd;
16
17 protected vector m_vLastCameraAngles; //< Does not update in freelook
18
19 //-----------------------------------------------------------------------------
21 {
22 m_ApplyHeadBob = false;
23 m_vPrevEyePosition = m_OwnerCharacter.EyePositionModel();
24 m_OffsetLS = "0.0 0.1 0.0";
25 m_bLRAngleNoLimit = true;
26 }
27
28 //-----------------------------------------------------------------------------
29 override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
30 {
31 super.OnActivate(pPrevCamera, pPrevCameraResult);
32
33 if (m_pCompartmentAccess && m_pCompartmentAccess.IsInCompartment())
34 {
35 BaseCompartmentSlot compartment = m_pCompartmentAccess.GetCompartment();
36 if (compartment)
37 {
38 m_OwnerVehicle = compartment.GetVehicle();
39
40 SCR_VehicleCameraDataComponent vehicleCamDataComp = SCR_VehicleCameraDataComponent.Cast(m_OwnerVehicle.FindComponent(SCR_VehicleCameraDataComponent));
41 if (vehicleCamDataComp)
42 {
43 SCR_VehicleCameraDataComponentClass vehicleCamData = SCR_VehicleCameraDataComponentClass.Cast(vehicleCamDataComp.GetComponentData(m_OwnerVehicle));
44 if (vehicleCamData)
45 {
46 m_fRollFactor = vehicleCamData.m_fRollFactor;
47 m_fPitchFactor = vehicleCamData.m_fPitchFactor;
48 }
49 }
50
51 m_pTurretController = TurretControllerComponent.Cast(compartment.GetController());
53 return;
54
55 // If we'll have multiple turrets, don't cache turret
56 m_pControlledTurret = m_pTurretController.GetTurretComponent();
58 return;
59
61 m_pCompartment = TurretCompartmentSlot.Cast(compartment);
62 }
63 }
64
65 m_fLRAngleAdd = 0;
66
67 m_CharacterHeadAimingComponent.SetPitchLimitReductionMultiplier(1.25); // Pitch reduction to avoid neckhole
68 }
69
70 //-----------------------------------------------------------------------------
71 override void OnDeactivate(ScriptedCameraItem pNextCamera)
72 {
73 if (m_CharacterHeadAimingComponent)
74 m_CharacterHeadAimingComponent.ResetLimitAnglesOverride();
75 }
76
77 //-----------------------------------------------------------------------------
78 static float UpdateAngleWithTarget(out float pAngle, out float pAngleAdd, out float addVelocity, vector limits, float pDt, float target, float change, bool freeLook)
79 {
81 pAngle = target;
82 pAngle = Math.Clamp(pAngle, limits[0], limits[1]);
83 // remove freelook when switched back to controlled state
84 pAngleAdd = Math.SmoothCD(pAngleAdd, 0, addVelocity, 0.14, 1000, pDt);
85
86 return Math.Clamp(pAngle + pAngleAdd, limits[0], limits[1]);
87 }
88 //-----------------------------------------------------------------------------
89 override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
90 {
91 // no super for now, will calculate angle based on turret aiming (HeadAngles not supported when turret compartment attachment)
93 return;
94
95 pOutResult.m_pWSAttachmentReference = null;
96 pOutResult.m_pOwner = m_OwnerCharacter;
97 pOutResult.m_fPositionModelSpace = 1.0;
98 pOutResult.m_fFOV = m_fFOV;
99 pOutResult.m_fNearPlane = 0.04;
100 pOutResult.m_bAllowInterpolation = true;
101 pOutResult.m_bUpdateWhenBlendOut = true;
102 pOutResult.m_fUseHeading = 0.0;
103 pOutResult.m_iDirectBoneMode = EDirectBoneMode.None;
104 pOutResult.m_iDirectBone = -1;
105
106 vector offset = m_OffsetLS;
107 if (m_pCompartment && m_pCompartment.IsDirectAimMode() && m_pTurretController.GetCanAimOnlyInADS())
108 offset = vector.Zero;
109
110 CharacterControllerComponent charController = m_OwnerCharacter.GetCharacterController();
111
113 m_vLastCameraAngles = m_pControlledTurret.GetAimingDirection().VectorToAngles();
114 if (charController.IsFreeLookEnabled() || m_pTurretController.GetCanAimOnlyInADS() || charController.IsTrackIREnabled())
115 {
116 float downLimit = m_pCompartment.GetFreelookAimLimitOverrideDown();
117 float upLimit = m_pCompartment.GetFreelookAimLimitOverrideUp();
118 float leftLimit = m_pCompartment.GetFreelookAimLimitOverrideLeft();
119 float rightLimit = m_pCompartment.GetFreelookAimLimitOverrideRight();
120
121 m_CharacterHeadAimingComponent.SetLimitAnglesOverride(downLimit, upLimit, leftLimit, rightLimit);
122
123 vector lookAnglesOverriden = m_CharacterHeadAimingComponent.GetLookAngles();
124
125 // Pivot around Neck1 bone to prevent showing neck hole to player
126 vector headBoneMat[4];
127 vector neckBoneMat[4];
128 m_OwnerCharacter.GetAnimation().GetBoneMatrix(sm_iHeadBoneIndex, headBoneMat);
129 m_OwnerCharacter.GetAnimation().GetBoneMatrix(s_iNeckBoneIndex, neckBoneMat);
130
131 vector neckPosition = neckBoneMat[3] - headBoneMat[3];
132
133 // Account for body rotation that comes from animation and cannot be retrieved otherwise
134 vector aiming = m_pControlledTurret.GetAimingRotation();
135 float neckTraverse = aiming[0] * m_pCompartment.GetFreelookCameraNeckFollowTraverse();
136
137 // Rotate around neck
138 vector neckOffsetMat[4];
139 Math3D.MatrixIdentity4(neckOffsetMat);
140 SCR_Math3D.RotateAround(neckOffsetMat, neckPosition, vector.Up, -Math.DEG2RAD * (lookAnglesOverriden[0] + neckTraverse), neckOffsetMat);
141 SCR_Math3D.RotateAround(neckOffsetMat, neckPosition, neckOffsetMat[0], -Math.DEG2RAD * lookAnglesOverriden[1], neckOffsetMat);
142
143 // Scale by compartment configuration
144 vector neckOffset = neckOffsetMat[3];
145
146 vector neckOffsetScale = m_pCompartment.GetFreelookCameraNeckOffsetScale();
147 neckOffset[0] = neckOffset[0] * neckOffsetScale[0];
148 neckOffset[1] = neckOffset[1] * neckOffsetScale[1];
149 neckOffset[2] = neckOffset[2] * neckOffsetScale[2];
150 offset += neckOffset;
151
152 m_vLastCameraAngles[1] = 0; // Ignore gun elevation
153 m_vLastCameraAngles = lookAnglesOverriden;
154 }
155
156 Math3D.AnglesToMatrix(m_vLastCameraAngles, pOutResult.m_CameraTM);
157
159 m_vPrevEyePosition = vector.Lerp(m_vPrevEyePosition, m_OwnerCharacter.EyePositionModel(), 0.25);
160 pOutResult.m_CameraTM[3] = m_vPrevEyePosition + offset;
161
162 AddVehiclePitchRoll(m_OwnerVehicle, pDt, pOutResult.m_CameraTM);
163
164 // Apply shake
165 if (m_CharacterCameraHandler)
166 m_CharacterCameraHandler.AddShakeToToTransform(pOutResult.m_CameraTM, pOutResult.m_fFOV);
167 }
168
169 //-----------------------------------------------------------------------------
170 override float GetBaseFOV()
171 {
172 CameraManager cameraManager = GetGame().GetCameraManager();
173 if (!cameraManager)
174 return 0;
175
176 return cameraManager.GetVehicleFOV();
177 }
178}
179// *************************************************************************************
180// ! CharacterCamera1stPersonTurretTransition - 1st person camera when character is getting in/out turret
181// ************************************************************************************
182class CharacterCamera1stPersonTurretTransition extends CharacterCamera1stPersonVehicleTransition
183{
184 private bool m_bDoorTransformSet = false;
185 private vector m_vDoorTransform[4];
186
187 //-----------------------------------------------------------------------------
188 override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
189 {
190 super.OnActivate(pPrevCamera, pPrevCameraResult);
191 }
192
193 override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
194 {
195 super.OnUpdate(pDt, pOutResult);
196 if (m_pCompartmentAccess)
197 {
198 BaseCompartmentSlot compartment = m_pCompartmentAccess.GetCompartment();
199 if (compartment && !m_bDoorTransformSet)
200 {
201 compartment.GetManager().GetDoorInfo(compartment.PickDoorIndexForPoint(m_OwnerCharacter.GetOrigin())).GetExitPointInfo().GetWorldTransform(m_vDoorTransform);
202 m_bDoorTransformSet = true;
203 }
204
205 if (!m_pCompartmentAccess.IsInCompartment() && m_isExiting)
206 {
207 m_Input.SetHeadingAngle(m_vDoorTransform[2][0]);
208 m_Input.SetAimingAngles(m_vDoorTransform[2]);
209 }
210 }
211 }
212}
213
214//---- REFACTOR NOTE END ----
class CharacterCamera1stPersonTurret extends CharacterCamera1stPerson m_bDoorTransformSet
ArmaReforgerScripted GetGame()
Definition game.c:1398
override void OnActivate()
CharacterInputContext m_Input
override void OnUpdate()
EDirectBoneMode
override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
override void OnDeactivate(ScriptedCameraItem pNextCamera)
static float UpdateAngleWithTarget(out float pAngle, out float pAngleAdd, out float addVelocity, vector limits, float pDt, float target, float change, bool freeLook)
void CharacterCamera1stPersonTurret(CameraHandlerComponent pCameraHandler)
override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
TurretControllerComponent m_pTurretController
Definition Math.c:13
Contains various scripted 3D math functions.
Definition SCR_Math3D.c:3