Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
dayzplayercamera3rdperson.c
Go to the documentation of this file.
1// *************************************************************************************
2// ! DayZPlayerCamera3rdPerson - base for 3rd person cameras
3// *************************************************************************************
5{
6 static const float CONST_UD_MIN = -85.0;
7 static const float CONST_UD_MAX = 85.0;
8
9 static const float CONST_LR_MIN = -160.0;
10 static const float CONST_LR_MAX = 160.0;
11
13 {
14 if (pInput.Camera3rdIsRightShoulder())
15 {
17 }
18 else
19 {
21 }
22
26 m_fLeanDistance = 0.3;
28 }
29
30
31 //
32 override void OnActivate(DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult)
33 {
34 super.OnActivate(pPrevCamera, pPrevCameraResult);
35
36 if (pPrevCamera)
37 {
38 vector baseAngles = pPrevCamera.GetBaseAngles();
39 m_fUpDownAngle = baseAngles[0];
40 m_fLeftRightAngle = baseAngles[1];
41
42 vector addAngles = pPrevCamera.GetAdditiveAngles();
43 m_fUpDownAngleAdd = addAngles[0];
44 m_fLeftRightAngleAdd = addAngles[1];
45 }
46 }
47
48 //
49 override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
50 {
51 m_pPlayer.GetMovementState(m_MovementState);
52
56
58
59 // update l/r offsets and set it as
60 if (m_pInput.Camera3rdIsRightShoulder())
61 {
62 m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, 1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
63 }
64 else
65 {
66 m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, -1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
67 }
68
69 float shoulderDist = m_fCameraLRShoulder * m_fShoulderWidth + m_MovementState.m_fLeaning * m_fLeanDistance;
70
72 Math3D.YawPitchRollMatrix(GetCurrentOrientation(), pOutResult.m_CameraTM);
73
75 if (m_iBoneIndex != -1)
76 {
77 pOutResult.m_CameraTM[3] = m_pPlayer.GetBonePositionMS(m_iBoneIndex);
78 }
79 else
80 {
81 pOutResult.m_CameraTM[3] = "0 0 0";
82 }
83
85 vector msOffset = m_CameraOffsetMS;
86 vector lsOffset = m_CameraOffsetLS;
87
89 {
90 lsOffset[0] = lsOffset[0] + shoulderDist;
91 }
92 else
93 {
94 msOffset[0] = msOffset[0] + shoulderDist;
95 }
96
97 // ls offset + ms offset + shoulder width
98 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;
99
101 pOutResult.m_fDistance = m_fDistance;
102 pOutResult.m_fUseHeading = 1.0;
103 pOutResult.m_fInsideCamera = 0.0;
104 pOutResult.m_fPredictCollisionRadius = m_fPredictCollisionRadius;
105
107 StdFovUpdate(pDt, pOutResult);
109 }
110
111 override vector GetBaseAngles()
112 {
113 vector a;
114 a[0] = m_fUpDownAngle;
115 a[1] = m_fLeftRightAngle;
116 a[2] = 0;
117 return a;
118 }
119
120 override vector GetAdditiveAngles()
121 {
122 vector a;
123 a[0] = m_fUpDownAngleAdd;
125 a[2] = 0;
126 return a;
127 }
128
129 override string GetCameraName()
130 {
131 return "DayZPlayerCamera3rdPerson";
132 }
133
135 protected int m_iBoneIndex = -1;
138 protected float m_fDistance;
139 protected float m_fShoulderWidth;
140 protected bool m_bShoulderInLS;
141 protected float m_fRoll;
142 protected float m_fLeanDistance;
143
144
146 protected float m_fUpDownAngle;
147 protected float m_fUpDownAngleAdd;
148 protected float m_fLeftRightAngle;
149 protected float m_fLeftRightAngleAdd;
150
152 protected float m_fCameraLRShoulder; // -1..1 shoulderness :)
153 protected float m_fCameraLRShoulderVel[1]; // 0
154
157
159 ref HumanMovementState m_MovementState = new HumanMovementState();
160}
161
162
163
164
165// *************************************************************************************
166// ! DayZPlayerCamera3rdPersonErc - 3rd person erected
167// *************************************************************************************
169{
171 {
172 //Print("new camera: DayZPlayerCamera3rdPersonErc");
173
174 m_fDistance = 1.6;
175 m_CameraOffsetMS = "0.0 1.4 0.0";
176 m_CameraOffsetLS = "0.0 0.3 0.0";
179 }
180}
181
182
183// *************************************************************************************
184// ! DayZPlayerCamera3rdPersonJump - 3rd person jump
185// *************************************************************************************
187{
189 {
190 //Print("new camera: DayZPlayerCamera3rdPersonJump");
191
193 m_fDelay = 0.15;
194 m_fDamping = 0.25;
195
197 m_fJumpStartY = pPlayer.GetOrigin()[1];
198 m_fJumpOffset = 0;
199 m_fDelayTimer = 0;
200 }
201
202 //
203 override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
204 {
205 super.OnUpdate(pDt, pOutResult);
206
207 float yPos = m_pPlayer.GetOrigin()[1];
208 float yDiff = yPos - m_fJumpStartY;
209 yDiff = Math.Clamp(yDiff, 0.0, 2.0);
210
211 if( m_fDelayTimer < m_fDelay )
212 {
213 m_fDelayTimer += pDt;
215 }
216 else
217 {
218 m_fJumpOffset = Math.SmoothCD(m_fJumpOffset, -(m_fDamping * yDiff), m_jumpOffsetVelocity, 0.3, 1000, pDt);
219 }
220
221 float newY = pOutResult.m_CameraTM[3][1] - m_fJumpOffset;
222 pOutResult.m_CameraTM[3][1] = newY;
223 }
224
226 float m_fDelay;
227 float m_fDamping;
228
230 float m_fDelayTimer;
231 float m_fJumpStartY;
232 float m_fJumpOffset;
233 float m_jumpOffsetVelocity[1];
234}
235
236// *************************************************************************************
237// ! DayZPlayerCamera3rdPersonJump - 3rd person jump
238// *************************************************************************************
240{
243 //Print("new camera: DayZPlayerCamera3rdPersonClimb");
244 m_fDistance = 1.0;
245 m_CameraOffsetMS = "0.0 0.3 -0.6";
246 m_iBoneIndex = pPlayer.GetBoneIndexByName("Spine");
248 }
249}
250
251// *************************************************************************************
252// ! DayZPlayerCamera3rdPersonErc - 3rd person erected sprint
253// *************************************************************************************
255{
257 {
258 //Print("new camera: DayZPlayerCamera3rdPersonErcSpr");
259
260 m_fDistance = 2.0;
261 m_CameraOffsetMS = "0.0 1.3 0.0";
262 m_CameraOffsetLS = "0.0 0.3 0.0";
263 m_fShoulderWidth = 0.15;
264
265 m_iPelvisBone = pPlayer.GetBoneIndexByName("Pelvis");
266 if (m_iPelvisBone == -1)
267 {
268 Print("DayZPlayerCamera3rdPersonErcSpr: hips bone not found");
269 }
270
271 m_fTime = 0.0;
272 }
273
274
275
276 //
277 override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
278 {
279 m_fTime += pDt * 5;
281 vector tm[4];
282
283 m_pPlayer.GetBoneTransformLS(m_iPelvisBone, tm);
285 float xShift = tm[1][0];
286 m_CurrentCameraRoll = xShift * 3.0; // 3 is just made up value i like :)
288 // m_CurrentCameraRoll = (sin(1.5 * m_fTime)); // + 0.3 * sin(3.6 * m_fTime) + 0.2 * sin(0.7 * m_fTime)) / 1.3 * 3;
289
291 super.OnUpdate(pDt, pOutResult);
292
293 //pOutResult.m_fFovMultiplier = 1.2;
295
296
297 protected int m_iPelvisBone;
298 protected float m_fTime;
299
303// *************************************************************************************
304// ! DayZPlayerCamera3rdPersonErcRaised - 3rd person erected raised
305// *************************************************************************************
310 //Print("new camera: DayZPlayerCamera3rdPersonErcRaised");
313 if ( pPlayer.GetCurrentPerItemCameraUD () == DayZPlayerCameras.PERITEMUD_EMPTYHANDED )
315 // no item in hands
316 m_fDistance = 1.2;
318 m_CameraOffsetMS = "0.0 1.3 0.2";
319 m_CameraOffsetLS = "0.0 0.3 0.0";
320
321 }
322 else if ( pPlayer.GetCurrentPerItemCameraUD () == DayZPlayerCameras.PERITEMUD_TWOHANDED )
323 {
324 // two handed
325 m_fDistance = 1.2;
326 m_fShoulderWidth = 0.4;
327 m_CameraOffsetMS = "0.0 1.3 0.2";
328 m_CameraOffsetLS = "0.0 0.3 0.0";
329 }
330 else if ( pPlayer.GetCurrentPerItemCameraUD () == DayZPlayerCameras.PERITEMUD_ONEHANDED )
331 {
332 // one handed
333 m_fDistance = 1.2;
334 m_fShoulderWidth = 0.4;
335 m_CameraOffsetMS = "0.0 1.3 0.2";
336 m_CameraOffsetLS = "0.0 0.3 0.0";
337 }
338 else
339 {
340 // weapons in hands
341 m_fDistance = 0.8;
342 m_CameraOffsetMS = "0.0 1.3 0.2";
343 m_CameraOffsetLS = "0.0 0.3 0.0";
344 m_fShoulderWidth = 0.5;
345 }
346 }
347
348 override bool IsCamera3rdRaised()
349 {
350 return true;
352}
353
354
355// *************************************************************************************
356// ! DayZPlayerCamera3rdPersonErcRaised - 3rd person erected raised
357// *************************************************************************************
358class DayZPlayerCamera3rdPersonErcRaisedMelee extends DayZPlayerCamera3rdPersonErcRaised
359{
361 {
363 pInput.Override3rdIsRightShoulder(HumanInputControllerOverrideType.ENABLED, pInput.Camera3rdIsRightShoulder());
364 }
365}
366
367
368// *************************************************************************************
369// ! DayZPlayerCamera3rdPersonCrouch - 3rd person crouch
370// *************************************************************************************
372{
373 static const float CONST_CAMERAMOVEMENTHEIGH = 0.4; // 0 idle, 0.15 walk 0.3 run/sprint
374
376 {
377 //Print("new camera: DayZPlayerCamera3rdPersonCrouch");
378
379 m_fDistance = 1.4;
380 m_CameraOffsetMS = "0.0 0.7 0.1";
381 m_CameraOffsetLS = "0.0 0.3 0.0";
382 m_fShoulderWidth = 0.3;
383 }
384
385 //
386 override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
387 {
388 m_pPlayer.GetMovementState(m_MovementState);
389
391 float movement = (Limit(m_MovementState.m_iMovement, 1, 3) - 1.0) * 0.5;
392 movement *= CONST_CAMERAMOVEMENTHEIGH;
393 m_fCameraHeight = Math.SmoothCD(m_fCameraHeight, movement, m_fCameraHeightVel, 0.2, 1000, pDt);
395
397 super.OnUpdate(pDt, pOutResult);
398 }
399
400 protected float m_fCameraHeight; // -1..1 shoulderness :)
401 protected float m_fCameraHeightVel[1]; // 0
402}
403
404
405// *************************************************************************************
406// ! DayZPlayerCamera3rdPersonCrouchRaised- 3rd person crouch raised
407// *************************************************************************************
408class DayZPlayerCamera3rdPersonCrouchRaised extends DayZPlayerCamera3rdPersonCrouch
409{
410 void DayZPlayerCamera3rdPersonCrouchRaised(DayZPlayer pPlayer, HumanInputController pInput)
411 {
412 //Print("new camera: DayZPlayerCamera3rdPersonCrouchRaised");
413
414 m_fDistance = 0.8;
415 m_CameraOffsetMS = "0.0 0.8 0.1"; // being overwritten by m_CameraOffsetMS[1] from DayZPlayerCamera3rdPersonCrouch
416 m_CameraOffsetLS = "0.0 0.3 0.0";
417 m_fShoulderWidth = 0.5;
418 }
419
420 override bool IsCamera3rdRaised()
421 {
422 return true;
423 }
424}
425
426
427// *************************************************************************************
428// ! DayZPlayerCamera3rdPersonProneRaised - 3rd person prone raised
429// *************************************************************************************
431{
432 protected vector m_BaseOffset
434 protected float m_LookAtLRAngle;
435
436 float UpdateLRAngleLookAt(float pMin, float pMax, float pDt)
437 {
439 if (m_pInput.CameraIsFreeLook() || m_bForceFreeLook)
440 {
441 m_LookAtLRAngle += m_pInput.GetAimChange()[0] * Math.RAD2DEG;
443
444 m_fLRAngleVel[0] = 0; // reset filter
445 }
446 else
447 {
448 // smooth value back to 0
449 m_LookAtLRAngle = Math.SmoothCD(m_LookAtLRAngle, 0, m_fLRAngleVel, 0.14, 1000, pDt);
450 // m_fLeftRightAngle = 0.9 * (1.0 - pDt);
451 }
452
453 return m_LookAtLRAngle;
454 }
455
456 override void OnActivate(DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult)
457 {
458 super.OnActivate(pPrevCamera, pPrevCameraResult);
459
460 if (m_iBoneIndex != -1)
461 {
462 m_BaseOffset = m_pPlayer.GetBonePositionMS(m_iBoneIndex);
463 }
464 else
465 {
466 m_BaseOffset = "0 0 0";
467 }
468 }
469
470
471 //
472 override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
473 {
476
477 float orientYaw = m_pPlayer.GetOrientation()[0];
478 float headYaw = m_pInput.GetHeadingAngle() * Math.RAD2DEG;
479 m_CurrentCameraYaw = -fixAngle_180_180(orientYaw + headYaw);
480
481 // Print("OY: " + orientYaw.ToString() + " HY: " + headYaw.ToString());
482
483 // update l/r offsets and set it as
484
486
487 if (m_pInput.Camera3rdIsRightShoulder())
488 {
489 m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, 1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
490 }
491 else
492 {
493 m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, -1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
494 }
495
496 float shoulderDist = m_fCameraLRShoulder * m_fShoulderWidth;
497
499 Math3D.YawPitchRollMatrix(GetCurrentOrientation(), pOutResult.m_CameraTM);
500
502 if (m_iBoneIndex != -1)
503 {
504 vector bonePos = m_pPlayer.GetBonePositionMS(m_iBoneIndex);
505 m_BaseOffset[0] = Math.SmoothCD(m_BaseOffset[0], bonePos[0], m_BaseOffsetVelX, 0.14, 1000, pDt);
506 m_BaseOffset[1] = Math.SmoothCD(m_BaseOffset[1], bonePos[1], m_BaseOffsetVelY, 0.14, 1000, pDt);
507 m_BaseOffset[2] = Math.SmoothCD(m_BaseOffset[2], bonePos[2], m_BaseOffsetVelZ, 0.14, 1000, pDt);
508 }
509
511 vector msOffset = m_CameraOffsetMS;
512 vector lsOffset = m_CameraOffsetLS;
513
514 lsOffset[0] = lsOffset[0] + shoulderDist;
515
516 // ls offset + ms offset + shoulder width
517 pOutResult.m_CameraTM[3] = m_BaseOffset + pOutResult.m_CameraTM[0] * lsOffset[0] + pOutResult.m_CameraTM[1] * lsOffset[1] + pOutResult.m_CameraTM[2] * lsOffset[2] + msOffset;
518
519 m_CurrentCameraYaw = UpdateLRAngleLookAt(-180, 180, pDt);
520 Math3D.YawPitchRollMatrix(GetCurrentOrientation(), pOutResult.m_CameraTM);
521
523 pOutResult.m_fDistance = m_fDistance;
524 pOutResult.m_fUseHeading = 1.0;
525 pOutResult.m_fInsideCamera = 0.0;
526 pOutResult.m_fPositionModelSpace = 1.0;
527 pOutResult.m_bUpdateWhenBlendOut = false;
528
530 StdFovUpdate(pDt, pOutResult);
532 }
533}
534
535// *************************************************************************************
536// ! DayZPlayerCamera3rdPersonProne - 3rd person prone
537// *************************************************************************************
539{
541 {
542 //Print("new camera: DayZPlayerCamera3rdPersonProne");
543 m_iBoneIndex = pPlayer.GetBoneIndexByName ("Camera3rd_Helper");
544 m_fDistance = 1.0;
545 m_CameraOffsetMS = "0.0 0.4 0.0";
546 m_CameraOffsetLS = "0.0 0.2 0.0";
547 m_fShoulderWidth = 0.5;
548 }
549
550}
551
552// *************************************************************************************
553// ! DayZPlayerCamera3rdPersonProneRaised - 3rd person prone raised
554// *************************************************************************************
556{
559 //Print("new camera: DayZPlayerCamera3rdPersonProneRaised");
560 m_iBoneIndex = pPlayer.GetBoneIndexByName ("Camera3rd_Helper");
561 m_fDistance = 1.0;
562 m_CameraOffsetMS = "0.0 0.4 0.0";
563 m_CameraOffsetLS = "0.0 0.2 0.0";
564 m_fShoulderWidth = 0.5;
565 }
566
567 override bool IsCamera3rdRaised()
568 {
569 return true;
570 }
571}
this is main camera class
vector m_CameraOffsetMS
model space offset
float m_fLeftRightAngleAdd
left right angle in rad (in freelook only)
float m_fRoll
camera roll (deprecated)
bool m_bShoulderInLS
true - shoulder is in local space
float m_fLeanDistance
shift on leaning
float m_fCameraLRShoulder
shoulder offsets
float m_fShoulderWidth
shoulder camera widths
vector m_CameraOffsetLS
local space offset
float m_fPredictCollisionRadius
collision prediction
float m_fDistance
distance from start
float m_fUpDownAngleAdd
up down angle in rad
float m_fLeftRightAngle
left right angle in rad (in freelook only)
float m_fUpDownAngle
up down angle in rad
Definition enmath.c:7
vector GetAdditiveAngles()
Definition dayzplayer.c:87
vector GetBaseAngles()
Definition dayzplayer.c:82
float m_fDistance
camera distance (external cameras only)
Definition dayzplayer.c:63
float m_fPredictCollisionRadius
sphere radius used for collision prediction
Definition dayzplayer.c:65
bool IsCamera3rdRaised()
Definition dayzplayer.c:117
DayZPlayer m_pPlayer
data
Definition dayzplayer.c:135
HumanInputController m_pInput
human input
Definition dayzplayer.c:136
string GetCameraName()
Definition dayzplayer.c:92
class DayZPlayerCameraResult DayZPlayerCamera(DayZPlayer pPlayer, HumanInputController pInput)
Definition dayzplayer.c:56
vector GetCurrentOrientation()
Definition dayzplayer.c:112
int m_iBoneIndex
main bone
float m_fLeftRightAngle
left right angle in rad (in freelook only)
float m_fUpDownAngle
up down angle in rad
float m_fLeftRightAngleAdd
left right angle in rad (in freelook only)
float m_fUpDownAngleAdd
up down angle in rad
float m_fCameraHeight
void DayZPlayerCamera3rdPerson(DayZPlayer pPlayer, HumanInputController pInput)
vector m_CameraOffsetMS
model space offset
class DayZPlayerCamera3rdPersonCrouchRaised extends DayZPlayerCamera3rdPersonCrouch m_BaseOffsetVelZ[1]
float m_jumpOffsetVelocity[1]
int m_iBoneIndex
runtime config
void DayZPlayerCamera3rdPersonJump(DayZPlayer pPlayer, HumanInputController pInput)
float m_fLeftRightAngle
left right angle in rad (in freelook only)
class DayZPlayerCamera3rdPerson extends DayZPlayerCameraBase DayZPlayerCamera3rdPersonErc(DayZPlayer pPlayer, HumanInputController pInput)
float m_fUpDownAngle
runtime values
class DayZPlayerCamera3rdPersonJump extends DayZPlayerCamera3rdPersonErc DayZPlayerCamera3rdPersonClimb(DayZPlayer pPlayer, HumanInputController pInput)
float m_fShoulderWidth
shoulder camera widths
float m_fUpDownAngleAdd
up down angle in rad
float m_fDistance
distance from start
float m_fDelay
runtime config
void DayZPlayerCamera3rdPersonCrouch(DayZPlayer pPlayer, HumanInputController pInput)
class DayZPlayerCamera3rdPersonProne extends DayZPlayerCamera3rdPersonProneBase DayZPlayerCamera3rdPersonProneRaised(DayZPlayer pPlayer, HumanInputController pInput)
float m_fPredictCollisionRadius
collision prediction
override bool IsCamera3rdRaised()
class DayZPlayerCamera3rdPersonCrouchRaised extends DayZPlayerCamera3rdPersonCrouch m_BaseOffsetVelY[1]
class DayZPlayerCamera3rdPersonErcSpr extends DayZPlayerCamera3rdPersonErc DayZPlayerCamera3rdPersonErcRaised(DayZPlayer pPlayer, HumanInputController pInput)
float m_fDelayTimer
runtime values
class DayZPlayerCamera3rdPersonCrouchRaised extends DayZPlayerCamera3rdPersonCrouch m_BaseOffsetVelX[1]
float m_fCameraLRShoulder
shoulder offsets
ref HumanMovementState m_MovementState
movement state
float UpdateLRAngleLookAt(float pMin, float pMax, float pDt)
float m_fCameraLRShoulderVel[1]
float m_fJumpStartY
vector m_CameraOffsetLS
local space offset
void DayZPlayerCamera3rdPersonProne(DayZPlayer pPlayer, HumanInputController pInput)
float m_fJumpOffset
class DayZPlayerCamera3rdPersonErcRaisedMelee extends DayZPlayerCamera3rdPersonErcRaised CONST_CAMERAMOVEMENTHEIGH
float m_fLeanDistance
shift on leaning
float m_LookAtLRAngle
bool m_bShoulderInLS
true - shoulder is in local space
float m_fCameraHeightVel[1]
void DayZPlayerCamera3rdPersonErcSpr(DayZPlayer pPlayer, HumanInputController pInput)
float UpdateLRAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
float m_CurrentCameraYaw
float m_CurrentCameraPitch
float UpdateUDAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
void StdFovUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
float m_CurrentCameraRoll
bool m_bForceFreeLook
void InitCameraOnPlayer(bool force=false)
void HandleShoulderCameraOverride(HumanInputController pInput)
float fixAngle_180_180(float pAngle)
float m_WeaponSwayModifier
void UpdateCameraNV(PlayerBase player)
void ProcessCameraShake(float delta, out float leftRight, out float upDown)
float m_fLRAngleVel[1]
proto void Print(void var)
Prints content of variable to console/log.
Limit
HumanInputControllerOverrideType
Definition human.c:8
void OnActivate()