Skip to content

Commit

Permalink
Flip camera when focus is lost
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoco007 committed May 23, 2024
1 parent 94ee440 commit e0e7466
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 34 deletions.
4 changes: 4 additions & 0 deletions Source/CustomAvatar/CustomAvatar.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,10 @@
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="UnityEngine.SpatialTracking">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.SpatialTracking.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="UnityEngine.SubsystemsModule">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.SubsystemsModule.dll</HintPath>
<Private>false</Private>
Expand Down
30 changes: 18 additions & 12 deletions Source/CustomAvatar/Player/PlayerAvatarManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ private void OnEnable()
_settings.enableLocomotion.changed += OnEnableLocomotionChanged;

_beatSaberUtilities.roomAdjustChanged += OnRoomAdjustChanged;
_beatSaberUtilities.focusChanged += OnFocusChanged;

_activeOriginManager.changed += OnActiveOriginChanged;
}
Expand Down Expand Up @@ -192,6 +193,7 @@ private void OnDisable()
_settings.enableLocomotion.changed -= OnEnableLocomotionChanged;

_beatSaberUtilities.roomAdjustChanged -= OnRoomAdjustChanged;
_beatSaberUtilities.focusChanged -= OnFocusChanged;

_activeOriginManager.changed -= OnActiveOriginChanged;
}
Expand Down Expand Up @@ -420,8 +422,12 @@ private void OnAvatarVisibleInFirstPersonChanged(bool visible)

private void OnRoomAdjustChanged(Vector3 roomCenter, Quaternion roomRotation)
{
UpdateConstraints();
UpdateLocomotionEnabled();
ResizeCurrentAvatar();
}

private void OnFocusChanged(bool hasFocus)
{
UpdateFirstPersonVisibility();
}

private void UpdateConstraints()
Expand Down Expand Up @@ -514,20 +520,20 @@ internal float ResizeCurrentAvatar(float playerEyeHeight)

private void UpdateFirstPersonVisibility()
{
if (!currentlySpawnedAvatar) return;
if (!currentlySpawnedAvatar)
{
return;
}

FirstPersonVisibility visibility = FirstPersonVisibility.Hidden;

if (_settings.isAvatarVisibleInFirstPerson)
if (!_beatSaberUtilities.hasFocus)
{
if (ignoreFirstPersonExclusions)
{
visibility = FirstPersonVisibility.Visible;
}
else
{
visibility = FirstPersonVisibility.VisibleWithExclusionsApplied;
}
visibility = FirstPersonVisibility.Visible;
}
else if (_settings.isAvatarVisibleInFirstPerson)
{
visibility = ignoreFirstPersonExclusions ? FirstPersonVisibility.Visible : FirstPersonVisibility.VisibleWithExclusionsApplied;
}

currentlySpawnedAvatar.SetFirstPersonVisibility(visibility);
Expand Down
65 changes: 58 additions & 7 deletions Source/CustomAvatar/Rendering/MainCamera.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@
using CustomAvatar.Configuration;
using CustomAvatar.Logging;
using CustomAvatar.Player;
using CustomAvatar.Utilities;
using SiraUtil.Tools.FPFC;
using UnityEngine;
using UnityEngine.SpatialTracking;
using Zenject;

namespace CustomAvatar.Rendering
Expand All @@ -34,26 +36,58 @@ internal class MainCamera : MonoBehaviour
private ActiveOriginManager _activeOriginManager;
private ActiveCameraManager _activeCameraManager;
private IFPFCSettings _fpfcSettings;
private BeatSaberUtilities _beatSaberUtilities;

private Transform _playerSpace;
private Transform _origin;
private Camera _camera;
private TrackedPoseDriver _trackedPoseDriver;

private void Awake()
{
_camera = GetComponent<Camera>();
_trackedPoseDriver = GetComponent<TrackedPoseDriver>();
}

private void OnEnable()
{
if (_settings != null)
{
_settings.cameraNearClipPlane.changed += OnCameraNearClipPlaneChanged;
}

if (_fpfcSettings != null)
{
_fpfcSettings.Changed += OnFpfcSettingsChanged;
}

if (_beatSaberUtilities != null)
{
_beatSaberUtilities.focusChanged += OnFocusChanged;
OnFocusChanged(_beatSaberUtilities.hasFocus);
}

UpdateCameraMask();
}

[Inject]
[SuppressMessage("CodeQuality", "IDE0051", Justification = "Used by Zenject")]
private void Construct(ILogger<MainCamera> logger, Settings settings, ActivePlayerSpaceManager activePlayerSpaceManager, ActiveOriginManager activeOriginManager, ActiveCameraManager activeCameraManager, IFPFCSettings fpfcSettings)
private void Construct(
ILogger<MainCamera> logger,
Settings settings,
ActivePlayerSpaceManager activePlayerSpaceManager,
ActiveOriginManager activeOriginManager,
ActiveCameraManager activeCameraManager,
IFPFCSettings fpfcSettings,
BeatSaberUtilities beatSaberUtilities)
{
_logger = logger;
_settings = settings;
_activePlayerSpaceManager = activePlayerSpaceManager;
_activeOriginManager = activeOriginManager;
_activeCameraManager = activeCameraManager;
_fpfcSettings = fpfcSettings;
_beatSaberUtilities = beatSaberUtilities;
}

private void Start()
Expand All @@ -65,15 +99,11 @@ private void Start()
return;
}

