Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
CharacterCamera3rdPersonBase.c
Go to the documentation of this file.
1// *************************************************************************************
2// ! CharacterCamera3rdPersonBase - base 3rd person camera
3// *************************************************************************************
5{
6 //-----------------------------------------------------------------------------
7 static const float CONST_UD_MIN = -89.0;
8 static const float CONST_UD_MAX = 89.0;
9
10 static const float CONST_LR_MIN = -160.0;
11 static const float CONST_LR_MAX = 160.0;
12
13 //-----------------------------------------------------------------------------
14 void CharacterCamera3rdPersonBase(CameraHandlerComponent pCameraHandler)
15 {
16 m_fFOVFilterVel = 0;
17 }
18
19 //-----------------------------------------------------------------------------
20 override void OnActivate(ScriptedCameraItem pPrevCamera, ScriptedCameraItemResult pPrevCameraResult)
21 {
22 super.OnActivate(pPrevCamera, pPrevCameraResult);
23 if (pPrevCamera)
24 {
25 // Use last shoulder state
26 m_fShoulderLRPrefered = GetShoulderLastActive();
27 }
28 m_fFOVFilter = pPrevCameraResult.m_fFOV;
29 }
30
31 //-----------------------------------------------------------------------------
32 override void OnUpdate(float pDt, out ScriptedCameraItemResult pOutResult)
33 {
34 pOutResult.m_fUseHeading = 1.0;
35 pOutResult.m_vBaseAngles = GetBaseAngles();
36
38 m_fFOV = GetBaseFOV();
39
41 vector lookAngles = m_CharacterHeadAimingComponent.GetLookAngles();
42
43 if (m_CharacterAnimationComponent.PhysicsIsLinked() && !m_CmdHandler.GetCommandLadder())
44 {
45 pOutResult.m_fUseHeading = 0.0; // Do not use heading after so that we can calculate it ourselves here
46
47 if (!m_ControllerComponent.IsFreeLookEnabled())
48 {
49 lookAngles[0] = m_OwnerCharacter.GetAimRotationModel()[0] * Math.RAD2DEG;
50 }
51 }
52
53 if (!m_bIgnoreCharacterPitch)
54 lookAngles[1] = lookAngles[1] + m_OwnerCharacter.GetLocalYawPitchRoll()[1];
55
57 Math3D.AnglesToMatrix(lookAngles, pOutResult.m_CameraTM);
58
60 if (m_iBoneIndex != -1)
61 {
62 vector boneMatrix[4];
63 m_OwnerCharacter.GetAnimation().GetBoneMatrix(m_iBoneIndex, boneMatrix);
64 pOutResult.m_CameraTM[3] = boneMatrix[3];
65 }
66 else
67 {
68 pOutResult.m_CameraTM[3] = "0 0 0";
69 }
70
72 float leaning = m_ControllerComponent.GetLeaning();
73 if( leaning < -0.1 )
74 m_fShoulderLRPrefered = -1;
75 else if( leaning > 0.1 )
76 m_fShoulderLRPrefered = 1;
77
78 m_fShoulderLROffset = Math.SmoothCD(m_fShoulderLROffset, m_fShoulderLRPrefered, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
79
80 m_fLeaningOffset = m_ControllerComponent.GetCurrentLeanAmount();
81 float shoulderDist = GetShoulderDistance();
82
84 vector msOffset = m_CameraOffsetMS;
85 vector lsOffset = m_CameraOffsetLS;
86 if (m_bShoulderInLS)
87 {
88 lsOffset[0] = lsOffset[0] + shoulderDist;
89 }
90 else
91 {
92 msOffset[0] = msOffset[0] + shoulderDist;
93 }
94
95 vector charMat[4];
96 m_CharacterAnimationComponent.PhysicsGetTransformLS(charMat);
97
99 vector velocity = m_CharacterAnimationComponent.PhysicsGetLocalVelocityXZ();
100 velocity = velocity.InvMultiply3(charMat);
101 for (int i = 0; i < 3; i++)
102 {
103 velocity[i] = Math.Clamp(velocity[i], -m_vMaxVelocity[i], m_vMaxVelocity[i]);
104 }
105 m_v3rd_VelocityAdd += (velocity - m_v3rd_VelocityAdd) * pDt * 2;
106
107 msOffset = msOffset + m_v3rd_VelocityAdd * -0.05;
108
109 // ls offset + ms offset + shoulder width
110 pOutResult.m_CameraTM[3] = pOutResult.m_CameraTM[3] + pOutResult.m_CameraTM[0] * lsOffset[0] + pOutResult.m_CameraTM[1] * lsOffset[1] + pOutResult.m_CameraTM[2] * lsOffset[2] + msOffset;
111
112 float currY = pOutResult.m_CameraTM[3][1];
113 if (m_fYoffsetPrevFrame == 0)
114 {
115 m_fYoffsetPrevFrame = currY;
116 }
117 m_fYoffsetPrevFrame = Math.Lerp(m_fYoffsetPrevFrame, currY, 0.01);
118 float yDelta = 1;
119 if (m_fYoffsetPrevFrame != 0)
120 {
121 yDelta = Math.Pow(currY/m_fYoffsetPrevFrame, 2); // easing
122 }
123
124 pOutResult.m_CameraTM[3][1] = m_fYoffsetPrevFrame * yDelta;
125
126 m_fBobScale = m_CharacterCameraHandler.AddViewBobToTransform(pOutResult.m_CameraTM, 1, true);
127 // follow hip bone when ragdolling
128 if(m_OwnerCharacter.GetAnimationComponent().IsRagdollActive())
129 {
130 pOutResult.m_iDirectBoneMode = EDirectBoneMode.RelativeTransform;
131 pOutResult.m_iDirectBone = m_OwnerCharacter.GetAnimation().GetBoneIndex("Hips");
132 }
133
135 pOutResult.m_fDistance = m_fDistance;
136 pOutResult.m_iDirectBoneMode = EDirectBoneMode.None;
137 pOutResult.m_fShoulderDist = GetShoulderDistance();
138 pOutResult.m_fNearPlane = 0.04;
139 pOutResult.m_fPositionModelSpace = 1.0;
140 pOutResult.m_pWSAttachmentReference = null;
141 pOutResult.m_pOwner = m_OwnerCharacter;
142
143 m_fFOVFilter = Math.SmoothCD(m_fFOVFilter, pOutResult.m_fFOV, m_fFOVFilterVel, 0.2, 1000, pDt);
144 pOutResult.m_fFOV = m_fFOVFilter;
145 }
146
147 //-----------------------------------------------------------------------------
148 override float GetBaseFOV()
149 {
150 CameraManager cameraManager = GetGame().GetCameraManager();
151 if (!cameraManager)
152 return 0;
153
154 return cameraManager.GetThirdPersonFOV();
155 }
156
157 //-----------------------------------------------------------------------------
160 int GetActiveShoulder()
161 {
162 return m_fShoulderLRPrefered;
163 }
164
165 //-----------------------------------------------------------------------------
166 override float GetShoulderDistance()
167 {
168 return m_fShoulderLROffset * m_fShoulderWidth + m_fLeanDistance * m_fLeaningOffset;
169 }
170 //-----------------------------------------------------------------------------
172 protected int m_iBoneIndex = -1;
175 protected float m_fDistance;
176 protected float m_fShoulderWidth;
177 protected bool m_bShoulderInLS;
178 protected float m_fLeanDistance;
179 protected vector m_vMaxVelocity = "2 2 2";
180
181 protected float m_fBobScale;
182
183 protected int m_fShoulderLRPrefered = 1;
184 protected float m_fShoulderLROffset;
185 protected float m_fLeaningOffset;
186 protected float m_fCameraLRShoulderVel;
187 protected float m_fLeaningOffsetVel;
189 protected float m_fYoffsetPrevFrame = 0.0;
190};
ArmaReforgerScripted GetGame()
Definition game.c:1398
float m_fDistance
override void OnActivate()
override void OnUpdate()
EDirectBoneMode
float m_fDistance
distance from start
vector m_CameraOffsetMS
model space offset
float m_fShoulderWidth
shoulder camera widths
float m_fYoffsetPrevFrame
LS Y offset of the camera in the past.
vector m_CameraOffsetLS
local space offset
bool m_bShoulderInLS
true - shoulder is in local space