Skip to content

Commit

Permalink
Merge pull request #58 from nicoco007/fpfc-improvements-and-fixes
Browse files Browse the repository at this point in the history
FPFC improvements and fixes for 1.31.1
  • Loading branch information
Auros committed Sep 5, 2023
2 parents bec273f + 9781585 commit 48cd5c1
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 34 deletions.
8 changes: 7 additions & 1 deletion SiraUtil/Installers/SiraSettingsInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,17 @@ public override void InstallBindings()
{
Container.BindInstance(_config.FPFCToggle).AsSingle();
Container.BindInstance(_config.SongControl).AsSingle();
Container.BindInterfacesTo<FPFCSettingsController>().AsSingle();

var args = Environment.GetCommandLineArgs();
if (args.Any(a => a.Equals(FPFCToggle.EnableArgument, StringComparison.OrdinalIgnoreCase)) && !args.Any(a => a.Equals(FPFCToggle.DisableArgument, StringComparison.OrdinalIgnoreCase)))
{
Container.BindInterfacesTo<FPFCSettingsController>().AsSingle();
Container.BindInterfacesTo<FPFCAffinityDaemon>().AsSingle().NonLazy();
}
else
{
Container.Bind<IFPFCSettings>().To<NoFPFCSettings>().AsSingle();
}
}
}
}
4 changes: 4 additions & 0 deletions SiraUtil/SiraUtil.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\Unity.TextMeshPro.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.XR.Management">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\Unity.XR.Management.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.dll</HintPath>
<Private>False</Private>
Expand Down
4 changes: 0 additions & 4 deletions SiraUtil/Tools/FPFC/FPFCAffinityDaemon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@ public FPFCAffinityDaemon(IFPFCSettings fpfcSettings)
_fpfcSettings = fpfcSettings;
}

[AffinityPrefix]
[AffinityPatch(typeof(FirstPersonFlyingController), nameof(FirstPersonFlyingController.Start))]
protected bool FPFCStart() => false;

[AffinityPrefix]
[AffinityPatch(typeof(FirstPersonFlyingController), nameof(FirstPersonFlyingController.OnEnable))]
protected bool FPFCOnEnable() => false;
Expand Down
17 changes: 11 additions & 6 deletions SiraUtil/Tools/FPFC/FPFCFixDaemon.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
using SiraUtil.Affinity;
using UnityEngine;

