123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571 |
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPerson - base for 3rd person cameras
- // *************************************************************************************
- class DayZPlayerCamera3rdPerson extends DayZPlayerCameraBase
- {
- static const float CONST_UD_MIN = -85.0; //!< down limit
- static const float CONST_UD_MAX = 85.0; //!< up limit
- static const float CONST_LR_MIN = -160.0; //!< down limit
- static const float CONST_LR_MAX = 160.0; //!< up limit
-
- void DayZPlayerCamera3rdPerson(DayZPlayer pPlayer, HumanInputController pInput)
- {
- if (pInput.Camera3rdIsRightShoulder())
- {
- m_fCameraLRShoulder = 1.0;
- }
- else
- {
- m_fCameraLRShoulder = -1.0;
- }
- m_fCameraLRShoulderVel[0] = 0.0;
- m_CurrentCameraRoll = 0.0;
- m_WeaponSwayModifier = 1;
- m_fLeanDistance = 0.3;
- m_fPredictCollisionRadius = 0.5;
- }
-
- //
- override void OnActivate(DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult)
- {
- super.OnActivate(pPrevCamera, pPrevCameraResult);
- if (pPrevCamera)
- {
- vector baseAngles = pPrevCamera.GetBaseAngles();
- m_fUpDownAngle = baseAngles[0];
- m_fLeftRightAngle = baseAngles[1];
- vector addAngles = pPrevCamera.GetAdditiveAngles();
- m_fUpDownAngleAdd = addAngles[0];
- m_fLeftRightAngleAdd = addAngles[1];
- }
- }
- //
- override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
- {
- m_pPlayer.GetMovementState(m_MovementState);
- //! update angles from input
- m_CurrentCameraYaw = UpdateLRAngleUnlocked(m_fLeftRightAngle, m_fLeftRightAngleAdd, CONST_LR_MIN, CONST_LR_MAX, pDt);
- m_CurrentCameraPitch = UpdateUDAngleUnlocked(m_fUpDownAngle, m_fUpDownAngleAdd, CONST_UD_MIN, CONST_UD_MAX, pDt);
- ProcessCameraShake(pDt, m_fLeftRightAngle, m_fUpDownAngleAdd);
- // update l/r offsets and set it as
- if (m_pInput.Camera3rdIsRightShoulder())
- {
- m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, 1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
- }
- else
- {
- m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, -1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
- }
- float shoulderDist = m_fCameraLRShoulder * m_fShoulderWidth + m_MovementState.m_fLeaning * m_fLeanDistance;
-
- //!
- Math3D.YawPitchRollMatrix(GetCurrentOrientation(), pOutResult.m_CameraTM);
- //! base bone pos
- if (m_iBoneIndex != -1)
- {
- pOutResult.m_CameraTM[3] = m_pPlayer.GetBonePositionMS(m_iBoneIndex);
- }
- else
- {
- pOutResult.m_CameraTM[3] = "0 0 0";
- }
- //! apply shoulder dist
- vector msOffset = m_CameraOffsetMS;
- vector lsOffset = m_CameraOffsetLS;
- if (m_bShoulderInLS)
- {
- lsOffset[0] = lsOffset[0] + shoulderDist;
- }
- else
- {
- msOffset[0] = msOffset[0] + shoulderDist;
- }
- // ls offset + ms offset + shoulder width
- 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;
- //! store distance
- pOutResult.m_fDistance = m_fDistance;
- pOutResult.m_fUseHeading = 1.0;
- pOutResult.m_fInsideCamera = 0.0;
- pOutResult.m_fPredictCollisionRadius = m_fPredictCollisionRadius;
-
- InitCameraOnPlayer();
- StdFovUpdate(pDt, pOutResult);
- UpdateCameraNV(PlayerBase.Cast(m_pPlayer));
- }
- override vector GetBaseAngles()
- {
- vector a;
- a[0] = m_fUpDownAngle;
- a[1] = m_fLeftRightAngle;
- a[2] = 0;
- return a;
- }
- override vector GetAdditiveAngles()
- {
- vector a;
- a[0] = m_fUpDownAngleAdd;
- a[1] = m_fLeftRightAngleAdd;
- a[2] = 0;
- return a;
- }
-
- override string GetCameraName()
- {
- return "DayZPlayerCamera3rdPerson";
- }
- //! runtime config
- protected int m_iBoneIndex = -1; //!< main bone
- protected vector m_CameraOffsetMS; //!< model space offset
- protected vector m_CameraOffsetLS; //!< local space offset
- protected float m_fDistance; //!< distance from start
- protected float m_fShoulderWidth; //!< shoulder camera widths
- protected bool m_bShoulderInLS; //!< true - shoulder is in local space
- protected float m_fRoll; //!< camera roll (deprecated)
- protected float m_fLeanDistance; //!< shift on leaning
- //! runtime values
- protected float m_fUpDownAngle; //!< up down angle in rad
- protected float m_fUpDownAngleAdd; //!< up down angle in rad
- protected float m_fLeftRightAngle; //!< left right angle in rad (in freelook only)
- protected float m_fLeftRightAngleAdd; //!< left right angle in rad (in freelook only)
- //! shoulder offsets
- protected float m_fCameraLRShoulder; // -1..1 shoulderness :)
- protected float m_fCameraLRShoulderVel[1]; // 0
-
- //! collision prediction
- protected float m_fPredictCollisionRadius;
-
- //! movement state
- ref HumanMovementState m_MovementState = new HumanMovementState();
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonErc - 3rd person erected
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonErc extends DayZPlayerCamera3rdPerson
- {
- void DayZPlayerCamera3rdPersonErc(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonErc");
-
- m_fDistance = 1.6;
- m_CameraOffsetMS = "0.0 1.4 0.0";
- m_CameraOffsetLS = "0.0 0.3 0.0";
- m_fShoulderWidth = 0.3;
- m_fPredictCollisionRadius = 1.2;
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonJump - 3rd person jump
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonJump extends DayZPlayerCamera3rdPersonErc
- {
- void DayZPlayerCamera3rdPersonJump(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonJump");
-
- //! runtime config
- m_fDelay = 0.15;
- m_fDamping = 0.25;
-
- //! runtime values
- m_fJumpStartY = pPlayer.GetOrigin()[1];
- m_fJumpOffset = 0;
- m_fDelayTimer = 0;
- }
-
- //
- override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
- {
- super.OnUpdate(pDt, pOutResult);
- float yPos = m_pPlayer.GetOrigin()[1];
- float yDiff = yPos - m_fJumpStartY;
- yDiff = Math.Clamp(yDiff, 0.0, 2.0);
-
- if( m_fDelayTimer < m_fDelay )
- {
- m_fDelayTimer += pDt;
- m_fJumpOffset = yDiff;
- }
- else
- {
- m_fJumpOffset = Math.SmoothCD(m_fJumpOffset, -(m_fDamping * yDiff), m_jumpOffsetVelocity, 0.3, 1000, pDt);
- }
-
- float newY = pOutResult.m_CameraTM[3][1] - m_fJumpOffset;
- pOutResult.m_CameraTM[3][1] = newY;
- }
- //! runtime config
- float m_fDelay;
- float m_fDamping;
- //! runtime values
- float m_fDelayTimer;
- float m_fJumpStartY;
- float m_fJumpOffset;
- float m_jumpOffsetVelocity[1];
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonJump - 3rd person jump
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonClimb extends DayZPlayerCamera3rdPersonErc
- {
- void DayZPlayerCamera3rdPersonClimb(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonClimb");
- m_fDistance = 1.0;
- m_CameraOffsetMS = "0.0 0.3 -0.6";
- m_iBoneIndex = pPlayer.GetBoneIndexByName("Spine");
- m_fPredictCollisionRadius = 0.5;
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonErc - 3rd person erected sprint
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonErcSpr extends DayZPlayerCamera3rdPersonErc
- {
- void DayZPlayerCamera3rdPersonErcSpr(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonErcSpr");
-
- m_fDistance = 2.0;
- m_CameraOffsetMS = "0.0 1.3 0.0";
- m_CameraOffsetLS = "0.0 0.3 0.0";
- m_fShoulderWidth = 0.15;
-
- m_iPelvisBone = pPlayer.GetBoneIndexByName("Pelvis");
- if (m_iPelvisBone == -1)
- {
- Print("DayZPlayerCamera3rdPersonErcSpr: hips bone not found");
- }
- m_fTime = 0.0;
- }
- //
- override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
- {
- m_fTime += pDt * 5;
-
- vector tm[4];
- m_pPlayer.GetBoneTransformLS(m_iPelvisBone, tm);
- //! basically -> transform up vector (0,1,0) and read x coord -> and set is as roll
- float xShift = tm[1][0];
- m_CurrentCameraRoll = xShift * 3.0; // 3 is just made up value i like :)
- // m_CurrentCameraRoll = (sin(1.5 * m_fTime)); // + 0.3 * sin(3.6 * m_fTime) + 0.2 * sin(0.7 * m_fTime)) / 1.3 * 3;
- //! prev update
- super.OnUpdate(pDt, pOutResult);
-
- //pOutResult.m_fFovMultiplier = 1.2;
- }
-
- protected int m_iPelvisBone;
- protected float m_fTime;
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonErcRaised - 3rd person erected raised
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonErcRaised extends DayZPlayerCamera3rdPersonErc
- {
- void DayZPlayerCamera3rdPersonErcRaised(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonErcRaised");
- m_fPredictCollisionRadius = 0.2;
- if ( pPlayer.GetCurrentPerItemCameraUD () == DayZPlayerCameras.PERITEMUD_EMPTYHANDED )
- {
- // no item in hands
- m_fDistance = 1.2;
- m_fShoulderWidth = 0.4;
- m_CameraOffsetMS = "0.0 1.3 0.2";
- m_CameraOffsetLS = "0.0 0.3 0.0";
-
- }
- else if ( pPlayer.GetCurrentPerItemCameraUD () == DayZPlayerCameras.PERITEMUD_TWOHANDED )
- {
- // two handed
- m_fDistance = 1.2;
- m_fShoulderWidth = 0.4;
- m_CameraOffsetMS = "0.0 1.3 0.2";
- m_CameraOffsetLS = "0.0 0.3 0.0";
- }
- else if ( pPlayer.GetCurrentPerItemCameraUD () == DayZPlayerCameras.PERITEMUD_ONEHANDED )
- {
- // one handed
- m_fDistance = 1.2;
- m_fShoulderWidth = 0.4;
- m_CameraOffsetMS = "0.0 1.3 0.2";
- m_CameraOffsetLS = "0.0 0.3 0.0";
- }
- else
- {
- // weapons in hands
- m_fDistance = 0.8;
- m_CameraOffsetMS = "0.0 1.3 0.2";
- m_CameraOffsetLS = "0.0 0.3 0.0";
- m_fShoulderWidth = 0.5;
- }
- }
-
- override bool IsCamera3rdRaised()
- {
- return true;
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonErcRaised - 3rd person erected raised
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonErcRaisedMelee extends DayZPlayerCamera3rdPersonErcRaised
- {
- override void HandleShoulderCameraOverride(HumanInputController pInput)
- {
- //! override - stay at current state
- pInput.Override3rdIsRightShoulder(HumanInputControllerOverrideType.ENABLED, pInput.Camera3rdIsRightShoulder());
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonCrouch - 3rd person crouch
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonCrouch extends DayZPlayerCamera3rdPerson
- {
- static const float CONST_CAMERAMOVEMENTHEIGH = 0.4; // 0 idle, 0.15 walk 0.3 run/sprint
- void DayZPlayerCamera3rdPersonCrouch (DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonCrouch");
-
- m_fDistance = 1.4;
- m_CameraOffsetMS = "0.0 0.7 0.1";
- m_CameraOffsetLS = "0.0 0.3 0.0";
- m_fShoulderWidth = 0.3;
- }
- //
- override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
- {
- m_pPlayer.GetMovementState(m_MovementState);
- //! movement height
- float movement = (Limit(m_MovementState.m_iMovement, 1, 3) - 1.0) * 0.5;
- movement *= CONST_CAMERAMOVEMENTHEIGH;
- m_fCameraHeight = Math.SmoothCD(m_fCameraHeight, movement, m_fCameraHeightVel, 0.2, 1000, pDt);
- m_CameraOffsetMS[1] = 0.7 + m_fCameraHeight;
-
- //! prev update
- super.OnUpdate(pDt, pOutResult);
- }
- protected float m_fCameraHeight; // -1..1 shoulderness :)
- protected float m_fCameraHeightVel[1]; // 0
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonCrouchRaised- 3rd person crouch raised
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonCrouchRaised extends DayZPlayerCamera3rdPersonCrouch
- {
- void DayZPlayerCamera3rdPersonCrouchRaised(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonCrouchRaised");
-
- m_fDistance = 0.8;
- m_CameraOffsetMS = "0.0 0.8 0.1"; // being overwritten by m_CameraOffsetMS[1] from DayZPlayerCamera3rdPersonCrouch
- m_CameraOffsetLS = "0.0 0.3 0.0";
- m_fShoulderWidth = 0.5;
- }
-
- override bool IsCamera3rdRaised()
- {
- return true;
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonProneRaised - 3rd person prone raised
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonProneBase extends DayZPlayerCamera3rdPerson
- {
- protected vector m_BaseOffset
- protected float m_BaseOffsetVelX[1], m_BaseOffsetVelY[1], m_BaseOffsetVelZ[1];
- protected float m_LookAtLRAngle;
-
- float UpdateLRAngleLookAt(float pMin, float pMax, float pDt)
- {
- //! lr angle
- if (m_pInput.CameraIsFreeLook() || m_bForceFreeLook)
- {
- m_LookAtLRAngle += m_pInput.GetAimChange()[0] * Math.RAD2DEG;
- m_LookAtLRAngle = Limit(m_LookAtLRAngle, pMin, pMax);
- m_fLRAngleVel[0] = 0; // reset filter
- }
- else
- {
- // smooth value back to 0
- m_LookAtLRAngle = Math.SmoothCD(m_LookAtLRAngle, 0, m_fLRAngleVel, 0.14, 1000, pDt);
- // m_fLeftRightAngle = 0.9 * (1.0 - pDt);
- }
- return m_LookAtLRAngle;
- }
- override void OnActivate(DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult)
- {
- super.OnActivate(pPrevCamera, pPrevCameraResult);
- if (m_iBoneIndex != -1)
- {
- m_BaseOffset = m_pPlayer.GetBonePositionMS(m_iBoneIndex);
- }
- else
- {
- m_BaseOffset = "0 0 0";
- }
- }
- //
- override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
- {
- //! update angles from input
- m_CurrentCameraPitch = UpdateUDAngleUnlocked(m_fUpDownAngle, m_fUpDownAngleAdd, CONST_UD_MIN, CONST_UD_MAX, pDt);
- float orientYaw = m_pPlayer.GetOrientation()[0];
- float headYaw = m_pInput.GetHeadingAngle() * Math.RAD2DEG; //! this is actually negative to yaw
- m_CurrentCameraYaw = -fixAngle_180_180(orientYaw + headYaw);
- // Print("OY: " + orientYaw.ToString() + " HY: " + headYaw.ToString());
-
- // update l/r offsets and set it as
-
- ProcessCameraShake(pDt, m_fLeftRightAngle, m_fUpDownAngleAdd);
-
- if (m_pInput.Camera3rdIsRightShoulder())
- {
- m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, 1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
- }
- else
- {
- m_fCameraLRShoulder = Math.SmoothCD(m_fCameraLRShoulder, -1.0, m_fCameraLRShoulderVel, 0.14, 1000, pDt);
- }
- float shoulderDist = m_fCameraLRShoulder * m_fShoulderWidth;
-
- //!
- Math3D.YawPitchRollMatrix(GetCurrentOrientation(), pOutResult.m_CameraTM);
- //! base bone pos
- if (m_iBoneIndex != -1)
- {
- vector bonePos = m_pPlayer.GetBonePositionMS(m_iBoneIndex);
- m_BaseOffset[0] = Math.SmoothCD(m_BaseOffset[0], bonePos[0], m_BaseOffsetVelX, 0.14, 1000, pDt);
- m_BaseOffset[1] = Math.SmoothCD(m_BaseOffset[1], bonePos[1], m_BaseOffsetVelY, 0.14, 1000, pDt);
- m_BaseOffset[2] = Math.SmoothCD(m_BaseOffset[2], bonePos[2], m_BaseOffsetVelZ, 0.14, 1000, pDt);
- }
- //! apply shoulder dist
- vector msOffset = m_CameraOffsetMS;
- vector lsOffset = m_CameraOffsetLS;
-
- lsOffset[0] = lsOffset[0] + shoulderDist;
- // ls offset + ms offset + shoulder width
- 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;
- m_CurrentCameraYaw = UpdateLRAngleLookAt(-180, 180, pDt);
- Math3D.YawPitchRollMatrix(GetCurrentOrientation(), pOutResult.m_CameraTM);
- //! store distance
- pOutResult.m_fDistance = m_fDistance;
- pOutResult.m_fUseHeading = 1.0;
- pOutResult.m_fInsideCamera = 0.0;
- pOutResult.m_fPositionModelSpace = 1.0;
- pOutResult.m_bUpdateWhenBlendOut = false;
-
- InitCameraOnPlayer();
- StdFovUpdate(pDt, pOutResult);
- UpdateCameraNV(PlayerBase.Cast(m_pPlayer));
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonProne - 3rd person prone
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonProne extends DayZPlayerCamera3rdPersonProneBase
- {
- void DayZPlayerCamera3rdPersonProne(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonProne");
- m_iBoneIndex = pPlayer.GetBoneIndexByName ("Camera3rd_Helper");
- m_fDistance = 1.0;
- m_CameraOffsetMS = "0.0 0.4 0.0";
- m_CameraOffsetLS = "0.0 0.2 0.0";
- m_fShoulderWidth = 0.5;
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonProneRaised - 3rd person prone raised
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonProneRaised extends DayZPlayerCamera3rdPersonProneBase
- {
- void DayZPlayerCamera3rdPersonProneRaised(DayZPlayer pPlayer, HumanInputController pInput)
- {
- //Print("new camera: DayZPlayerCamera3rdPersonProneRaised");
- m_iBoneIndex = pPlayer.GetBoneIndexByName ("Camera3rd_Helper");
- m_fDistance = 1.0;
- m_CameraOffsetMS = "0.0 0.4 0.0";
- m_CameraOffsetLS = "0.0 0.2 0.0";
- m_fShoulderWidth = 0.5;
- }
-
- override bool IsCamera3rdRaised()
- {
- return true;
- }
- }
|