5 [
Attribute(
"{EF091399D840192D}UI/layouts/Sights/PictureInPictureSightsLayout.layout",
UIWidgets.ResourcePickerThumbnail,
"The layout used for the PIP component",
params:
"layout",
category:
"PiPSights")]
18 protected float m_fNearPlane;
21 protected float m_fFarPlane;
25 protected float m_fResolutionScale;
32 protected float m_fADSActivationPercentagePIP;
36 protected float m_fADSDeactivationPercentagePIP;
39 protected float m_fVignetteParallaxScale;
41 [
Attribute(
"0.014",
UIWidgets.Slider,
"Optimal distance from scope, where no parallax distant effect is present\n[m]",
params:
"-0.2 0.2 0.001",
category:
"PiPSights-Parallax")]
42 protected float m_fCenterDistance;
45 protected float m_fDistanceMoveNear;
48 protected float m_fDistanceMoveFar;
53 [
Attribute(
"1.75",
UIWidgets.Slider,
"Max parallax value for simulating parallax effect\nShould be bigger than BasicParallax\n",
params:
"0 2 0.001",
category:
"PiPSights-Parallax")]
57 protected float m_fCenterOffsetX;
60 protected float m_fCenterOffsetY;
63 protected float m_fReticlePIPScale;
66 protected float m_fObjectivePIPEdgeMin;
69 protected float m_fObjectivePIPEdgeMax;
72 protected vector m_vMainCameraOffsetUnfocused;
74 [
Attribute(
"{5366CEDE2A151631}Terrains/Common/Water/UnderWater/oceanUnderwater.emat",
UIWidgets.ResourcePickerThumbnail,
"Underwater postprocess material\n",
params:
"emat",
category:
"PiPSights")]
77 [
Attribute(
"{FA4DE95A7276143D}Common/Postprocess/rain.emat",
UIWidgets.ResourcePickerThumbnail,
"Rain postprocess material\n",
params:
"emat",
category:
"PiPSights")]
101 return m_fResolutionScale;
107 return m_fADSActivationPercentagePIP;
113 return m_fADSDeactivationPercentagePIP;
119 return m_fVignetteParallaxScale;
125 return m_fCenterDistance;
131 return m_fDistanceMoveNear;
137 return m_fDistanceMoveFar;
155 return m_fCenterOffsetX;
161 return m_fCenterOffsetY;
167 return m_fReticlePIPScale;
173 return m_fObjectivePIPEdgeMin;
179 return m_fObjectivePIPEdgeMax;
185 return m_vMainCameraOffsetUnfocused;
226 void DrawSharedDataDiag()
228 SCR_2DPIPSightsComponent.InputFloatClamped(m_fCenterDistance,
"m_fCenterDistance", -0.2, 0.2);
229 SCR_2DPIPSightsComponent.InputFloatClamped(m_fDistanceMoveNear,
"m_fDistanceMoveNear", 0.0, 1.0);
230 SCR_2DPIPSightsComponent.InputFloatClamped(m_fDistanceMoveFar,
"m_fDistanceMoveFar", 0.0, 1.0);
231 SCR_2DPIPSightsComponent.InputFloatClamped(
m_fBasicParallax,
"m_fBasicParallax", 0.0, 2.0);
232 SCR_2DPIPSightsComponent.InputFloatClamped(
m_fMaxParallax,
"m_fMaxParallax", 0.0, 2.0);
233 SCR_2DPIPSightsComponent.InputFloatClamped(m_fCenterOffsetX,
"m_fCenterOffsetX", -90.0, 90.0);
234 SCR_2DPIPSightsComponent.InputFloatClamped(m_fCenterOffsetY,
"m_fCenterOffsetY", -90.0, 90.0);
235 SCR_2DPIPSightsComponent.InputFloatClamped(m_fReticlePIPScale,
"m_fReticlePIPScale", 0.01, 100.0);
236 SCR_2DPIPSightsComponent.InputFloatClamped(m_fObjectivePIPEdgeMin,
"m_fObjectivePIPEdgeMin", 0.0, 10.0);
237 SCR_2DPIPSightsComponent.InputFloatClamped(m_fObjectivePIPEdgeMax,
"m_fObjectivePIPEdgeMax", 0.0, 10.0);
238 SCR_2DPIPSightsComponent.InputFloatClamped(m_fVignetteParallaxScale,
"m_fVignetteParallaxScale", -100.0, 100.0);
244enum SCR_EPIPZeroingType
252class SCR_2DPIPSightsComponent : SCR_2DSightsComponent
255 protected float m_fScopeRadius;
257 [
Attribute(
"21", UIWidgets.Slider,
"Camera field of view used by this PIP component. Determines LOD used. Set to 0 to use Focus FOV.\n[°]",
params:
"0 89.99 0.01",
category:
"PiPSights")]
258 protected float m_fMainCameraFOV;
262 protected bool m_b2DIsEnabled;
264 protected int m_iLastProjectionFrame = -1;
265 protected vector m_vScreenScopeCenter;
266 protected float m_fScreenScopeRadiusSq;
267 protected float m_fScreenScopeRadius;
268 protected float m_fReticleScale;
269 protected float m_fEdgeScale = 1;
270 protected float m_fParallaxX;
271 protected float m_fParallaxY;
273 protected IEntity m_ControlledEntity;
276 protected ref Color m_cReticleColor;
283 bool IsScreenPositionInSights(vector screenPosition)
285 if (!m_PIPCamera || !IsSightADSActive())
288 BaseWorld world =
GetGame().GetWorld();
289 int index = world.GetFrameNumber();
292 if (m_iLastProjectionFrame !=
index)
294 WorkspaceWidget workspaceWidget =
GetGame().GetWorkspace();
296 vector sightsRear = GetSightsRearPosition();
297 m_vScreenScopeCenter = workspaceWidget.ProjWorldToScreen(sightsRear, world);
298 m_vScreenScopeCenter[2] = 0.0;
300 vector extent = workspaceWidget.ProjWorldToScreen(sightsRear +
GetOwner().GetWorldTransformAxis(0) * m_fScopeRadius, world);
303 const float invSqrt2 = 0.70710678118;
304 m_fScreenScopeRadiusSq = invSqrt2 * vector.DistanceSq(extent, m_vScreenScopeCenter);
305 m_iLastProjectionFrame =
index;
308 float screenDistanceSq = vector.DistanceSq(screenPosition, m_vScreenScopeCenter);
309 return screenDistanceSq < m_fScreenScopeRadiusSq;
315 float GetSightsRadiusScreen()
317 BaseWorld world =
GetGame().GetWorld();
319 WorkspaceWidget workspaceWidget =
GetGame().GetWorkspace();
321 vector sightsRear = GetSightsRearPosition();
322 vector scopeScreenCenter = workspaceWidget.ProjWorldToScreen(sightsRear, world);
323 scopeScreenCenter[2] = 0;
325 vector extent = workspaceWidget.ProjWorldToScreen(sightsRear +
GetOwner().GetWorldTransformAxis(0) * m_fScopeRadius, world);
328 m_fScreenScopeRadius = vector.Distance(extent, scopeScreenCenter);
330 return m_fScreenScopeRadius;
334 protected ref Widget m_wPIPRoot;
337 protected bool m_bPIPIsEnabled;
338 protected static int s_bIsPIPActive;
341 protected RTTextureWidget m_wRenderTargetTextureWidget;
344 protected RenderTargetWidget m_wRenderTargetWidget;
349 ref Material m_pMaterial;
350 int m_iVignetteCenterXIndex = -1;
351 int m_iVignetteCenterYIndex = -1;
352 int m_iVignettePowerIndex = -1;
353 int m_iLensDistortIndex = -1;
354 int m_iReticleOffsetXIndex = -1;
355 int m_iReticleOffsetYIndex = -1;
356 int m_iReticleColorIndex = -1;
357 int m_iReticleScaleIndex = -1;
358 int m_iEdgeMinIndex = -1;
359 int m_iEdgeMaxIndex = -1;
360 int m_iEdgeCenterXIndex = -1;
361 int m_iEdgeCenterYIndex = -1;
376 int GetPIPCameraIndex()
380 return data.GetCameraIndex();
388 if (SCR_Global.IsScope2DEnabled())
389 return super.GetADSActivationPercentageScript();
395 return data.GetADSActivationPercentagePIP();
401 if (SCR_Global.IsScope2DEnabled())
402 return super.GetADSDeactivationPercentageScript();
408 return data.GetADSDeactivationPercentagePIP();
414 return m_bPIPIsEnabled;
421 static bool IsPIPActive()
423 return s_bIsPIPActive;
427 float GetMainCameraFOV()
429 if (SCR_Global.IsScope2DEnabled())
432 if (m_fMainCameraFOV <= 0)
433 m_fMainCameraFOV = CalculateZoomFOV(1);
441 CameraManager cameraManager =
GetGame().GetCameraManager();
443 return m_fMainCameraFOV;
445 PlayerCamera camera = PlayerCamera.Cast(cameraManager.CurrentCamera());
447 return Math.Lerp(cameraManager.GetFirstPersonFOV(), m_fMainCameraFOV, camera.GetFocusMode());
449 return m_fMainCameraFOV;
453 vector GetMainCameraOffset()
455 CameraManager cameraManager =
GetGame().GetCameraManager();
459 PlayerCamera camera = PlayerCamera.Cast(cameraManager.CurrentCamera());
466 return vector.Lerp(
data.GetMainCameraOffsetUnfocused(), vector.Zero, camera.GetFocusMode());
473 protected bool IsLocalControlledEntity(
IEntity pEntity,
bool checkHierarchy =
true)
475 m_ControlledEntity = null;
481 IEntity controlledEntity = SCR_PlayerController.GetLocalControlledEntity();
482 if (!controlledEntity)
486 if (controlledEntity == pEntity)
488 m_ControlledEntity = controlledEntity;
495 m_ControlledEntity = controlledEntity;
512 farPlane = GetMaxViewDistance(farPlane);
515 BaseWorld baseWorld = parent.
GetWorld();
523 parent = GetCameraLocalTransform(mat);
525 pipCamera.SetCameraIndex(cameraIndex);
526 pipCamera.SetVerticalFOV(fov);
527 pipCamera.SetNearPlane(nearPlane);
528 pipCamera.SetFarPlane(farPlane);
529 pipCamera.ApplyProps(cameraIndex);
534 pipCamera.SetLocalTransform(mat);
535 pipCamera.UpdatePIPCamera(1.0);
540 protected Widget CreateUI(
string layout,
string rtTextureName,
string rtName, out RTTextureWidget RTTexture, out RenderTargetWidget RTWidget)
543 if (
layout ==
string.Empty)
547 Widget root =
GetGame().GetWorkspace().CreateWidgets(
layout);
554 RTTexture = RTTextureWidget.Cast(root.FindAnyWidget(rtTextureName));
555 RTWidget = RenderTargetWidget.Cast(root.FindAnyWidget(rtName));
556 if (!RTTexture || !RTWidget)
558 root.RemoveFromHierarchy();
566 void SetPIPEnabled(
bool enabled)
570 if (enabled && !m_bPIPIsEnabled)
573 SCR_2DPIPSightsComponentClass
data = SCR_2DPIPSightsComponentClass.Cast(
GetComponentData(owner));
580 if (!m_wPIPRoot || !m_wRenderTargetTextureWidget || !m_wRenderTargetWidget)
581 m_wPIPRoot = CreateUI(
data.GetPIPLayoutResource(),
data.GetRTTextureWidgetName(),
data.GetRTargetWidgetName(), m_wRenderTargetTextureWidget, m_wRenderTargetWidget);
593 float viewDistance =
GetGame().GetViewDistance();
594 float farPlane =
data.GetFarPlane();
596 viewDistance = Math.Min(viewDistance, farPlane);
598 m_PIPCamera =
SCR_PIPCamera.Cast(
CreateCamera(owner, GetSightsFrontPosition(
true) +
data.GetCameraOffset(),
data.GetCameraAngles(),
data.GetCameraIndex(), GetFOV(),
data.GetNearPlane(), viewDistance));
610 const int cameraIndex =
data.GetCameraIndex();
612 BaseWorld baseWorld = owner.
GetWorld();
613 m_wRenderTargetWidget.SetWorld(baseWorld, cameraIndex);
615 float resolutionScale =
data.GetResolutionScale();
617 m_wRenderTargetWidget.SetResolutionScale(resolutionScale, resolutionScale);
620 m_wRenderTargetTextureWidget.SetRenderTarget(owner);
625 string material =
data.GetUnderwaterPPMaterial();
626 if (!material.IsEmpty())
629 material =
data.GetRainPPMaterial();
630 if (!material.IsEmpty())
633 s_bIsPIPActive =
true;
634 m_bPIPIsEnabled =
true;
639 if (!enabled && m_bPIPIsEnabled)
642 s_bIsPIPActive =
false;
643 m_bPIPIsEnabled =
false;
649 protected void DestroyCamera(CameraBase camera)
654 IEntity cameraParent = camera.GetParent();
661 const int cameraIndex =
data.GetCameraIndex();
662 camera.GetWorld().SetCameraPostProcessEffect(cameraIndex, 10,
PostProcessEffectType.HDR,
string.Empty);
663 camera.GetWorld().SetCameraPostProcessEffect(cameraIndex, 2,
PostProcessEffectType.UnderWater,
string.Empty);
674 protected float GetMaxViewDistance(
float desiredDistance)
677 float absoluteMax =
GetGame().GetMaximumViewDistance();
679 float absoluteMin =
GetGame().GetMinimumViewDistance();
681 float serverMax =
GetGame().GetViewDistanceServerLimit();
685 return Math.Clamp(desiredDistance, absoluteMin, Math.Min(serverMax, absoluteMax));
687 return Math.Clamp(desiredDistance, absoluteMin, absoluteMax);
695 if (!SCR_SettingsSuperMenu.Cast(menu))
701 float maxViewDistance = GetMaxViewDistance(
GetGame().GetViewDistance());
702 if (m_PIPCamera.GetFarPlane() != maxViewDistance)
703 m_PIPCamera.SetFarPlane(maxViewDistance);
711 if (m_wRenderTargetTextureWidget && owner && !owner.
IsDeleted())
712 m_wRenderTargetTextureWidget.RemoveRenderTarget(owner);
716 m_wPIPRoot.RemoveFromHierarchy();
721 DestroyCamera(m_PIPCamera);
726 protected override void EnableReticleIllumination(
bool enable)
732 super.EnableReticleIllumination(enable);
734 if (
data.HasIllumination() && enable)
735 m_cReticleColor =
data.GetReticleIlluminationColor();
737 m_cReticleColor =
data.GetReticleColor();
749 if (!IsLocalControlledEntity(owner))
766 bool scope2d = SCR_Global.IsScope2DEnabled();
772 UpdateScopeMaterial();
775 if (
data.HasIllumination())
776 EnableReticleIllumination(m_bIsIlluminationOn);
779 s_OnSightsADSChanged.Invoke(
true, m_fMainCameraFOV);
784 SetPIPEnabled(
false);
786 m_b2DIsEnabled =
true;
788 else if (!scope2d && m_b2DIsEnabled)
790 m_b2DIsEnabled =
false;
794 super.HandleSightActivation();
796 super.HandleSightDeactivation();
807 if (!m_ControlledEntity)
814 auto camMgr =
GetGame().GetCameraManager();
815 if (camMgr && camMgr.GetOverlayCamera() == m_PIPCamera)
816 camMgr.SetOverlayCamera(null);
819 SetPIPEnabled(
false);
825 s_OnSightsADSChanged.Invoke(
false, 0);
827 bool scope2d = SCR_Global.IsScope2DEnabled();
830 super.HandleSightDeactivation();
831 m_b2DIsEnabled =
false;
835 SetPIPEnabled(
false);
840 void UpdateCamera(
float timeSlice)
845 if (m_fScopeRadius <= 0)
849 CameraManager cameraManager =
GetGame().GetCameraManager();
853 CameraBase mainCamera = cameraManager.CurrentCamera();
858 vector cameraToSightMat[4];
859 SCR_EntityHelper.GetRelativeLocalTransform(
GetOwner(), mainCamera, cameraToSightMat);
860 vector localCameraPosition = cameraToSightMat[3];
862 vector pipSurfaceCenter = GetSightsRearPosition(
true);
863 float distance = vector.Distance(pipSurfaceCenter, localCameraPosition);
869 SightsFOVInfo fovInfo = GetFOVInfo();
872 fov = fovInfo.GetFOV();
873 SCR_CharacterCameraHandlerComponent.SetOverlayCameraFOV(fov);
877 fov = mainCamera.GetVerticalFOV();
881 float scopeSize = Math.Atan2(m_fScopeRadius * 2,
distance) * Math.RAD2DEG;
883 float screenPortion = scopeSize / m_fMainCameraFOV;
885 float currentFOV = m_PIPCamera.GetVerticalFOV();
886 bool fovChanged = !
float.AlmostEqual(fov * screenPortion, currentFOV, currentFOV * 0.005);
889 SCR_BaseVariableSightsFOVInfo variableSights = SCR_BaseVariableSightsFOVInfo.Cast(fovInfo);
890 if (variableSights && !fovChanged)
895 m_PIPCamera.SetVerticalFOV(fov * screenPortion);
899 m_fEdgeScale = fov / variableSights.
GetBaseFOV();
902 if (fovChanged && m_fReticleAngularSize != 0)
905 if (m_fReticleBaseZoom > 0)
906 m_fReticleBaseZoom = -CalculateZoomFOV(m_fReticleBaseZoom);
909 if (m_fReticleBaseZoom == 0)
911 else if (m_fReticleBaseZoom < 0)
912 fovReticle = -m_fReticleBaseZoom;
915 m_fReticleScale = fovReticle * screenPortion * m_fReticlePortion / m_fReticleAngularSize;
920 GetCameraLocalTransform(mat);
924 vector sightsTransform[4];
925 GetSightsTransform(sightsTransform,
true);
927 vector parallaxPoint = sightsTransform[3] + sightsTransform[2] *
distance;
928 vector parallaxDirection = (parallaxPoint - localCameraPosition).Normalized();
929 vector
angles = SCR_Math3D.FixEulerVector180(parallaxDirection.VectorToAngles());
936 angles *= fov / m_fMainCameraFOV;
942 m_fParallaxX = -
angles[0];
947 Math3D.AnglesToMatrix(
angles, parallax);
948 Math3D.MatrixMultiply3(mat, parallax, mat);
951 m_PIPCamera.SetLocalTransform(mat);
954 m_PIPCamera.ApplyTransform(timeSlice);
960 int mainCameraIndex = 0;
961 CameraManager manager =
GetGame().GetCameraManager();
964 CameraBase cam = manager.CurrentCamera();
966 mainCameraIndex = cam.GetCameraIndex();
972 float hdrBrightness = world.GetCameraHDRBrightness(mainCameraIndex);
974 SCR_2DPIPSightsComponentClass
data = SCR_2DPIPSightsComponentClass.Cast(
GetComponentData(owner));
976 world.SetCameraHDRBrightness(
data.GetCameraIndex(), hdrBrightness);
980 void UpdateScopeMaterial()
982 CameraManager cameraManager =
GetGame().GetCameraManager();
986 ChimeraCharacter character = ChimeraCharacter.Cast(SCR_PlayerController.GetLocalControlledEntity());
990 CharacterControllerComponent controller = character.GetCharacterController();
994 BaseWeaponManagerComponent weaponManager = controller.GetWeaponManagerComponent();
998 CameraBase mainCamera = cameraManager.CurrentCamera();
1004 mainCamera.GetLocalTransform(mainCam);
1007 vector sightsLSCam[4];
1011 if (!weaponManager.GetCurrentSightsCameraTransform(sightsLSCam, fov))
1015 vector scopePosCam = sightsLSCam[3] - mainCam[3];
1018 vector scopeFwd = sightsLSCam[2];
1019 vector camFwd = mainCam[2];
1028 float ns = vector.Dot(camFwd, scopeFwd);
1029 float nP = vector.Dot(scopePosCam, scopeFwd);
1032 vector projP = camFwd*t;
1034 vector locPos = scopePosCam - projP;
1046 float distance = Math.AbsFloat(t) -
data.GetCenterDistance();
1049 float vignettePower = 0;
1053 float distancePower;
1057 distancePower =
data.GetDistanceMoveFar();
1062 distancePower =
data.GetDistanceMoveNear();
1067 float fc = 1 - 1 /(Math.Log2(distancePower*Math.AbsFloat(
distance) + 2));
1070 vignettePower = Math.Clamp(fc* 100,
data.GetBasicParallax(),
data.GetMaxParallax());
1089 float pipFOV = m_PIPCamera.GetVerticalFOV();
1092 float vignetteParallaxScale;
1093 if (m_fObjectiveFov > 0)
1094 vignetteParallaxScale =
data.GetVignetteParallaxScale() / (m_fObjectiveFov * m_fObjectiveScale);
1096 m_pMaterial.SetParamByIndex(m_iVignetteCenterXIndex, -m_fParallaxX * vignetteParallaxScale / pipFOV);
1097 m_pMaterial.SetParamByIndex(m_iVignetteCenterYIndex, -m_fParallaxY * vignetteParallaxScale / pipFOV);
1098 m_pMaterial.SetParamByIndex(m_iVignettePowerIndex, vignettePower);
1100 float reticlePIPScale =
data.GetReticlePIPScale();
1102 m_pMaterial.SetParamByIndex(m_iEdgeCenterXIndex, m_fParallaxX * reticlePIPScale / pipFOV);
1103 m_pMaterial.SetParamByIndex(m_iEdgeCenterYIndex, m_fParallaxY * reticlePIPScale / pipFOV);
1104 float edgeSize = m_fObjectiveFov * m_fObjectiveScale * m_fEdgeScale / pipFOV;
1105 m_pMaterial.SetParamByIndex(m_iEdgeMinIndex, 0.5 * reticlePIPScale * edgeSize * edgeSize *
data.GetObjectivePIPEdgeMin());
1106 m_pMaterial.SetParamByIndex(m_iEdgeMaxIndex, 0.5 * reticlePIPScale * edgeSize * edgeSize *
data.GetObjectivePIPEdgeMax());
1109 m_pMaterial.SetParamByIndex(m_iReticleScaleIndex, m_fReticleScale / reticlePIPScale);
1110 m_pMaterial.SetParamByIndex(m_iReticleOffsetXIndex, m_fReticleScale * (m_fParallaxX + m_fReticleOffsetX) / pipFOV);
1111 m_pMaterial.SetParamByIndex(m_iReticleOffsetYIndex, m_fReticleScale * (m_fParallaxY + m_fCurrentReticleOffsetY) / pipFOV);
1114 float reticleRGBA[4] = {m_cReticleColor.R(), m_cReticleColor.G(), m_cReticleColor.B(), m_cReticleColor.A()};
1115 m_pMaterial.SetParamByIndex(m_iReticleColorIndex, reticleRGBA);
1124 super.OnSightADSPostFrame(owner, timeSlice);
1128 bool use2D = SCR_Global.IsScope2DEnabled();
1129 if ((m_bPIPIsEnabled && use2D) || (!m_bPIPIsEnabled && !use2D))
1136 if (m_bPIPIsEnabled)
1138 UpdateCamera(timeSlice);
1141 if (m_pMaterial && m_PIPCamera)
1142 UpdateScopeMaterial();
1154 super.OnInit(owner);
1156 SCR_2DPIPSightsComponentClass
data = SCR_2DPIPSightsComponentClass.Cast(
GetComponentData(owner));
1160 m_cReticleColor =
data.GetReticleColor();
1162 ResourceName mat =
data.GetScopeHDRMaterial();
1166 m_pMaterial = Material.GetOrLoadMaterial(mat, 0);
1170 m_iVignetteCenterXIndex = m_pMaterial.GetParamIndex(
"VignetteCenterX");
1171 m_iVignetteCenterYIndex = m_pMaterial.GetParamIndex(
"VignetteCenterY");
1172 m_iVignettePowerIndex = m_pMaterial.GetParamIndex(
"Vignette");
1173 m_iLensDistortIndex = m_pMaterial.GetParamIndex(
"LensDistort");
1174 m_iReticleOffsetXIndex = m_pMaterial.GetParamIndex(
"ReticleOffsetX");
1175 m_iReticleOffsetYIndex = m_pMaterial.GetParamIndex(
"ReticleOffsetY");
1176 m_iReticleColorIndex = m_pMaterial.GetParamIndex(
"ReticleColor");
1177 m_iReticleScaleIndex = m_pMaterial.GetParamIndex(
"ReticleScale");
1178 m_iEdgeMinIndex = m_pMaterial.GetParamIndex(
"EdgeMin");
1179 m_iEdgeMaxIndex = m_pMaterial.GetParamIndex(
"EdgeMax");
1180 m_iEdgeCenterXIndex = m_pMaterial.GetParamIndex(
"EdgeCenterX");
1181 m_iEdgeCenterYIndex = m_pMaterial.GetParamIndex(
"EdgeCenterY");
1191 protected override void ApplyRecoilToCamera(inout vector pOutCameraTransform[4], vector aimModAngles)
1193 if (m_bPIPIsEnabled)
1196 vector weaponAnglesMat[3];
1197 Math3D.AnglesToMatrix(aimModAngles, weaponAnglesMat);
1198 Math3D.MatrixMultiply3(pOutCameraTransform, weaponAnglesMat, pOutCameraTransform);
1204 if (m_bPIPIsEnabled)
1207 return super.CanFreelook();
1212 override int _WB_GetAfterWorldUpdateSpecs(
IEntity owner, IEntitySource src)
1214 return EEntityFrameUpdateSpecs.CALL_WHEN_ENTITY_VISIBLE;
1218 protected override void _WB_AfterWorldUpdate(
IEntity owner,
float timeSlice)
1221 const float axisLength = 0.1;
1223 vector ownerTransform[4];
1230 vector objectiveTransform[4];
1231 Math3D.AnglesToMatrix(
data.GetCameraAngles(), objectiveTransform);
1232 Math3D.MatrixMultiply3(objectiveTransform, ownerTransform, objectiveTransform);
1233 objectiveTransform[3] = (GetSightsFrontPosition(
true) +
data.GetCameraOffset()).Multiply4(ownerTransform);
1235 vector objectiveSide = objectiveTransform[0];
1236 vector objectiveUp = objectiveTransform[1];
1237 vector objectiveForward = objectiveTransform[2];
1238 vector objectiveCenter = objectiveTransform[3];
1240 Shape rightArrow = Shape.CreateArrow(objectiveCenter, objectiveCenter + objectiveSide * axisLength, 0.01, Color.DARK_RED, shapeFlags);
1241 Shape upArrow = Shape.CreateArrow(objectiveCenter, objectiveCenter + objectiveUp * axisLength, 0.01, Color.DARK_GREEN, shapeFlags);
1242 Shape fwdArrow = Shape.CreateArrow(objectiveCenter, objectiveCenter + objectiveForward * axisLength, 0.01, Color.DARK_BLUE, shapeFlags);
1245 objectiveTransform[1] = objectiveForward;
1246 objectiveTransform[2] = objectiveUp;
1247 objectiveTransform[3] = objectiveCenter;
1248 SCR_Shape.DrawCircle(objectiveTransform, m_fScopeRadius, Color.DARK_RED,
COLOR_YELLOW_A, shapeFlags);
1251 vector ocularTransform[4];
1252 ocularTransform[0] = ownerTransform[0];
1253 ocularTransform[1] = ownerTransform[2];
1254 ocularTransform[2] = ownerTransform[1];
1255 ocularTransform[3] = GetSightsRearPosition(
true).Multiply4(ownerTransform);
1257 SCR_Shape.DrawCircle(ocularTransform, m_fScopeRadius, Color.DARK_RED,
COLOR_YELLOW_A, shapeFlags);
1260 vector ocularHorizontal[2];
1261 vector ocularSide = ownerTransform[0] * m_fScopeRadius;
1262 ocularHorizontal[0] = ocularTransform[3] + ocularSide;
1263 ocularHorizontal[1] = ocularTransform[3] - ocularSide;
1265 vector ocularVertical[2];
1266 vector ocularUp = ownerTransform[1] * m_fScopeRadius;
1267 ocularVertical[0] = ocularTransform[3] - ocularUp;
1268 ocularVertical[1] = ocularTransform[3] + ocularUp;
1270 Shape.CreateLines(Color.DARK_RED, shapeFlags, ocularHorizontal, 2);
1271 Shape.CreateLines(Color.DARK_RED, shapeFlags, ocularVertical, 2);
1274 vector eyeTransform[4]
1275 GetSightsTransform(eyeTransform);
1276 Shape.CreateArrow(eyeTransform[3], ocularTransform[3], m_fScopeRadius* 0.3, Color.DARK_CYAN, shapeFlags);
1277 Shape.CreateSphere(Color.DARK_CYAN, shapeFlags, eyeTransform[3], 0.001);
1282 protected static bool s_PIPDiagRegistered;
1285 static void InputFloatClamped(inout
float value,
string label,
float min,
float max,
int pxWidth = 100)
1287 DbgUI.InputFloat(label, value, pxWidth);
1288 value = Math.Clamp(value, min, max);
1292 protected void DrawDiagWindow()
1294 DbgUI.Begin(
"2DPIPSights");
1299 data.DrawSharedDataDiag();
1301 InputFloatClamped(m_fCurrentCameraPitch,
"m_fCurrentCameraPitch", -90.0, 90.0);
1302 InputFloatClamped(m_fScopeRadius,
"m_fScopeRadius", -90.0, 90.0);
1311 void SCR_2DPIPSightsComponent(IEntityComponentSource src,
IEntity ent,
IEntity parent)
1314 if (!s_PIPDiagRegistered)
1316 DiagMenu.RegisterBool(
SCR_DebugMenuID.DEBUGUI_WEAPONS_PIP_SIGHTS,
"",
"Show PIP settings diag",
"Weapons");
1317 s_PIPDiagRegistered =
true;
1324 void ~SCR_2DPIPSightsComponent()
1336 SetPIPEnabled(
false);
ArmaReforgerScripted GetGame()
ref array< string > angles
SCR_2DPIPSightsComponentClass EPZ_RETICLE_OFFSET
SCR_2DPIPSightsComponentClass EPZ_NONE
Defines different means of adjusting zeroing for PIP sights.
override void ApplyRecoilToCamera(inout vector pOutCameraTransform[4], vector aimModAngles)
override void HandleSightActivation()
SCR_2DSightsComponentClass m_SightsFovInfo
override float GetReticleOffsetYTarget()
override void HandleSightDeactivation()
override bool CanFreelook()
void OnSettingsMenuClosed(ChimeraMenuBase menu)
IEntity SpawnEntity(ResourceName entityResourceName, notnull IEntity slotOwner)
SCR_CharacterSoundComponentClass GetComponentData()
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
override bool Destroy(int editorPlayerID)
Get all prefabs that have the spawner data
UI layouts Menus CleanSweep CleanSweepAreaSelection layout
SCR_PIPCameraClass CameraBaseClass SCR_PIPCamera(IEntitySource src, IEntity parent)
enum EVehicleType IEntity
proto external int AddChild(notnull IEntity child, TNodeId pivot, EAddChildFlags flags=EAddChildFlags.AUTO_TRANSFORM)
Add Entity to hierarchy. Pivot is pivot index, or -1 for center of parent.
proto external void GetWorldTransform(out vector mat[])
See IEntity::GetTransform.
proto external BaseWorld GetWorld()
proto external void RemoveChild(notnull IEntity child, bool keepTransform=false)
Remove Entity from hierarchy.
proto external bool IsDeleted()
proto external IEntity GetRootParent()
ResourceName GetRainPPMaterial()
ResourceName GetPIPLayoutResource()
string GetRTargetWidgetName()
float GetDistanceMoveNear()
float GetVignetteParallaxScale()
ResourceName GetScopeHDRMaterial()
float GetCenterDistance()
float GetReticlePIPScale()
ResourceName m_sPIPLayoutResource
float GetADSDeactivationPercentagePIP()
string m_sRTargetWidgetName
float GetResolutionScale()
float GetObjectivePIPEdgeMax()
ResourceName m_sRainPPMaterial
ResourceName m_rScopeHDRMatrial
float GetADSActivationPercentagePIP()
float GetDistanceMoveFar()
ResourceName GetUnderwaterPPMaterial()
ResourceName m_sUnderwaterPPMaterial
float GetObjectivePIPEdgeMin()
vector GetMainCameraOffsetUnfocused()
string m_sRTTextureWidgetName
string GetRTTextureWidgetName()
float GetBaseFOV()
Returns true when current FOV of the optic does not match the target FOV.
bool IsAdjusting()
Returns true when current FOV of the optic does not match the target FOV.
IEntity GetOwner()
Owner entity of the fuel tank.
proto external float GetFocusFOV()
Returns the focus field of view in degrees.
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
proto native vector Vector(float x, float y, float z)
CameraLensFlareSetType
Type of the camera lens flare set.
event float GetADSDeactivationPercentageScript()
Called to get the ADS percentage when the sights go inactive.
event void OnSightADSPostFrame(IEntity owner, float timeSlice)
event void OnSightADSDeactivated()
Called every time the sight is deactivated.
event float GetADSActivationPercentageScript()
Called to get the ADS percentage when the sights go active.
event void OnSightADSActivated()
Called every time the sight is activated.