namespace SiraUtil.Tools.FPFC
{
internal class FPFCFixDaemon : IAffinity
{
private readonly bool _isOculus;
private readonly IFPFCSettings _fpfcSettings;
private readonly IVRPlatformHelper _vrPlatformHelper;

public FPFCFixDaemon(IFPFCSettings fpfcSettings, IVRPlatformHelper vrPlatformHelper)
public FPFCFixDaemon(IFPFCSettings fpfcSettings)
{
_fpfcSettings = fpfcSettings;
_vrPlatformHelper = vrPlatformHelper;
_isOculus = _vrPlatformHelper is OculusVRHelper;
}

[AffinityPatch(typeof(OculusVRHelper), nameof(OculusVRHelper.hasInputFocus), AffinityMethodType.Getter)]
[AffinityPatch(typeof(UnityXRHelper), nameof(UnityXRHelper.hasInputFocus), AffinityMethodType.Getter)]
protected void ForceInputFocus(ref bool __result)
{
if (_isOculus && _fpfcSettings.Enabled)
if (_fpfcSettings.Enabled)
__result = true;
}

[AffinityPatch(typeof(UnityXRHelper), nameof(UnityXRHelper.GetThumbstickValue))]
protected void ForceInputFocus(ref Vector2 __result)
{
if (_fpfcSettings.Enabled)
__result = new Vector2(Input.GetAxis("Mouse ScrollWheel"), Input.GetAxis("Mouse ScrollWheel"));
}
}
}
6 changes: 0 additions & 6 deletions SiraUtil/Tools/FPFC/FPFCInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,6 @@ internal class SiraFullFPFCInstaller : Installer
{
public override void InstallBindings()
{
var args = Environment.GetCommandLineArgs();
if (!args.Any(a => a.Equals(FPFCToggle.EnableArgument, StringComparison.OrdinalIgnoreCase)) || args.Any(a => a.Equals(FPFCToggle.DisableArgument, StringComparison.OrdinalIgnoreCase)))
{
Container.Bind<IFPFCSettings>().To<NoFPFCSettings>().AsSingle();
return;
}
Container.BindInterfacesTo<FPFCToggle>().AsSingle();
Container.BindInterfacesTo<MenuFPFCListener>().AsSingle();
Container.BindInterfacesTo<SmoothCameraListener>().AsSingle();
Expand Down
59 changes: 45 additions & 14 deletions SiraUtil/Tools/FPFC/FPFCToggle.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
using SiraUtil.Services;
using SiraUtil.Logging;
using SiraUtil.Services;
using SiraUtil.Zenject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SpatialTracking;
using UnityEngine.XR;
using UnityEngine.XR.Management;
using VRUIControls;
using Zenject;

Expand All @@ -22,20 +24,20 @@ internal class FPFCToggle : IAsyncInitializable, ITickable, IDisposable
private readonly FPFCState _initialState = new();
private SimpleCameraController _simpleCameraController = null!;

private readonly SiraLog _siraLog;
private readonly MainCamera _mainCamera;
private readonly EventSystem _eventSystem;
private readonly IFPFCSettings _fpfcSettings;
private readonly VRInputModule _vrInputModule;
private readonly List<IFPFCListener> _fpfcListeners;
private readonly IMenuControllerAccessor _menuControllerAccessor;
private readonly Transform _previousEventSystemTransformParent;
private bool _didFirstFocus = false;

public FPFCToggle(MainCamera mainCamera, IFPFCSettings fpfcSettings, VRInputModule vrInputModule, List<IFPFCListener> fpfcListeners, IMenuControllerAccessor menuControllerAccessor)
public FPFCToggle(SiraLog siraLog, MainCamera mainCamera, IFPFCSettings fpfcSettings, VRInputModule vrInputModule, List<IFPFCListener> fpfcListeners, IMenuControllerAccessor menuControllerAccessor)
{
_siraLog = siraLog;
_mainCamera = mainCamera;
_fpfcSettings = fpfcSettings;
_vrInputModule = vrInputModule;
_fpfcListeners = fpfcListeners;
_menuControllerAccessor = menuControllerAccessor;

Expand All @@ -57,8 +59,6 @@ public async Task InitializeAsync(CancellationToken token)
_initialState.CameraFOV = _mainCamera.camera.fieldOfView;
_initialState.StereroTarget = _mainCamera.camera.stereoTargetEye;

if (_fpfcSettings.Enabled)
_mainCamera.camera.transform.parent.gameObject.transform.position = new Vector3(0f, 1.7f, 0f);
_simpleCameraController = _mainCamera.camera.transform.parent.gameObject.AddComponent<SimpleCameraController>();
if (_fpfcSettings.Enabled)
EnableFPFC();
Expand Down Expand Up @@ -120,9 +120,6 @@ private void EnableFPFC()
_menuControllerAccessor.RightController.enabled = false;
}

//if (_vrInputModule != null)
// _vrInputModule.useMouseForPressInput = true;

if (_didFirstFocus)
{
Cursor.lockState = CursorLockMode.Locked;
Expand All @@ -138,6 +135,8 @@ private void EnableFPFC()

foreach (var listener in _fpfcListeners)
listener.Enabled();

DeinitializeXRLoader();
}

private void DisableFPFC()
Expand All @@ -153,12 +152,9 @@ private void DisableFPFC()
_menuControllerAccessor.RightController.enabled = true;
}

//if (_vrInputModule != null)
// _vrInputModule.useMouseForPressInput = false;

_simpleCameraController.AllowInput = false;

if (XRSettings.enabled && !_fpfcSettings.LockViewOnDisable)
if (!_fpfcSettings.LockViewOnDisable)
{
_lastPose = new Pose(_simpleCameraController.transform.position, _simpleCameraController.transform.rotation);
_simpleCameraController.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
Expand All @@ -183,11 +179,15 @@ private void DisableFPFC()

foreach (var listener in _fpfcListeners)
listener.Disabled();

InitializeXRLoader();
}

public void Dispose()
{
_fpfcSettings.Changed -= FPFCSettings_Changed;

InitializeXRLoader();
}

public void Tick()
Expand All @@ -199,5 +199,36 @@ public void Tick()
Cursor.visible = false;
}
}

// we unfortunately need to fully deinitialize/initialize the XR loader since OpenXR doesn't simply stop/start properly
private void InitializeXRLoader()
{
XRManagerSettings manager = XRGeneralSettings.Instance.Manager;

if (manager.activeLoader != null || !manager.activeLoaders.Any(l => l != null))
return;

_siraLog.Notice("Enabling XR Loader");
manager.InitializeLoaderSync();

if (!manager.isInitializationComplete)
{
_siraLog.Error("Failed to initialize XR loader");
return;
}

manager.StartSubsystems();
}

private void DeinitializeXRLoader()
{
XRManagerSettings manager = XRGeneralSettings.Instance.Manager;

if (manager.activeLoader == null)
return;

_siraLog.Notice("Disabling XR Loader");
manager.DeinitializeLoader();
}
}
}
15 changes: 13 additions & 2 deletions SiraUtil/Tools/FPFC/SimpleCameraController.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using UnityEngine;
using System.Collections.Specialized;
using UnityEngine;

namespace SiraUtil.Tools.FPFC
{
Expand All @@ -19,7 +20,7 @@ internal class SimpleCameraController : MonoBehaviour

protected void Awake()
{
_targetCameraState.SetFromTransform(transform);
_targetCameraState.SetFromPose(new Vector3(0, 1.7f, 0), Quaternion.identity);
_interpolatingCameraState.SetFromTransform(transform);
}

Expand Down Expand Up @@ -88,6 +89,16 @@ private class CameraState
public float y;
public float z;

public void SetFromPose(Vector3 position, Quaternion rotation)
{
pitch = rotation.eulerAngles.x;
yaw = rotation.eulerAngles.y;
roll = rotation.eulerAngles.z;
x = position.x;
y = position.y;
z = position.z;
}

public void SetFromTransform(Transform t)
{
pitch = t.eulerAngles.x;
Expand Down
2 changes: 1 addition & 1 deletion SiraUtil/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"version": "3.1.3-dev.3",
"icon": "SiraUtil.Resources.logo.png",
"description": "A powerful utility mod which expands the capabilities and provides more tools to Beat Saber modders.",
"gameVersion": "1.29.4",
"gameVersion": "1.31.1",
"dependsOn": {
"BSIPA": "^4.3.0"
},
Expand Down

0 comments on commit 48cd5c1

Please sign in to comment.