Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
dayzplayercamera_base.c
Go to the documentation of this file.
1
2float Limit(float pV, float pMin, float pMax)
3{
4 if (pV >= pMin && pV <= pMax)
5 {
6 return pV;
7 }
8 else if (pV < pMin)
9 {
10 return pMin;
11 }
12 else
13 {
14 return pMax;
15 }
16}
17
18
19float fixAngle_PI_PI(float pAngle)
20{
21 while (pAngle > Math.PI)
22 {
23
24 pAngle -= Math.PI2;
25 }
26
27 while (pAngle < -Math.PI)
28 {
29
30 pAngle += Math.PI2;
31 }
32
33 return pAngle;
34}
35
36float fixAngle_180_180(float pAngle)
37{
38 while (pAngle > 180)
39 {
40
41 pAngle -= 360;
42 }
43
44 while (pAngle < -180)
45 {
46
47 pAngle += 360;
48 }
49
50 return pAngle;
51}
52
53
69
71{
72 static const float CONST_NEARPLANE_OPTICS_MIN = 0.04; //Minimal safe near plane value, artifacts on the far plane otherwise!
73
77
80 {
81 m_fLRAngleVel[0] = 0;
82 m_fUDAngleVel[0] = 0;
83 m_fFovAbsVel[0] = 0;
85
88 /*
89 {
90 int perItemCamUD = pPlayer.GetCurrentPerItemCameraUD();
91 string a = "Per Item Camera User Data: " + perItemCamUD.ToString();
92 Print(a);
93 }
94 */
96
97 m_CommandWeapons = pPlayer.GetCommandModifier_Weapons();
98 Init();
100 };
101
102 //disabled by default, overrides on select 3rd person cameras
104 {
106 m_pInput.Override3rdIsRightShoulder(HumanInputControllerOverrideType.DISABLED, false);
107 }
108
109 void ProcessCameraShake(float delta, out float leftRight, out float upDown)
110 {
111 if (m_CameraShake)
112 {
113 float x,y;
114 m_CameraShake.Update(delta, x, y);
115 leftRight += x;
116 upDown += y;
117 }
118 }
119
120 void Init()
121 {
122 PlayerBase player = PlayerBase.Cast(m_pPlayer);
123 if ( player && player.IsNVGWorking() != IsCameraNV() )
124 {
125 SetCameraNV(player.IsNVGWorking());
126 SetCameraNVType(player.GetNVType());
127 }
128 }
129
130 float UpdateUDAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
131 {
132 float target = m_CommandWeapons.GetBaseAimingAngleUD();
133
134 if (m_pInput.CameraIsTracking())
135 {
136 pAngleAdd = m_pInput.GetTracking()[1] * Math.RAD2DEG;
137 pAngle = target;
138
139 m_fUDAngleVel[0] = 0;
140 }
141 else
142 {
143 if (Math.AbsFloat(pAngleAdd) > 0.001)
144 {
145 pAngleAdd = pAngle + pAngleAdd - target;
146 pAngle = target;
147 }
148
149 if (m_pInput.CameraIsFreeLook())
150 {
151 pAngleAdd += m_pInput.GetAimDelta(pDt)[1] * Math.RAD2DEG;
152
153 m_fUDAngleVel[0] = 0;
154 }
155 else
156 {
157 PlayerBase player = PlayerBase.Cast(m_pPlayer);
158 if (player) // handle locking of camera U/D angle movement when performing an action and not in freelook
159 {
160 float pitch = pAngle + pAngleAdd;
161 float downLimit, upLimit, leftLimit, rightLimit;
162 player.GetLookLimits(downLimit, upLimit, leftLimit, rightLimit);
163
164 if (pitch < (upLimit + 1) && pitch > (downLimit - 1)) // stop smoothing once within sufficiently small difference
165 {
166 pMin = downLimit;
167 pMax = upLimit;
168 }
169 else // smooth camera to locked angle, avoiding snap from the angle we started the action to the limit
170 {
171 float vel[1] = m_fUDAngleVel;
172 pMin = Math.SmoothCD(pitch, downLimit, vel, 0.2, 1000, pDt);
173 pMax = Math.SmoothCD(pitch, upLimit, vel, 0.2, 1000, pDt);
174 }
175 }
176
177 pAngleAdd = Math.SmoothCD(pAngleAdd, 0.0, m_fUDAngleVel, 0.14, 1000, pDt);
178 }
179
180 if (!m_pInput.CameraIsFreeLook())
181 {
182 pAngle += m_pInput.GetAimDelta(pDt)[1] * Math.RAD2DEG;
183 }
184 }
185
186 pAngle = Limit(pAngle, pMin, pMax);
187 pAngleAdd = Limit(pAngle + pAngleAdd, pMin, pMax) - pAngle;
188 return pAngle + pAngleAdd;
189 }
190
191 float UpdateLRAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
192 {
193 float target = 0;
194
195 if (m_pInput.CameraIsTracking())
196 {
197 pAngleAdd = m_pInput.GetTracking()[0] * Math.RAD2DEG;
198 pAngle = target;
199
200 m_fUDAngleVel[0] = 0;
201 }
202 else
203 {
204 if (Math.AbsFloat(pAngleAdd) > 0.001)
205 {
206 pAngleAdd = pAngle + pAngleAdd - target;
207 pAngle = target;
208 }
209
210 if (m_pInput.CameraIsFreeLook() || m_bForceFreeLook)
211 {
212 pAngleAdd += m_pInput.GetAimDelta(pDt)[0] * Math.RAD2DEG;
213
214 m_fLRAngleVel[0] = 0;
215 }
216 else
217 {
218 pAngleAdd = Math.SmoothCD(pAngleAdd, 0.0, m_fLRAngleVel, 0.14, 1000, pDt);
219 }
220
221 pAngleAdd = pAngleAdd + pAngle;
222 }
223
224 pAngle = Limit(pAngle, pMin, pMax);
225 pAngleAdd = Limit(pAngle + pAngleAdd, pMin, pMax) - pAngle;
226
227 return pAngle + pAngleAdd;
228 }
229
230 float UpdateUDAngle(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
231 {
232 if (Math.AbsFloat(pAngleAdd) > 0.001)
233 {
234 float aimingUDAngle = m_CommandWeapons.GetBaseAimingAngleUD();
235
238
239 // override actual angle
240 pAngleAdd = pAngle + pAngleAdd - aimingUDAngle;
241 pAngle = aimingUDAngle;
242
243 // Print("Angle: " + pAngle.ToString() + " Aim: " + actualUDAngle.ToString() );
244 }
245
247 if( m_pInput.CameraIsFreeLook() )
248 {
249 pAngleAdd += m_pInput.GetAimChange()[1] * Math.RAD2DEG;
250 pAngleAdd = Limit(pAngleAdd, pMin, pMax);
251
252 m_fUDAngleVel[0] = 0;
253 }
254 else
255 {
256 if( m_pInput.CameraIsTracking() )
257 {
258 pAngleAdd = m_pInput.GetTracking()[1] * Math.RAD2DEG;
259 pAngleAdd = Limit(pAngleAdd, pMin, pMax);
260
261 m_fUDAngleVel[0] = 0;
262 }
263 else
264 {
266 pAngle += m_pInput.GetAimChange()[1] * Math.RAD2DEG;
267 pAngle = Limit(pAngle, pMin, pMax);
268
269 pAngleAdd = Math.SmoothCD(pAngleAdd, 0, m_fUDAngleVel, 0.14, 1000, pDt);
270 }
271 }
272
273 /*{
274 float change = m_pInput.GetAimChange()[1] * Math.RAD2DEG;
275
276 Print ("Script: Camera ud angle: " + pAngle.ToString() + " change: " + change.ToString() );
277 }*/
278
279 return Limit(pAngle + pAngleAdd, pMin, pMax);
280 }
281
282 float UpdateLRAngle(float pAngle, float pMin, float pMax, float pDt)
283 {
285 if (m_pInput.CameraIsFreeLook() || m_bForceFreeLook)
286 {
288 pAngle += m_pInput.GetAimChange()[0] * Math.RAD2DEG;
289 pAngle = Limit(pAngle, pMin, pMax);
290
291 m_fLRAngleVel[0] = 0; // reset filter
292
293 }
294 else
295 {
296 if( m_pInput.CameraIsTracking() )
297 {
298 pAngle = m_pInput.GetTracking()[0] * Math.RAD2DEG;
299 pAngle = Limit(-pAngle, pMin, pMax);
300
301 m_fLRAngleVel[0] = 0; // reset filter
302 }
303 else
304 {
305 // smooth value back to 0
306 pAngle = Math.SmoothCD(pAngle, 0, m_fLRAngleVel, 0.14, 1000, pDt);
307 // m_fLeftRightAngle = 0.9 * (1.0 - pDt);
308 }
309 }
310
311 return pAngle;
312 }
313
314
315
316 void StdFovUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
317 {
319 switch (m_pPlayer.GetEyeZoomLevel())
320 {
321 // ordered in likelihood of occurance for perf. reasons
322 case ECameraZoomType.NONE:
323 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.NONE), m_fFovAbsVel, 0.1, 1000, pDt);
324 break;
325 case ECameraZoomType.NORMAL:
326 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.NORMAL), m_fFovAbsVel, 0.1, 1000, pDt);
327 break;
328 case ECameraZoomType.SHALLOW:
329 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.SHALLOW), m_fFovAbsVel, 0.1, 1000, pDt);
330 break;
331 default:
332 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.NONE), m_fFovAbsVel, 0.1, 1000, pDt);
333 break;
334 }
335
336 pOutResult.m_fFovAbsolute = m_fFovAbsolute;
337
340 {
341 pOutResult.m_fShootFromCamera = 0.0;
342 }
343 }
344
345 override void SpawnCameraShakeProper(float strength, float radius, float smoothness, float radius_decay_speed)
346 {
347 m_CameraShake = new CameraShake(strength, radius, smoothness, radius_decay_speed);
348 }
349
350 override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
351 {
352 if (!m_pPlayer || !PlayerBase.Cast(m_pPlayer))
353 {
354 Debug.Log("DayZPlayerCameraBase | OnUpdate | no player!");
355 return;
356 }
357
358 if (PlayerBase.Cast(m_pPlayer).GetCurrentCamera() != this)
359 {
360 //Print("DayZPlayerCameraBase | OnUpdate | unused camera! | " + this + "/" + PlayerBase.Cast(m_pPlayer).GetCurrentCamera());
361 return;
362 }
363
364 super.OnUpdate(pDt, pOutResult);
365 StdFovUpdate(pDt, pOutResult);
368 }
369
370 override void OnActivate(DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult)
371 {
372 InitCameraOnPlayer(true);
373 SetCameraPPDelay(pPrevCamera);
374
375 if (DayZPlayerCameraBase.Cast(pPrevCamera) && DayZPlayerCameraBase.Cast(pPrevCamera).IsCameraNV() && !IsCameraNV())
376 {
377 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_TRANSITIVE) );
378 }
379
380 GetGame().GetCallQueue(CALL_CATEGORY_GUI).CallLater(SetCameraPP,m_CameraPPDelay*1000,false,true,this); // this takes care of weapon/optics postprocessing
381 DayZPlayerCameraOptics optic_camera;
382 if (DayZPlayerCamera.CastTo(optic_camera,pPrevCamera))
383 {
384 GetGame().GetCallQueue(CALL_CATEGORY_GUI).Call(PlayerBase.Cast(m_pPlayer).HideClothing,null,false);
385 }
386 }
387
389 {
391 }
392
393 override string GetCameraName()
394 {
395 return "DayZPlayerCameraBase";
396 }
397
399 {
400 }
401
402 void SetCameraNV(bool nightvision)
403 {
404 m_IsNightvision = nightvision;
405 }
406
408 {
409 return m_IsNightvision;
410 }
411
412 void SetCameraNVType(int type)
413 {
414 m_NightvisionType = type;
415 }
416
418 {
419 return m_NightvisionType;
420 }
421
423 {
424 if ( !player )
425 return;
426
427 if ( player.IsNVGWorking() != IsCameraNV() || player.GetNVType() != GetCameraNVType() )
428 {
429 SetCameraNV(player.IsNVGWorking());
430 SetCameraNVType(player.GetNVType());
431 SetCameraPP(true, this);
432 }
433 }
434
436 void SetCameraPP(bool state, DayZPlayerCamera launchedFrom)
437 {
438 PPERequesterBank.GetRequester(PPERequester_CameraADS).Stop();
439
440 if (IsCameraNV())
441 {
443 }
444 else
445 {
447 }
448
449 m_weaponUsed = Weapon_Base.Cast(m_pPlayer.GetHumanInventory().GetEntityInHands());
450 if (m_weaponUsed)
451 {
452 m_weaponUsed.HideWeaponBarrel(false);
453 }
454 }
455
456 override float GetCurrentYaw()
457 {
458 return m_CurrentCameraYaw;
459 }
460
461 override float GetCurrentPitch()
462 {
464 }
465
466 override float GetCurrentRoll()
467 {
468 return m_CurrentCameraRoll;
469 }
470
471 void ForceFreelook(bool state)
472 {
473 m_bForceFreeLook = state;
474 }
475
476 //TODO - better handling of distinct occluder types
478 void SetNVPostprocess(int NVtype)
479 {
480 //remove ALL conflicting NV occluders first
481 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
482 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER,EffectWidgetsTypes.PUMPKIN_OCCLUDER});
483
484 switch (NVtype)
485 {
486 case NVTypes.NONE:
487 {
488 PPERequesterBank.GetRequester(PPERequester_CameraNV).Stop();
489 }
490 break;
491
492 //night-vision modes
493 case NVTypes.NV_OPTICS_KAZUAR_NIGHT:
494 case NVTypes.NV_OPTICS_STARLIGHT_NIGHT:
495 case NVTypes.NV_OPTICS_ON:
496 {
497 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_DEFAULT_OPTICS) );
498 }
499 break;
500
501 //daytime filter modes
502 case NVTypes.NV_OPTICS_KAZUAR_DAY:
503 case NVTypes.NV_OPTICS_STARLIGHT_DAY:
504 {
505 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_DAYTIME_OPTICS) );
506 }
507 break;
508
509 case NVTypes.NV_GOGGLES_OFF:
510 case NVTypes.NV_OPTICS_OFF:
511 {
512 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_NO_BATTERY) );
513 }
514 break;
515
516 case NVTypes.NV_GOGGLES:
517 {
518 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_DEFAULT_GLASSES) );
519 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
520 GetGame().GetMission().GetEffectWidgets().AddActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER});
521 }
522 break;
523
524 case NVTypes.NV_GOGGLES_2D:
525 {
526 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_DEFAULT_GLASSES) );
527 }
528 break;
529
530 case NVTypes.NV_PUMPKIN:
531 {
532 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_PUMPKIN) );
533 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
534 GetGame().GetMission().GetEffectWidgets().AddActiveEffects({EffectWidgetsTypes.PUMPKIN_OCCLUDER});
535 }
536 break;
537 }
538
539 if (PlayerBaseClient.Cast(m_pPlayer))
540 {
541 PlayerBaseClient.Cast(m_pPlayer).SwitchPersonalLight(NVtype < 1);
542 }
543 }
544
545 void InitCameraOnPlayer(bool force = false)
546 {
547 PlayerBase player = PlayerBase.Cast(m_pPlayer);
548 if (!player.GetCurrentPlayerCamera() || (force && player.GetCurrentPlayerCamera() != this))
549 {
550 player.OnCameraChanged(this);
551 }
552 }
553
554 protected float m_fLRAngleVel[1];
555 protected float m_fUDAngleVel[1];
556 protected float m_fFovAbsVel[1];
557 protected float m_fFovAbsolute;
558 protected bool m_bForceFreeLook;
559 protected float m_WeaponSwayModifier;
560 protected float m_CameraPPDelay;
561
562 protected float m_CurrentCameraYaw;
563 protected float m_CurrentCameraPitch;
564 protected float m_CurrentCameraRoll;
565
566 protected HumanCommandWeapons m_CommandWeapons;
567 protected bool m_IsNightvision;
568 protected int m_NightvisionType;
569}
this is main camera class
override void SetCameraPP(bool state, DayZPlayerCamera launchedFrom)
override void SetCameraPPDelay(DayZPlayerCamera pPrevCamera)
override bool IsShootingFromCamera()
override int GetEyeZoomLevel()
Definition debug.c:2
override void RemoveActiveEffects(array< int > effects)
override void AddActiveEffects(array< int > effects)
Definition enmath.c:7
DayZGame GetDayZGame()
Definition dayzgame.c:3870
float GetCurrentRoll()
Definition dayzplayer.c:107
float GetCurrentYaw()
Definition dayzplayer.c:97
void SpawnCameraShakeProper(float strength, float radius, float smoothness, float radius_decay_speed)
DayZPlayer m_pPlayer
data
Definition dayzplayer.c:135
HumanInputController m_pInput
human input
Definition dayzplayer.c:136
float GetCurrentPitch()
Definition dayzplayer.c:102
class DayZPlayerCameraResult DayZPlayerCamera(DayZPlayer pPlayer, HumanInputController pInput)
Definition dayzplayer.c:56
float m_fFovAbsolute
fov absolute value override - -1.0 default, if set - overrides absolute fov setting
Definition dayzplayer.c:60
float m_fUDAngleVel[1]
float UpdateLRAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
ref CameraShake m_CameraShake
float m_CurrentCameraYaw
bool m_IsNightvision
float m_CurrentCameraPitch
float UpdateUDAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
int m_NightvisionType
Weapon_Base m_weaponUsed
void StdFovUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
@ NV_GOGGLES_OFF
@ NV_OPTICS_OFF
@ NV_OPTICS_STARLIGHT_DAY
@ NV_OPTICS_KAZUAR_DAY
@ NV_GOGGLES_2D
@ NV_OPTICS_STARLIGHT_NIGHT
@ NV_OPTICS_KAZUAR_NIGHT
float m_CurrentCameraRoll
bool IsCameraNV()
float fixAngle_PI_PI(float pAngle)
float UpdateLRAngle(float pAngle, float pMin, float pMax, float pDt)
bool m_bForceFreeLook
float m_CameraPPDelay
float GetWeaponSwayModifier()
void DayZPlayerCameraBase(DayZPlayer pPlayer, HumanInputController pInput)
constructor must be same
void SetNVPostprocess(int NVtype)
DayZPlayerCameraOptics handles this separately, otherwise it takes active NVType from PlayerBase::Get...
void InitCameraOnPlayer(bool force=false)
void HandleShoulderCameraOverride(HumanInputController pInput)
float fixAngle_180_180(float pAngle)
void SetCameraNV(bool nightvision)
float m_WeaponSwayModifier
enum NVTypes CONST_NEARPLANE_OPTICS_MIN
void UpdateCameraNV(PlayerBase player)
void SetCameraNVType(int type)
float m_fFovAbsVel[1]
int GetCameraNVType()
void ForceFreelook(bool state)
ItemOptics m_opticsUsed
float UpdateUDAngle(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
HumanCommandWeapons m_CommandWeapons
void ProcessCameraShake(float delta, out float leftRight, out float upDown)
float m_fLRAngleVel[1]
void DayZPlayerCameraOptics(DayZPlayer pPlayer, HumanInputController pInput)
override void Init()
Launched from 'DayZGame.DeferredInit' to make earlier access, use, and updates impossible (downside o...
ECameraZoomType
proto native CGame GetGame()
Limit
const int CALL_CATEGORY_GUI
Definition tools.c:9
HumanInputControllerOverrideType
Definition human.c:8
Icon x
Icon y
void OnActivate()