Skip to content

Commit

Permalink
Merge branch 'developing'
Browse files Browse the repository at this point in the history
  • Loading branch information
will258012 committed Nov 10, 2024
2 parents ac45dc5 + dcf64c4 commit 4b0f9dc
Show file tree
Hide file tree
Showing 14 changed files with 111 additions and 126 deletions.
103 changes: 45 additions & 58 deletions FPSCamera/Code/Cam/Controller/FPSCamController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,24 +75,20 @@ private void DisableCam()
if (ModSettings.ShadowsOpt)
StartCoroutine(ShadowsManager.ToggleShadowsOpt(false));

if (ModSettings.SmoothTransition)
if (ModSettings.SetBackCamera)
{
if (ModSettings.SetBackCamera)
if (ModSettings.SmoothTransition)
StartTransitioningOnDisabled(GameCamController.Instance._cachedPositioning);
else
StartTransitioningOnDisabled(
new Positioning(GameCamController.Instance.MainCamera.transform.position,
GameCamController.Instance.MainCamera.transform.rotation));
else AfterTransition(GameCamController.Instance._cachedPositioning);
}
else
{
if (ModSettings.SetBackCamera)
AfterTransition(GameCamController.Instance._cachedPositioning);
else
AfterTransition(
new Positioning(GameCamController.Instance.MainCamera.transform.position,
GameCamController.Instance.MainCamera.transform.rotation));
if (ModSettings.HideGameUI)
StartCoroutine(UIManager.ToggleUI(true));
Status = CamStatus.Disabled;
GameCamController.Instance.Restore();
}

OnCameraDisabled?.Invoke();
}
private void AfterTransition(Positioning positioning)
Expand All @@ -104,6 +100,7 @@ private void AfterTransition(Positioning positioning)
GameCamController.Instance.MainCamera.transform.rotation = positioning.rotation;
GameCamController.Instance.Restore();
}