_settings.cameraNearClipPlane.changed += OnCameraNearClipPlaneChanged;
_fpfcSettings.Changed += OnFpfcSettingsChanged;

UpdateCameraMask();

OnEnable();
AddToPlayerSpaceManager();
}

private void OnDestroy()
private void OnDisable()
{
if (_settings != null)
{
Expand All @@ -85,6 +115,14 @@ private void OnDestroy()
_fpfcSettings.Changed -= OnFpfcSettingsChanged;
}

if (_beatSaberUtilities != null)
{
_beatSaberUtilities.focusChanged -= OnFocusChanged;
}
}

private void OnDestroy()
{
RemoveFromPlayerSpaceManager();
}

Expand All @@ -98,8 +136,21 @@ private void OnFpfcSettingsChanged(IFPFCSettings fpfcSettings)
UpdateCameraMask();
}

private void OnFocusChanged(bool hasFocus)
{
_trackedPoseDriver.UseRelativeTransform = !hasFocus;
_trackedPoseDriver.originPose = hasFocus ? Pose.identity : new Pose(
Vector3.ProjectOnPlane(Quaternion.Euler(0, 180, 0) * -transform.localPosition * 2, Vector3.up) + Vector3.ProjectOnPlane(transform.localRotation * Vector3.forward, Vector3.up).normalized * 1.5f,
Quaternion.Euler(0, 180, 0));
}

private void UpdateCameraMask()
{
if (_logger == null || _settings == null || _fpfcSettings == null)
{
return;
}

_logger.LogInformation($"Setting avatar culling mask and near clip plane on '{_camera.name}'");

int mask = _camera.cullingMask | AvatarLayers.kAlwaysVisibleMask;
Expand Down
36 changes: 22 additions & 14 deletions Source/CustomAvatar/Tracking/TrackingRig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
using CustomAvatar.Logging;
using CustomAvatar.Player;
using CustomAvatar.Rendering;
using CustomAvatar.Utilities;
using SiraUtil.Tools.FPFC;
using UnityEngine;
using UnityEngine.Animations;
Expand All @@ -50,6 +51,7 @@ internal class TrackingRig : MonoBehaviour
private CalibrationData _calibrationData;
private VRControllerVisualsManager _vrControllerVisualsManager;
private IVRPlatformHelper _vrPlatformHelper;
private BeatSaberUtilities _beatSaberUtilities;
private IFPFCSettings _fpfcSettings;
private HumanoidCalibrator _humanoidCalibrator;

Expand Down Expand Up @@ -152,8 +154,6 @@ internal bool showRenderModels
}
}

private bool _shouldBeEnabled => _vrPlatformHelper != null && _vrPlatformHelper.hasInputFocus && _vrPlatformHelper.hasVrFocus;

internal void BeginCalibration(CalibrationMode calibrationMode)
{
if (calibrationMode == CalibrationMode.None)
Expand Down Expand Up @@ -322,14 +322,17 @@ private void OnEnable()

private void Start()
{
if (_vrPlatformHelper != null)
if (_beatSaberUtilities != null)
{
_vrPlatformHelper.inputFocusWasCapturedEvent += OnInputFocusWasChanged;
_vrPlatformHelper.inputFocusWasReleasedEvent += OnInputFocusWasChanged;
_beatSaberUtilities.focusChanged += OnFocusChanged;
OnFocusChanged(_beatSaberUtilities.hasFocus);
}

this.enabled = this._shouldBeEnabled;
_parentConstraint.enabled = _scaleConstraint.enabled = !_fpfcSettings.Enabled;
if (_fpfcSettings != null)
{
_fpfcSettings.Changed += OnFpfcSettingsChanged;
OnFpfcSettingsChanged(_fpfcSettings);
}

UpdateOffsets();
UpdateControllerOffsets();
Expand All @@ -349,6 +352,7 @@ private void Start()
CalibrationData calibrationData,
VRControllerVisualsManager vrControllerVisualsManager,
IVRPlatformHelper vrPlatformHelper,
BeatSaberUtilities beatSaberUtilities,
IFPFCSettings fpfcSettings)
{
_logger = logger;
Expand All @@ -362,6 +366,7 @@ private void Start()
_calibrationData = calibrationData;
_vrControllerVisualsManager = vrControllerVisualsManager;
_vrPlatformHelper = vrPlatformHelper;
_beatSaberUtilities = beatSaberUtilities;
_fpfcSettings = fpfcSettings;
_humanoidCalibrator = new HumanoidCalibrator(this, calibrationData, settings, activeOriginManager, mainSettingsModel);
}
Expand Down Expand Up @@ -440,10 +445,9 @@ private void OnDisable()

private void OnDestroy()
{
if (_vrPlatformHelper != null)
if (_beatSaberUtilities != null)
{
_vrPlatformHelper.inputFocusWasCapturedEvent -= OnInputFocusWasChanged;
_vrPlatformHelper.inputFocusWasReleasedEvent -= OnInputFocusWasChanged;
_beatSaberUtilities.focusChanged -= OnFocusChanged;
}
}

Expand Down Expand Up @@ -503,10 +507,14 @@ private void OnControllersDidChangeReference()
UpdateControllerOffsets();
}

