15 protected static float s_fOverlayCameraFOV;
16 protected static float s_fADSSensitivity = 1.0;
18 protected int m_iHipsBoneIndex = 0;
20 protected bool m_bCameraActive;
22 protected bool m_bTraceCharacters =
true;
24 protected ref
PointInfo m_pAttachmentReference;
34 DiagMenu.RegisterRange(
SCR_DebugMenuID.DEBUGUI_CHARACTER_DEBUG_VIEW,
"",
"Cycle Debug View",
"Character",
"0, 8, 0, 1");
35 DiagMenu.RegisterBool(
SCR_DebugMenuID.DEBUGUI_DRAW_CAMERA_COLLISION_SOLVER,
"",
"Draw Camera Collision Solver",
"Character");
42 m_OwnerCharacter = SCR_ChimeraCharacter.Cast(
GetOwner());
45 m_LoadoutStorage = EquipedLoadoutStorageComponent.Cast(m_OwnerCharacter.FindComponent(EquipedLoadoutStorageComponent));
47 m_IdentityComponent = CharacterIdentityComponent.Cast(m_OwnerCharacter.FindComponent(CharacterIdentityComponent));
50 m_iHeadBoneIndex = m_OwnerCharacter.GetAnimation().GetBoneIndex(
"Head");
51 m_iHipsBoneIndex = m_OwnerCharacter.GetAnimation().GetBoneIndex(
"Hips");
58 m_bCameraActive =
true;
60 if (m_OwnerCharacter && m_AnimationComponent)
73 if (!IsInThirdPerson() && m_OwnerCharacter)
83 m_OwnerCharacter.m_fFaceAlphaTest = a;
85 if (m_IdentityComponent)
86 m_IdentityComponent.SetHeadAlpha(a);
103 if (m_OwnerCharacter)
110 m_bCameraActive =
false;
124 private bool m_bWasVehicleADS;
129 bool CheckVehicleADS()
131 CheckIsInTurret(m_bWasVehicleADS);
132 return m_bWasVehicleADS;
139 bool CheckIsInTurret(out
bool isInAds)
142 CompartmentAccessComponent compartmentAccess = m_OwnerCharacter.GetCompartmentAccessComponent();
144 if (compartmentAccess && compartmentAccess.IsInCompartment() && !compartmentAccess.IsGettingOut())
146 BaseCompartmentSlot compartment = compartmentAccess.GetCompartment();
149 BaseControllerComponent controller = compartment.GetController();
152 controller = compartment.GetAttachedTurret();
153 if (!controller || compartment.GetAttachedTurret().GetContextIDs() !=
ETurretContextID.TURRET_OPSCONTEXT || compartment.IsOccupantTurnedOut())
159 TurretControllerComponent turretController = TurretControllerComponent.Cast(controller);
160 if(turretController && turretController.GetTurretComponent())
162 isInAds = turretController.IsWeaponADS();
164 if (!turretController.GetUseVehicleCamera() || isInAds || IsInThirdPerson())
184 return CharacterCameraSet.CHARACTERCAMERA_DEBUG;
188 if (!IsInThirdPerson())
192 return CharacterCameraSet.CHARACTERCAMERA_1ST_BONE_TRANSFORM;
195 return CharacterCameraSet.CHARACTERCAMERA_1ST_UNCONSCIOUS;
199 if (m_ControllerComponent.IsUnconscious())
200 return CharacterCameraSet.CHARACTERCAMERA_3RD_UNCONSCIOUS;
203 if (m_ControllerComponent.IsSwimming())
205 if (IsInThirdPerson())
206 return CharacterCameraSet.CHARACTERCAMERA_3RD_FLOAT;
208 return CharacterCameraSet.CHARACTERCAMERA_1ST_FLOAT;
211 if (SCR_PlayerController.s_pLocalPlayerController && SCR_PlayerController.s_pLocalPlayerController.GetIsBinocularsZoomed())
212 return CharacterCameraSet.CHARACTERCAMERA_BINOCULARS;
215 if (m_ControllerComponent.IsWeaponADS() || (m_ControllerComponent.GetInputContext().IsWeaponADS() && m_ControllerComponent.IsChangingStance()))
216 return CharacterCameraSet.CHARACTERCAMERA_ADS;
218 if (m_ControllerComponent.IsGadgetRaisedModeWanted() && !m_OwnerCharacter.IsInVehicle())
219 return CharacterCameraSet.CHARACTERCAMERA_1ST;
221 CompartmentAccessComponent compartmentAccess = m_OwnerCharacter.GetCompartmentAccessComponent();
223 if (m_ControllerComponent.GetInspect() && !m_OwnerCharacter.IsInVehicle())
224 return CharacterCameraSet.CHARACTERCAMERA_1ST;
226 bool isRolling =
false;
227 if (m_ControllerComponent.IsRoll() && m_CmdHandler)
229 CharacterCommandMove moveCmd = m_CmdHandler.GetCommandMove();
231 if (moveCmd && !moveCmd.IsBlendingOutRoll())
235 if (IsInThirdPerson())
237 if( m_OwnerCharacter.IsInVehicle() && compartmentAccess && !compartmentAccess.IsGettingOut() )
239 bool isTurretAds =
false;
240 bool inTurret = CheckIsInTurret(isTurretAds);
243 if (isTurretAds && !m_ControllerComponent.GetFreeLookInput())
244 return CharacterCameraSet.CHARACTERCAMERA_ADS_VEHICLE;
246 return CharacterCameraSet.CHARACTERCAMERA_3RD_TURRET;
249 if (m_ControllerComponent.GetInspect())
250 return CharacterCameraSet.CHARACTERCAMERA_1ST_VEHICLE;
252 return CharacterCameraSet.CHARACTERCAMERA_3RD_VEHICLE;
255 if (compartmentAccess && (compartmentAccess.IsGettingOut() || compartmentAccess.IsGettingIn()))
256 return CharacterCameraSet.CHARACTERCAMERA_3RD_ERC;
259 return CharacterCameraSet.CHARACTERCAMERA_3RD_CLIMB;
263 SCR_CharacterCommandHandlerComponent scrCmdHandler = SCR_CharacterCommandHandlerComponent.Cast(m_CmdHandler);
264 if (scrCmdHandler && scrCmdHandler.IsLoitering())
265 return CharacterCameraSet.CHARACTERCAMERA_3RD_SITTING;
273 return CharacterCameraSet.CHARACTERCAMERA_1ST_BONE_TRANSFORM;
275 return CharacterCameraSet.CHARACTERCAMERA_1ST;
278 return CharacterCameraSet.CHARACTERCAMERA_3RD_PRO;
283 return CharacterCameraSet.CHARACTERCAMERA_1ST;
285 return CharacterCameraSet.CHARACTERCAMERA_3RD_CRO;
289 return CharacterCameraSet.CHARACTERCAMERA_1ST;
291 return CharacterCameraSet.CHARACTERCAMERA_3RD_ERC;
293 else if (compartmentAccess && (compartmentAccess.IsGettingIn() || compartmentAccess.IsGettingOut()))
295 if (compartmentAccess.GetCompartment() && TurretControllerComponent.Cast(compartmentAccess.GetCompartment().GetController()))
296 return CharacterCameraSet.CHARACTERCAMERA_1ST_TURRET_TRANSITION;
297 return CharacterCameraSet.CHARACTERCAMERA_1ST_VEHICLE_TRANSITION;
299 else if( m_OwnerCharacter.IsInVehicle() )
301 bool isTurretAds =
false;
302 bool inTurret = CheckIsInTurret(isTurretAds);
305 if (isTurretAds && !m_ControllerComponent.GetFreeLookInput())
306 return CharacterCameraSet.CHARACTERCAMERA_ADS_VEHICLE;
308 BaseCompartmentSlot compartment = compartmentAccess.GetCompartment();
309 if (compartment && compartment.GetAttachedTurret())
311 return CharacterCameraSet.CHARACTERCAMERA_1ST_VEHICLE;
314 return CharacterCameraSet.CHARACTERCAMERA_1ST_TURRET;
316 else if( CheckVehicleADS() )
318 return CharacterCameraSet.CHARACTERCAMERA_ADS_VEHICLE;
321 return CharacterCameraSet.CHARACTERCAMERA_1ST_VEHICLE;
327 return CharacterCameraSet.CHARACTERCAMERA_1ST_BONE_TRANSFORM;
330 return CharacterCameraSet.CHARACTERCAMERA_1ST;
336 if (!m_ControllerComponent.GetWeaponADSInput())
339 if (m_ControllerComponent.IsSprinting() || m_ControllerComponent.IsSwimming())
351 float transTime = 0.4;
365 if (m_ControllerComponent)
367 m_fADSTime = m_ControllerComponent.GetADSTime();
380 CompartmentAccessComponent compAcc = m_OwnerCharacter.GetCompartmentAccessComponent();
381 if (compAcc && compAcc.IsInCompartment())
386 BaseControllerComponent controller = compartment.GetController();
390 if (turretController)
417 transTime = GetCameraSet().GetTransitionTime(pFrom, pTo);
426 if (m_AnimationComponent)
429 m_AnimationComponent.SetAnimationLayerTPP();
431 m_AnimationComponent.SetAnimationLayerFPP();
434 m_OnThirdPersonSwitch.Invoke(isInThirdPerson);
441 return m_OnThirdPersonSwitch;
463 m_fCameraDistanceFilter =
Math.SmoothCD(m_fCameraDistanceFilter, m_fTargetDistance, m_fCameraDistanceFilterVel, 0.3, 1000, pDt);
465 m_fCameraSlideFilter =
Math.SmoothCD(m_fCameraSlideFilter, m_fTargetSlide, m_fCameraSlideFilterVelocity, m_fSlideTime, 1000, pDt);
466 float currDiff =
Math.AbsFloat(m_fTargetSlide - m_fCameraSlideFilter);
467 if (currDiff <= DISTANCE_EPSILON)
468 m_fCameraSlideFilter = m_fTargetSlide;
472 bool isADSAllowed = m_CmdHandler && m_CmdHandler.IsWeaponADSAllowed(
false);
473 bool isWeaponADS = isADSAllowed && m_ControllerComponent.GetWeaponADSInput() && !m_ControllerComponent.IsReloading();
474 bool resetFocus =
false;
477 if (CheckIsInTurret(isWeaponADS) && m_ControllerComponent.GetFreeLookInput())
483 if (!isWeaponADS && playerController)
484 isWeaponADS = playerController.GetGadgetFocus();
491 float adsChange = pDt / adsTime;
512 if (playerController && !m_ControllerComponent.GetDisableViewControls())
526 if (IsInThirdPerson() && m_ControllerComponent && m_ControllerComponent.GetInputContext().GetDie())
561 if (
float.AlmostEqual(absDelta, 0))
575 if (m_ControllerComponent.IsDead())
578 if (GetCurrentCamera())
579 GetCurrentCamera().OnAfterCameraUpdate(pDt, pIsKeyframe, transformMS);
589 m_OwnerCharacter.GetAnimation().GetBoneMatrix(m_iHeadBoneIndex, headBoneMat);
592 m_OwnerCharacter.GetWorldTransform(charMat);
593 Math3D.MatrixMultiply4(charMat, headBoneMat, headBoneMat);
603 if (m_pRecoilShake && !m_pRecoilShake.IsFinished())
604 m_pRecoilShake.Update(m_OwnerCharacter, pDt);
613 bool applyRecoilShake =
true;
619 if (applyRecoilShake && m_pRecoilShake)
620 m_pRecoilShake.Apply(transform, fieldOfView);
623 SCR_CameraShakeManagerComponent.ApplyCameraShake(transform, fieldOfView);
629 bool current = IsInThirdPerson();
630 SetThirdPerson(!current);
643 if (pOutResult.m_fDistance <= MIN_TRACE_DISTANCE)
645 m_fCameraDistanceFilter = 0.0;
649 IEntity owner = pOutResult.m_pOwner;
650 vector ownerTransformWS[4];
654 Math3D.MatrixIdentity4(ownerTransformWS);
656 vector resultWorldTransform[4];
657 m_pAttachmentReference = pOutResult.m_pWSAttachmentReference;
658 if (pOutResult.m_pWSAttachmentReference && pOutResult.m_pWSAttachmentReference.GetOwner())
659 pOutResult.m_pWSAttachmentReference.GetWorldTransform(resultWorldTransform);
663 Math3D.MatrixIdentity4(resultWorldTransform);
665 if (pOutResult.m_bNoParent)
667 vector ypr = {
Math3D.MatrixToAngles(resultWorldTransform)[0], 0.0, 0.0};
668 Math3D.AnglesToMatrix(ypr, resultWorldTransform);
672 m_OwnerCharacter.GetAnimation().GetBoneMatrix(m_iHipsBoneIndex, hipBoneWS);
673 if (pOutResult.m_bNoParent)
674 Math3D.MatrixMultiply4(ownerTransformWS, hipBoneWS, hipBoneWS);
676 Math3D.MatrixMultiply4(resultWorldTransform, hipBoneWS, hipBoneWS);
679 vector camPos = pOutResult.m_CameraTM[3];
680 vector inputCameraPosWS = camPos.Multiply4(resultWorldTransform);
684 Math3D.MatrixCopy(pOutResult.m_CameraTM, camTransformLS);
686 vector basePos = camTransformLS[3];
689 Math3D.MatrixIdentity4(charRot);
691 if (pOutResult.m_fPositionModelSpace == 2.0)
693 camTransformLS[3] = camTransformLS[3] - resultWorldTransform[3];
697 if (pOutResult.m_fUseHeading > 0.0)
700 Math3D.AnglesToMatrix(
Vector(
Math.RAD2DEG * -pOutResult.m_fHeading, 0.0, 0.0), headingMat);
702 if (pOutResult.m_pOwner)
703 pOutResult.m_pOwner.GetLocalTransform(charRot);
707 Math3D.MatrixInvMultiply4(charRot, headingMat, charRot);
709 Math3D.MatrixToQuat(charRot, charRotQ);
710 float quatF[4] = {0.0, 0.0, 0.0, 1.0};
711 Math3D.QuatLerp(charRotQ, quatF, charRotQ, pOutResult.m_fUseHeading);
713 Math3D.AnglesToMatrix(charRotQAngles, charRot);
715 Math3D.MatrixMultiply4(charRot, camTransformLS, camTransformLS);
717 if (pOutResult.m_fDistance <= MIN_TRACE_DISTANCE)
718 camTransformLS[3] = basePos;
721 if (pOutResult.m_fPositionModelSpace > 0.0)
724 vector msPos = camTransformLS[3];
726 camTransformLS[3] =
vector.Lerp(lsPos, msPos, pOutResult.m_fPositionModelSpace);
732 if (pOutResult.m_fPositionModelSpace == 2.0)
733 Math3D.MatrixCopy(camTransformLS, camTransformWS);
735 Math3D.MatrixMultiply4(resultWorldTransform, camTransformLS, camTransformWS);
737 if (pOutResult.m_bAllowCollisionSolver && !isKeyframe && pOutResult.m_fDistance > MIN_TRACE_DISTANCE)
741 const float SIDE_TRACE_MARGIN_MULTIPLIER = 2.0;
742 const float BACK_TRACE_MARGIN_MULTIPLIER = 1.25;
745 array<IEntity> excludeArray = {m_OwnerCharacter};
748 while (parent != null)
750 excludeArray.Insert(parent);
751 while (sibling != null)
753 excludeArray.Insert(sibling);
760 const float TRACE_RADIUS = 0.06;
762 BaseWorld world = m_OwnerCharacter.GetWorld();
764 param.Radius = TRACE_RADIUS;
765 param.ExcludeArray = excludeArray;
771 if (m_ControllerComponent.IsFreeLookEnabled())
772 sideVector = resultWorldTransform[0];
774 sideVector = camTransformWS[0];
776 vector sideTraceStart = camTransformWS[3] - sideVector * pOutResult.m_fShoulderDist;
777 vector sideTraceEnd = camTransformWS[3];
779 vector sideTraceDiff = sideTraceEnd - sideTraceStart;
782 param.Start = sideTraceStart;
783 param.End = sideTraceStart + SIDE_TRACE_MARGIN_MULTIPLIER * sideTraceDiff;
786 if (!m_bTraceCharacters)
789 rightTrace = world.TraceMove(param, null);
794 ApplySmoothedSlide(pDt, rightTrace, sideTraceStart, sideTraceDiff, SIDE_TRACE_MARGIN_MULTIPLIER, pOutResult.m_fShoulderDist, camTransformWS);
796 sideTraceEnd =
vector.Lerp(param.Start, param.End, rightTrace);
801 Math3D.MatrixInvMultiply4(resultWorldTransform, camTransformWS, camTransformLS);
804 vector backtraceDir = pOutResult.m_vBacktraceDir.Multiply3(charRot).Multiply3(resultWorldTransform);
805 backtraceDir =
vector.Lerp(camTransformWS[2], backtraceDir, pOutResult.m_fUseBacktraceDir);
808 vector backTraceStart = camTransformWS[3];
809 vector backTraceEnd = camTransformWS[3] - BACK_TRACE_MARGIN_MULTIPLIER * pOutResult.m_fDistance * backtraceDir;
813 float rayBackTrace[N];
814 SCR_Math3D.LookAt(backTraceStart, backTraceEnd, { 0, 1, 0 }, traceMat);
815 vector traceOffsets[N] = {
816 TRACE_RADIUS * traceMat[0],
817 TRACE_RADIUS * traceMat[1],
818 TRACE_RADIUS * -traceMat[0],
819 TRACE_RADIUS * -traceMat[1]
822 if (pOutResult.m_fPositionModelSpace <= 2.0 && pOutResult.m_fDistance > MIN_TRACE_DISTANCE)
825 if (m_CharMovementState.m_iStanceIdx !=
ECharacterStance.PRONE || m_OwnerCharacter.IsInVehicle() || !m_ControllerComponent.IsFreeLookEnabled())
826 rayParam.ExcludeArray = excludeArray;
831 for (
int i = 0; i < N; ++i)
833 rayParam.Start = backTraceStart + traceOffsets[i];
834 rayParam.End = backTraceEnd + traceOffsets[i];
836 if (!m_bTraceCharacters)
837 rayBackTrace[i] =
ChimeraCharacter.TraceMoveWithoutCharacters(world, rayParam);
839 rayBackTrace[i] = world.TraceMove(rayParam, null);
840 backTrace =
Math.Min(backTrace, rayBackTrace[i]);
844 backTrace =
Math.Max(0, backTrace - TRACE_RADIUS);
848 backTrace = BACK_TRACE_MARGIN_MULTIPLIER * backTrace;
850 float newDistance = pOutResult.m_fDistance *
Math.Min(1.0, backTrace);
852 if (newDistance < DISTANCE_EPSILON)
855 if (
Math.AbsFloat(m_fCameraDistanceFilter - newDistance) < DISTANCE_EPSILON && m_fCameraDistanceFilterVel != 0.0)
856 m_fCameraDistanceFilterVel = 0.0;
859 m_fTargetDistance = newDistance;
860 if(IsCameraBlending() || newDistance < m_fCameraDistanceFilter)
861 m_fCameraDistanceFilter = newDistance;
863 pOutResult.m_fDistance = m_fCameraDistanceFilter;
869 int baseColor =
ARGB(255, 0, 110, 255);
872 Shape.CreateSphere(
ARGB(255, 255, 255, 255), shFlags, inputCameraPosWS, param.Radius);
874 Shape.CreateSphere(
ARGB(255, 0, 255, 0), shFlags, sideTraceStart, param.Radius);
875 Shape.CreateSphere(
ARGB(255, 255, 255 * rightTrace, 0), shFlags, sideTraceEnd, param.Radius);
877 for (
int i = 0; i < N; ++i)
879 vector rayStart = backTraceStart + traceOffsets[i];
880 vector rayEnd = backTraceEnd + traceOffsets[i];
882 Shape.CreateSphere(
ARGB(255, 150, 0, 255), shFlags, rayStart, param.Radius * 0.2);
883 Shape.CreateSphere(
ARGB(255, 0, 255, 255), shFlags,
vector.Lerp(rayStart, rayEnd,
Math.Lerp(0.05, 0.4, backTrace) * rayBackTrace[i]), param.Radius * 0.1);
888 Shape.CreateSphere(
ARGB(255, 255, 255 * backTrace, 0), shFlags, backTraceStart + (backTraceEnd - backTraceStart).Normalized() * (m_fCameraDistanceFilter - param.Radius), param.Radius * (1 - backTrace));
894 Math3D.MatrixCopy(camTransformLS, resCamTM);
896 if (pOutResult.m_fPositionModelSpace < 2.0 && pOutResult.m_fDistance > MIN_TRACE_DISTANCE)
898 vector camBoomDir = pOutResult.m_vBacktraceDir.Multiply3(charRot);
899 camBoomDir =
vector.Lerp(resCamTM[2], camBoomDir, pOutResult.m_fUseBacktraceDir);
901 resCamTM[3] = resCamTM[3] - pOutResult.m_fDistance * camBoomDir;
906 private void UpdateViewBob(
float pDt)
908 int stance = m_ControllerComponent.GetStance();
911 float freeLookOffsetScale = 0;
912 if (m_ControllerComponent.IsFreeLookEnabled() || m_ControllerComponent.IsTrackIREnabled())
913 freeLookOffsetScale = 1;
915 m_fBobFreelokFilter = Math.SmoothCD(m_fBobFreelokFilter, 1 - Math.Pow(1 - freeLookOffsetScale, 3), m_fBobFreelokFilterVel, 0.3, 1000, pDt);
916 freeLookOffsetScale = m_fBobFreelokFilter;
919 m_fBob_ScaleFast = Math.Clamp(m_ControllerComponent.GetVelocity().Length() / Math.Max(
m_AnimationComponent.GetTopSpeed(-1,
false), 0.1), 0, 1);
920 m_fBob_ScaleSlow += (m_fBob_ScaleFast - m_fBob_ScaleSlow) * (pDt * 4);
922 m_fBob_ScaleFast = Math.Pow(m_fBob_ScaleSlow, 3);
923 m_fBob_ScaleFast = Math.Clamp(m_fBob_ScaleFast + freeLookOffsetScale * m_fBob_ScaleFast, 0, 1);
924 if (m_fBob_ScaleFast < 0.01)
926 m_fBob_Up *= 1 - pDt;
927 m_fBob_Right *= 1 - pDt;
931 float stanceBobScale = 0.5;
933 stanceBobScale = 0.25;
935 stanceBobScale = 0.55;
937 m_fBob_Up += Math.Clamp(pDt * 2 * stanceBobScale * m_fBob_ScaleFast, 0, 1);
941 m_fBob_Right += Math.Clamp(pDt * 2.5 * stanceBobScale * m_fBob_ScaleFast, 0, 1);
942 if (m_fBob_Right >= 1)
953 float AddViewBobToTransform(inout vector pOutTransform[4],
float pBobScale,
bool pAllowTranslation)
956 float bobMoveScale = (m_fBob_ScaleFast * 0.8 + 0.2) * pBobScale;
957 if( pAllowTranslation )
959 float freeLookOffsetScale = m_fBobFreelokFilter;
960 float bobFw = m_fBob_ScaleSlow * -0.5 * m_fBob_ScaleFast * (1 - freeLookOffsetScale);
961 float bobUp = Math.Sin(m_fBob_Up * 360 * Math.DEG2RAD) * 0.02 * bobMoveScale;
962 float bobRt = Math.Sin(m_fBob_Right * 360 * Math.DEG2RAD) * 0.015 * bobMoveScale;
963 bobRt += m_fBob_ScaleSlow * -0.2 * m_fBob_ScaleFast;
964 vector bobTranslation = pOutTransform[0] * bobRt + pOutTransform[3];
965 bobTranslation = pOutTransform[1] * bobUp + bobTranslation;
966 pOutTransform[3] = pOutTransform[2] * bobFw + bobTranslation;
969 vector angBob = vector.Zero;
970 angBob[0] = Math.Sin(m_fBob_Up * 360 * Math.DEG2RAD) * 0.3 * bobMoveScale;
971 angBob[1] = Math.Sin(m_fBob_Right * 360 * Math.DEG2RAD) * 0.3 * bobMoveScale;
973 vector angBobMat[3], endBobmat[3];
974 Math3D.AnglesToMatrix(angBob * pBobScale, angBobMat);
975 Math3D.MatrixMultiply3(angBobMat, pOutTransform, endBobmat);
976 pOutTransform[0] = endBobmat[0];
977 pOutTransform[1] = endBobmat[1];
978 pOutTransform[2] = endBobmat[2];
980 return m_fBob_ScaleFast;
985 bool Is3rdPersonView()
987 return !
IsDebugView() && IsInThirdPerson() && !(m_ControllerComponent && m_ControllerComponent.IsWeaponADS());
990 private SCR_ChimeraCharacter m_OwnerCharacter;
991 private SCR_CharacterControllerComponent m_ControllerComponent;
994 private EquipedLoadoutStorageComponent m_LoadoutStorage;
995 private CharacterIdentityComponent m_IdentityComponent;
996 private CharacterCommandHandlerComponent m_CmdHandler;
998 private bool m_bApplySmoothedSlideThisFrame =
true;
999 private float m_fTargetSlide = 1;
1000 private float m_fSlideTime = 0.4;
1001 private float m_fCameraSlideFilter = 0;
1002 private float m_fCameraSlideFilterVelocity = 0;
1003 private float m_fChangedTimer = 0;
1004 private float m_fSlideTimeout = 0.4;
1005 private float m_fBob_Up = 0;
1006 private float m_fBob_Right = 0;
1007 private float m_fBob_ScaleSlow = 0;
1008 private float m_fBob_ScaleFast = 0;
1009 private int m_iHeadBoneIndex = -1;
1010 private float m_fTargetDistance = 0.0;
1011 private float m_fCameraDistanceFilter;
1012 private float m_fCameraDistanceFilterVel;
1013 private float m_fBobFreelokFilter;
1014 private float m_fBobFreelokFilterVel;
1015 private bool m_bPrevSlideDirectionInside =
false;
1016 private bool m_b3rdCollision_UseLeftShoulder =
false;
1018 private ref CharacterMovementState m_CharMovementState =
new CharacterMovementState();
1020 private static const float DISTANCE_EPSILON = 0.0001;
1021 private static const float MIN_TRACE_DISTANCE = 0.001;
1024 private void ResetSlide()
1026 m_fCameraSlideFilter = 1;
1028 m_fCameraSlideFilterVelocity = 0;
1029 m_fChangedTimer = 0;
1033 private bool ApplySmoothedSlide(
float pDt,
float slide, vector sideTraceStart, vector sideTraceDiff,
float sideTraceMarginMultiplier,
float shoulderDist, inout vector inoutMat[4])
1036 m_bApplySmoothedSlideThisFrame =
false;
1038 bool slideInside = Math.AbsFloat(slide) < Math.AbsFloat(m_fCameraSlideFilter);
1040 if (m_bPrevSlideDirectionInside && !slideInside)
1041 m_fChangedTimer = m_fSlideTimeout;
1043 m_bPrevSlideDirectionInside = slideInside;
1045 if (m_fChangedTimer > 0)
1047 m_fChangedTimer = m_fChangedTimer - pDt;
1051 if (Math.AbsFloat(shoulderDist) < 0.98 && m_fCameraSlideFilter > slide)
1053 m_fCameraSlideFilter = slide;
1054 m_fCameraSlideFilterVelocity = 0;
1055 inoutMat[3] = sideTraceStart + sideTraceDiff * m_fCameraSlideFilter;
1060 if (slideInside && m_fCameraSlideFilter > slide * sideTraceMarginMultiplier)
1062 m_fCameraSlideFilter = slide;
1063 m_fCameraSlideFilterVelocity = m_fSlideTimeout * (slide - m_fCameraSlideFilterVelocity);
1067 if (IsCameraBlending())
1068 m_fChangedTimer = 0;
1070 if (m_fChangedTimer <= 0 && m_fCameraSlideFilter != slide)
1072 float slideTime = m_fSlideTimeout;
1078 float slideT = sideTraceMarginMultiplier * ((m_fCameraSlideFilter)/Math.Max(0.01, slide * sideTraceMarginMultiplier) - (1/sideTraceMarginMultiplier));
1079 slideTime = Math.Lerp(0.1, m_fSlideTimeout, Math.Clamp(slideT, 0, 1));
1083 m_bApplySmoothedSlideThisFrame =
true;
1084 m_fTargetSlide = slide;
1085 m_fSlideTime = slideTime;
1089 inoutMat[3] = sideTraceStart + sideTraceDiff * m_fCameraSlideFilter;
1096 if (!m_ControllerComponent)
1099 if (m_ControllerComponent.IsFreeLookEnabled())
1118 return m_pRecoilShakeParams;
1123 static void SetOverlayCameraFOV(
float fov)
1125 s_fOverlayCameraFOV = fov;
1130 static void SetADSSensitivity(
float sensitivity)
1132 s_fADSSensitivity = sensitivity;
1136 protected override event float CalculateFovScalar(notnull CameraBase mainCamera, CameraBase overlayCamera)
1138 float fov = mainCamera.GetVerticalFOV();
1143 float sensitivity = 1.0;
1147 float referenceFOV = 28;
1148 PlayerCamera playerCamera = PlayerCamera.Cast(mainCamera);
1150 referenceFOV = playerCamera.GetFocusFOV();
1152 return sensitivity * fov / referenceFOV;
1159 return m_bCameraActive;
1166 m_bTraceCharacters = bTraceCharacters;
void OnAlphatestChange(int a)
void UpdateShake(float pDt)
float m_fFocusDeceleration
void OnCameraSwitchPressed()
void SetTraceCharacters(bool bTraceCharacters)
bool m_bDoInterpolateFocus
const float FOCUS_DEFAULT_ADS_TIME
ScriptInvokerVoid GetThirdPersonSwitchInvoker()
void UpdateHeadVisibility(vector cameraPositionWS)
bool ShouldForceFirstPersonInThirdPerson(CharacterControllerComponent controller)
const float FOCUS_ADS_TIME_RATIO
float m_fFocusTargetValue
float m_fAutoFocusProgress
const float FOCUS_DECELERATION_RATIO
bool CanUseOverlayCameraFOV()
SCR_RecoilCameraShakeParams GetRecoilShakeParams()
void AddShakeToToTransform(inout vector transform[4], inout float fieldOfView)
const int TRACE_LAYER_CAMERA
ArmaReforgerScripted GetGame()
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
InputManager m_InputManager
CharacterAnimationComponent m_AnimationComponent
ScriptInvokerBase< ScriptInvokerVoidMethod > ScriptInvokerVoid
event void CollisionSolver(float pDt, inout ScriptedCameraItemResult pOutResult, inout vector resCamTM[4], bool isKeyframe)
collision solver
event void OnBeforeCameraUpdate(float pDt, bool pIsKeyframe)
before camera update
event int CameraSelector()
selects next camera
event float GetCameraTransitionTime(int pFrom, int pTo)
get how long should transition between given cameras be
event void OnCameraDeactivate()
deactivation
float CalculateFovScalar(notnull CameraBase mainCamera, CameraBase overlayCamera)
event float GetOverlayCameraFOVScalarWeight()
event void OnCameraActivate()
activation
event void OnThirdPersonSwitch(bool isInThirdPerson)
when we switch between FPP and TPP
event void Init()
initialization
event void OnAfterCameraUpdate(float pDt, bool pIsKeyframe, inout vector transformMS[4], inout vector transformWS[4])
after camera update
proto external Managed FindComponent(typename typeName)
proto external void GetWorldTransform(out vector mat[])
See IEntity::GetTransform.
proto external IEntity GetParent()
proto external IEntity GetSibling()
PointInfo - allows to define position.
SCR_ScriptedCharacterInputContext GetScrInputContext()
Contains various scripted 3D math functions.
proto external GenericEntity GetOwner()
Get owner entity.
Instance of created debug visualizer.
SCR_FieldOfViewSettings Attribute
proto external PlayerController GetPlayerController()
proto native vector Vector(float x, float y, float z)
proto int ARGB(int a, int r, int g, int b)