/// <summary>
/// Starts Follow mode.
/// </summary>
Expand Down Expand Up @@ -151,9 +148,8 @@ public void StartTransitioningOnDisabled(Positioning endPos)
{
_transitionTimer = 0f;
_targetFoV = ModSettings.CamFieldOfView;
var cameraTransform = GameCamController.Instance.MainCamera.transform;
if (cameraTransform.position.DistanceTo(endPos.pos) <= ModSettings.MinTransDistance ||
cameraTransform.position.DistanceTo(endPos.pos) > ModSettings.MaxTransDistance)
if (CameraTransform.position.DistanceTo(endPos.pos) <= 2f ||
CameraTransform.position.DistanceTo(endPos.pos) > ModSettings.MaxTransDistance)
{
AfterTransition(endPos);
return;
Expand Down Expand Up @@ -392,33 +388,26 @@ internal void SyncCamOffset(IFollowCam followCam)
/// </summary>
private void UpdateFollowCamPos()
{
var cameraTransform = GameCamController.Instance.MainCamera.transform;

// Calculate the desired position and rotation of the camera by applying the offset to the FPSCam's current position and rotation.
var instancePos = FPSCam.GetPositioning().pos + (FPSCam.GetPositioning().rotation * _offset.pos);
var instanceRotation = FPSCam.GetPositioning().rotation * _offset.rotation;

// Adjust the y-axis to ensure the camera is above the road.
if (MapUtils.GetClosestSegmentLevel(instancePos, out var height)) // Get the height of the closest road segment, if available.
instancePos.y = Mathf.Max(instancePos.y, height); // Ensure the camera is at least at the height of the road.


// Limit the camera's position to the allowed area.
instancePos = CameraController.ClampCameraPosition(instancePos);
// Apply the calculated position and rotation to the camera.
if (ModSettings.SmoothTransition)
{
cameraTransform.position =
cameraTransform.position.DistanceTo(instancePos) > ModSettings.MinTransDistance &&
cameraTransform.position.DistanceTo(instancePos) <= ModSettings.MaxTransDistance
? Vector3.Lerp(cameraTransform.position, instancePos, Time.deltaTime * ModSettings.TransSpeed)
CameraTransform.position =
CameraTransform.position.DistanceTo(instancePos) > ModSettings.MinTransDistance &&
CameraTransform.position.DistanceTo(instancePos) <= ModSettings.MaxTransDistance
? Vector3.Lerp(CameraTransform.position, instancePos, Time.deltaTime * ModSettings.TransSpeed)
: instancePos;
cameraTransform.rotation = Quaternion.Slerp(cameraTransform.rotation, instanceRotation, Time.deltaTime * ModSettings.TransSpeed);
CameraTransform.rotation = Quaternion.Slerp(CameraTransform.rotation, instanceRotation, Time.deltaTime * ModSettings.TransSpeed);
}
else
{
cameraTransform.position = instancePos;
cameraTransform.rotation = instanceRotation;
CameraTransform.position = instancePos;
CameraTransform.rotation = instanceRotation;
}
}

Expand All @@ -427,20 +416,15 @@ private void UpdateFollowCamPos()
/// </summary>
private void UpdateFreeCamPos(FreeCam freeCam)
{

// Automatically move the camera forward if AutoMove is enabled and the secondary mouse button is not pressed.
if (freeCam.AutoMove && !InputManager.MousePressed(InputManager.MouseButton.Secondary))
{
var movement = Vector3.zero;
movement.z += Time.deltaTime * ModSettings.MovementSpeed / MapUtils.ToKilometer(1f);
_offset.pos += _offset.rotation * movement;

}
var cameraTransform = GameCamController.Instance.MainCamera.transform;

freeCam.RecordLastPositioning();
// Calculate the desired position and rotation of the camera by applying the offset to the FPSCam's current position and rotation.
var instancePos = FPSCam.GetPositioning().pos + _offset.pos;
// Calculate the desired position and rotation of the camera by applying the offset to the camera's current position and rotation.
var instancePos = CameraTransform.position + _offset.pos;
var instanceRotation = _offset.rotation;

/*
Expand All @@ -454,35 +438,39 @@ private void UpdateFreeCamPos(FreeCam freeCam)
if (ModSettings.GroundClipping != 0)
{
var minHeight = MapUtils.GetMinHeightAt(instancePos) + ModSettings.GroundLevelOffset; // Get minimum height including ground level offset.

if ((ModSettings.GroundClipping == 3 || ModSettings.GroundClipping == 4) && MapUtils.GetClosestSegmentLevel(instancePos, out var height))
minHeight = height + ModSettings.RoadLevelOffset; // Adjust minHeight if road height is applicable.

if (ModSettings.GroundClipping == 2 || ModSettings.GroundClipping == 4 || instancePos.y < minHeight)
instancePos.y = minHeight; // Apply the minimum height to the camera's y-axis.
instancePos.y = ModSettings.SmoothTransition &&
Math.Abs(instancePos.y - minHeight) <= ModSettings.MinTransDistance ?
Mathf.Lerp(instancePos.y, minHeight, Time.deltaTime * ModSettings.TransSpeed) :
minHeight; // Apply the minimum height to the camera's y-axis.
}

// Limit the camera's position to the allowed area.
instancePos = CameraController.ClampCameraPosition(instancePos);

//Update the speed for info panel to display.
if (ModSettings.ShowInfoPanel)
freeCam.UpdateSpeed(CameraTransform.position, instancePos);

// Apply the calculated position and rotation to the camera.
if (ModSettings.SmoothTransition)
{
cameraTransform.position =
freeCam._positioning.pos =
cameraTransform.position.DistanceTo(instancePos) > ModSettings.MinTransDistance &&
cameraTransform.position.DistanceTo(instancePos) <= ModSettings.MaxTransDistance
? Vector3.Lerp(cameraTransform.position, instancePos, Time.deltaTime * ModSettings.TransSpeed)
CameraTransform.position =
CameraTransform.position.DistanceTo(instancePos) > ModSettings.MinTransDistance &&
CameraTransform.position.DistanceTo(instancePos) <= ModSettings.MaxTransDistance
? Vector3.Lerp(CameraTransform.position, instancePos, Time.deltaTime * ModSettings.TransSpeed)
: instancePos;
cameraTransform.rotation =
freeCam._positioning.rotation =
Quaternion.Slerp(cameraTransform.rotation, instanceRotation, Time.deltaTime * ModSettings.TransSpeed);
CameraTransform.rotation =
Quaternion.Slerp(CameraTransform.rotation, instanceRotation, Time.deltaTime * ModSettings.TransSpeed);
}
else
{
cameraTransform.position =
freeCam._positioning.pos =
instancePos;
cameraTransform.rotation = freeCam._positioning.rotation = instanceRotation;
CameraTransform.position = instancePos;
CameraTransform.rotation = instanceRotation;

}
// Reset the position offset after applying.
Expand All @@ -494,30 +482,29 @@ private void UpdateFreeCamPos(FreeCam freeCam)
/// </summary>
private void UpdateTransitionPos()
{
var cameraTransform = GameCamController.Instance.MainCamera.transform;
_transitionTimer += Time.deltaTime;
if (cameraTransform.position.DistanceTo(_endPos.pos) <= ModSettings.MinTransDistance ||
// If we've reached the distance of the end or time is out
if (CameraTransform.position.DistanceTo(_endPos.pos) <= 2f ||
_transitionTimer >= MaxTransitioningTime)
{
_transitionTimer = 0f;
AfterTransition(_endPos);
_endPos = new Positioning(Vector3.zero);
return;
}
// Apply the calculated position and rotation to the camera.
cameraTransform.position =
Vector3.Lerp(cameraTransform.position, _endPos.pos, Time.deltaTime * ModSettings.TransSpeed);
cameraTransform.rotation =
Quaternion.Slerp(cameraTransform.rotation, _endPos.rotation, Time.deltaTime * ModSettings.TransSpeed);
// Apply the transition position and rotation to the camera.
CameraTransform.position =
Vector3.Lerp(CameraTransform.position, _endPos.pos, Time.deltaTime * ModSettings.TransSpeed);
CameraTransform.rotation =
Quaternion.Slerp(CameraTransform.rotation, _endPos.rotation, Time.deltaTime * ModSettings.TransSpeed);
}
public enum CamStatus
{
Disabled,
Enabled,
Transitioning
}


private static Transform CameraTransform => GameCamController.Instance.MainCamera.transform;
private bool _isScrollTransitioning = false;
private Positioning _endPos = new Positioning(Vector3.zero);
private Positioning _offset = new Positioning(Vector3.zero);
Expand Down
5 changes: 4 additions & 1 deletion FPSCamera/Code/Cam/Controller/GameCamController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,14 @@ public void SyncCameraControllerFromTransform()
// Calculate the new position based on the Z offset, moving forward from the camera's transform.
var newPos = MainCamera.transform.position + (MainCamera.transform.rotation * Vector3.forward * 40f);

// Limit the camera's position to the allowed area.
newPos = CameraController.ClampCameraPosition(newPos);

// Update the CameraController's position based on the adjusted new position.
CameraController.m_targetPosition = CameraController.m_currentPosition = newPos;

// Calculate the height based on the new position and the minimum height of the terrain.
CameraController.m_targetHeight = CameraController.m_currentHeight = newPos.y - MapUtils.GetMinHeightAt(newPos);
CameraController.m_targetHeight = CameraController.m_currentHeight = newPos.y + CameraController.CalculateCameraHeightOffset(newPos, 40f);

// Set the target angle based on the camera's transform, clamping the angles to valid ranges.
CameraController.m_targetAngle = CameraController.m_currentAngle =
Expand Down
22 changes: 8 additions & 14 deletions FPSCamera/Code/Cam/FreeCam.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,19 @@ namespace FPSCamera.Cam
/// </summary>
public class FreeCam : IFPSCam
{
public FreeCam()
{
var transform = GameCamController.Instance.MainCamera.transform;
_positioning.pos = transform.position;
_positioning.rotation = Quaternion.identity;
_lastPositioning = _positioning;
IsActivated = true;
}
public FreeCam() => IsActivated = true;

public bool IsActivated { get; private set; }
public Positioning GetPositioning() => _positioning;
internal void RecordLastPositioning() => _lastPositioning = _positioning;
public Positioning GetPositioning() =>
new Positioning(GameCamController.Instance.MainCamera.transform.position,
GameCamController.Instance.MainCamera.transform.rotation);
internal void UpdateSpeed(Vector3 a, Vector3 b) => speed = a.DistanceTo(b) / Time.deltaTime;
public bool AutoMove { get; set; }
public void ToggleAutoMove() => AutoMove = !AutoMove;
public float GetSpeed() => _lastPositioning.pos.DistanceTo(_positioning.pos) / Time.deltaTime;
public float GetSpeed() => speed;
public bool IsValid() => true;
public void DisableCam() { IsActivated = false; _positioning = _lastPositioning = default; AutoMove = false; }
public void DisableCam() { IsActivated = false; AutoMove = false; speed = 0f; }

internal Positioning _positioning = new Positioning(Vector3.zero);
private Positioning _lastPositioning = new Positioning(Vector3.zero);
private float speed = 0f;
}
}
24 changes: 14 additions & 10 deletions FPSCamera/Code/Loading.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using AlgernonCommons.Notifications;
using AlgernonCommons;
using AlgernonCommons;
using AlgernonCommons.Notifications;
using AlgernonCommons.Patching;
using AlgernonCommons.Translation;
using FPSCamera.Cam.Controller;
using FPSCamera.Settings;
using FPSCamera.UI;
Expand Down Expand Up @@ -55,15 +56,18 @@ protected override void LoadedActions(LoadMode mode)
if (ToolsModifierControl.isGame)
gameObject.AddComponent<FollowButtons>();

/// TODO: Need to remove in the next version
var notification = NotificationBase.ShowNotification<DontShowAgainNotification>();
notification.AddParas("Since we changed the default values ​​of some settings, you may need to reset the settings for a better experience.");
notification.AddParas("由于我们修改了部分设置的默认值,您可能需要重置设置以获得更佳体验。");
notification.DSAButton.eventClicked += (component, clickEvent) =>
if (ModSupport.FoundK45TLM && WhatsNew.LastNotifiedVersion < AssemblyUtils.CurrentVersion)
{
WhatsNew.LastNotifiedVersion = AssemblyUtils.CurrentVersion;
ModBase.Instance?.SaveSettings();
};
var notification = NotificationBase.ShowNotification<DontShowAgainNotification>();
//notification.AddParas("Since we changed the default values ​​of some settings, you may need to reset the settings for a better experience.");
//notification.AddParas("由于我们修改了部分设置的默认值,您可能需要重置设置以获得更佳体验。");
notification.AddParas(Translations.Translate("K45_TLM_DETECTED"));
notification.DSAButton.eventClicked += (component, clickEvent) =>
{
WhatsNew.LastNotifiedVersion = AssemblyUtils.CurrentVersion;
ModSettings.Save();
};
}
}
public override void OnCreated(ILoading loading)
{
Expand Down
24 changes: 12 additions & 12 deletions FPSCamera/Code/Settings/Tabs/CameraOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,18 +137,6 @@ internal CameraOptions(UITabstrip tabStrip, int tabIndex)
foViewScrollfactor_Slider.tooltip = Translations.Translate("SETTINGS_FOVIEWSCROLLFACTOR_DETAIL");
foViewScrollfactor_Slider.eventValueChanged += (_, value) => ModSettings.FoViewScrollfactor = value;
currentY += foViewScrollfactor_Slider.height + SliderMargin;

pathsDetection_CheckBox = UICheckBoxes.AddPlainCheckBox(scrollPanel, LeftMargin, currentY, Translations.Translate("SETTINGS_PATHS_DETECTION"));
pathsDetection_CheckBox.tooltip = string.Format(Translations.Translate("SETTINGS_DETECTIONS_DETAIL"), "\n");
pathsDetection_CheckBox.isChecked = ModSettings.PathsDetection;
pathsDetection_CheckBox.eventCheckChanged += (_, isChecked) => ModSettings.PathsDetection = isChecked;
currentY += pathsDetection_CheckBox.height + Margin;

tracksDetection_CheckBox = UICheckBoxes.AddPlainCheckBox(scrollPanel, LeftMargin, currentY, Translations.Translate("SETTINGS_TRACKS_DETECTION"));
tracksDetection_CheckBox.tooltip = string.Format(Translations.Translate("SETTINGS_DETECTIONS_DETAIL"), "\n");
tracksDetection_CheckBox.isChecked = ModSettings.TracksDetection;
tracksDetection_CheckBox.eventCheckChanged += (_, isChecked) => ModSettings.TracksDetection = isChecked;
currentY += tracksDetection_CheckBox.height + Margin;
#endregion
#region Free-Camera Mode Options

Expand Down Expand Up @@ -184,6 +172,18 @@ internal CameraOptions(UITabstrip tabStrip, int tabIndex)
roadLevelOffset_Slider.tooltip = Translations.Translate("SETTINGS_ROADLEVELOFFSET_DETAIL");
roadLevelOffset_Slider.eventValueChanged += (_, value) => ModSettings.RoadLevelOffset = value;
currentY += roadLevelOffset_Slider.height + SliderMargin;

pathsDetection_CheckBox = UICheckBoxes.AddPlainCheckBox(scrollPanel, LeftMargin, currentY, Translations.Translate("SETTINGS_PATHS_DETECTION"));
pathsDetection_CheckBox.tooltip = string.Format(Translations.Translate("SETTINGS_DETECTIONS_DETAIL"), "\n");
pathsDetection_CheckBox.isChecked = ModSettings.PathsDetection;
pathsDetection_CheckBox.eventCheckChanged += (_, isChecked) => ModSettings.PathsDetection = isChecked;
currentY += pathsDetection_CheckBox.height + Margin;

tracksDetection_CheckBox = UICheckBoxes.AddPlainCheckBox(scrollPanel, LeftMargin, currentY, Translations.Translate("SETTINGS_TRACKS_DETECTION"));
tracksDetection_CheckBox.tooltip = string.Format(Translations.Translate("SETTINGS_DETECTIONS_DETAIL"), "\n");
tracksDetection_CheckBox.isChecked = ModSettings.TracksDetection;
tracksDetection_CheckBox.eventCheckChanged += (_, isChecked) => ModSettings.TracksDetection = isChecked;
currentY += tracksDetection_CheckBox.height + Margin;
#endregion
#region Follow Mode Options
UISpacers.AddTitleSpacer(scrollPanel, Margin, currentY, headerWidth, Translations.Translate("SETTINGS_GROUPNAME_FOLLOW"));
Expand Down
10 changes: 5 additions & 5 deletions FPSCamera/Code/UI/OffsetSliders.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@

namespace FPSCamera.UI
{
internal class OffsetSliders
public class OffsetSliders
{
internal UISlider x_Slider;
internal UISlider y_Slider;
internal UISlider z_Slider;
internal UIPanel slidersPanel;
public UISlider x_Slider;
public UISlider y_Slider;
public UISlider z_Slider;
public UIPanel slidersPanel;
private const float Margin = 5f;
private const float SliderMargin = 60f;

Expand Down
Loading

0 comments on commit 4b0f9dc

Please sign in to comment.