private void OnInputFocusWasChanged()
private void OnFpfcSettingsChanged(IFPFCSettings fpfcSettings)
{
_parentConstraint.enabled = _scaleConstraint.enabled = !fpfcSettings.Enabled;
}

private void OnFocusChanged(bool hasFocus)
{
this.enabled = _shouldBeEnabled;
_parentConstraint.enabled = _scaleConstraint.enabled = !_fpfcSettings.Enabled;
enabled = hasFocus;
}

private void UpdateOffsets()
Expand Down Expand Up @@ -727,7 +735,7 @@ private void UpdateRenderModelsVisibility()
return;
}

bool show = _showRenderModels && _settings.showRenderModels && _vrPlatformHelper.hasInputFocus;
bool show = _showRenderModels && _settings.showRenderModels && _beatSaberUtilities.hasFocus;
_leftHandRenderModel?.SetActive(show);
_rightHandRenderModel?.SetActive(show);
_pelvisRenderModel?.SetActive(show);
Expand Down
23 changes: 22 additions & 1 deletion Source/CustomAvatar/Utilities/BeatSaberUtilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,28 +29,44 @@ internal class BeatSaberUtilities : IInitializable, IDisposable
public static readonly float kDefaultPlayerArmSpan = kDefaultPlayerHeight;

private readonly MainSettingsHandler _mainSettingsHandler;
private readonly IVRPlatformHelper _vrPlatformHelper;

internal BeatSaberUtilities(MainSettingsHandler mainSettingsHandler)
internal BeatSaberUtilities(MainSettingsHandler mainSettingsHandler, IVRPlatformHelper vrPlatformHelper)
{
_mainSettingsHandler = mainSettingsHandler;
_vrPlatformHelper = vrPlatformHelper;
}

public Vector3 roomCenter => _mainSettingsHandler.instance.roomCenter;

public Quaternion roomRotation => Quaternion.Euler(0, _mainSettingsHandler.instance.roomRotation, 0);

public bool hasFocus => _vrPlatformHelper.hasInputFocus && _vrPlatformHelper.hasVrFocus;

public event Action<Vector3, Quaternion> roomAdjustChanged;

public event Action<bool> focusChanged;

public void Initialize()
{
_mainSettingsHandler.instance.roomCenterDidChange += OnRoomCenterChanged;
_mainSettingsHandler.instance.roomRotationDidChange += OnRoomRotationChanged;

_vrPlatformHelper.inputFocusWasCapturedEvent += OnFocusWasChanged;
_vrPlatformHelper.inputFocusWasReleasedEvent += OnFocusWasChanged;
_vrPlatformHelper.vrFocusWasCapturedEvent += OnFocusWasChanged;
_vrPlatformHelper.vrFocusWasReleasedEvent += OnFocusWasChanged;
}

public void Dispose()
{
_mainSettingsHandler.instance.roomCenterDidChange -= OnRoomCenterChanged;
_mainSettingsHandler.instance.roomRotationDidChange -= OnRoomRotationChanged;

_vrPlatformHelper.inputFocusWasCapturedEvent -= OnFocusWasChanged;
_vrPlatformHelper.inputFocusWasReleasedEvent -= OnFocusWasChanged;
_vrPlatformHelper.vrFocusWasCapturedEvent -= OnFocusWasChanged;
_vrPlatformHelper.vrFocusWasReleasedEvent -= OnFocusWasChanged;
}

private void OnRoomCenterChanged()
Expand All @@ -62,5 +78,10 @@ private void OnRoomRotationChanged()
{
roomAdjustChanged?.Invoke(roomCenter, roomRotation);
}

private void OnFocusWasChanged()
{
focusChanged?.Invoke(hasFocus);
}
}
}

0 comments on commit e0e7466

Please sign in to comment.