diff --git a/BetterShadowClone/ModSettings.cs b/BetterShadowClone/ModSettings.cs index aa37c5c..a2526f9 100644 --- a/BetterShadowClone/ModSettings.cs +++ b/BetterShadowClone/ModSettings.cs @@ -24,6 +24,10 @@ public static class ModSettings Category.CreateEntry("Copy Material to Shadow", true, description: "Should the shadow clone copy the material from the original mesh? Note: This can have a slight performance hit."); + internal static readonly MelonPreferences_Entry EntryDontRespectFPR = + Category.CreateEntry("Dont Respect FPR", false, + description: "Should the transform hider not respect FPR?"); + internal static readonly MelonPreferences_Entry EntryDebugHeadHide = Category.CreateEntry("Debug Head Hide", false, description: "Should head be hidden for first render?"); @@ -39,6 +43,7 @@ public static class ModSettings private static void OnSettingsChanged(object oldValue = null, object newValue = null) { + TransformHiderManager.s_DisallowFprExclusions = EntryDontRespectFPR.Value; TransformHiderManager.s_DebugHeadHide = EntryDebugHeadHide.Value; ShadowCloneManager.s_CopyMaterialsToShadow = EntryCopyMaterialToShadow.Value; } diff --git a/BetterShadowClone/TransformHider/FPRExclusion.cs b/BetterShadowClone/TransformHider/FPRExclusion.cs index 80ba948..c02ceca 100644 --- a/BetterShadowClone/TransformHider/FPRExclusion.cs +++ b/BetterShadowClone/TransformHider/FPRExclusion.cs @@ -10,9 +10,7 @@ public class FPRExclusion : MonoBehaviour { public Transform target; - internal List affectedChildren = new(); - - [NonSerialized] + internal readonly List affectedChildren = new(); internal readonly List relatedTasks = new(); private void OnEnable() diff --git a/BetterShadowClone/TransformHider/ITransformHider/ITransformHider.cs b/BetterShadowClone/TransformHider/ITransformHider/ITransformHider.cs index cd4a94a..4922adf 100644 --- a/BetterShadowClone/TransformHider/ITransformHider/ITransformHider.cs +++ b/BetterShadowClone/TransformHider/ITransformHider/ITransformHider.cs @@ -6,6 +6,6 @@ public interface ITransformHider : IDisposable bool IsValid { get; } bool Process(); bool PostProcess(); - void HideTransform(); + void HideTransform(bool forced = false); void ShowTransform(); } \ No newline at end of file diff --git a/BetterShadowClone/TransformHider/ITransformHider/MeshTransformHider.cs b/BetterShadowClone/TransformHider/ITransformHider/MeshTransformHider.cs index a498b5a..d0ac6a9 100644 --- a/BetterShadowClone/TransformHider/ITransformHider/MeshTransformHider.cs +++ b/BetterShadowClone/TransformHider/ITransformHider/MeshTransformHider.cs @@ -16,6 +16,9 @@ public class MeshTransformHider : ITransformHider, IFPRExclusionTask private readonly MeshRenderer _mainMesh; private bool _enabledState; + // exclusion + private readonly FPRExclusion _exclusion; + #region ITransformHider Methods public bool IsActive { get; set; } = true; // default hide, but FPRExclusion can override @@ -34,7 +37,8 @@ public class MeshTransformHider : ITransformHider, IFPRExclusionTask return; } - exclusion.relatedTasks.Add(this); + _exclusion = exclusion; + _exclusion.relatedTasks.Add(this); _mainMesh = renderer; @@ -71,14 +75,15 @@ public class MeshTransformHider : ITransformHider, IFPRExclusionTask _frameInitCounter++; return false; } - - public bool PostProcess() - { - return true; - } - public void HideTransform() + public bool PostProcess() + => true; + + public void HideTransform(bool forced = false) { + if (!forced && !IsActive) + return; + _enabledState = _mainMesh.enabled; _mainMesh.enabled = false; } diff --git a/BetterShadowClone/TransformHider/ITransformHider/SkinnedTransformHider.cs b/BetterShadowClone/TransformHider/ITransformHider/SkinnedTransformHider.cs index f0be524..852bafd 100644 --- a/BetterShadowClone/TransformHider/ITransformHider/SkinnedTransformHider.cs +++ b/BetterShadowClone/TransformHider/ITransformHider/SkinnedTransformHider.cs @@ -75,7 +75,7 @@ public class SkinnedTransformHider : ITransformHider if (exclusionVerts.Count == 0) continue; - SubTask subTask = new(this, exclusion.target, exclusionVerts); + SubTask subTask = new(this, exclusion, exclusionVerts); _subTasks.Add(subTask); exclusion.relatedTasks.Add(subTask); } @@ -116,14 +116,15 @@ public class SkinnedTransformHider : ITransformHider public bool PostProcess() => false; // not needed - public void HideTransform() + public void HideTransform(bool forced = false) { _mainMesh.forceRenderingOff = false; _graphicsBuffer = _mainMesh.GetVertexBuffer(); foreach (SubTask subTask in _subTasks) - if (subTask.IsActive && subTask.IsValid) subTask.Dispatch(); + if ((forced || subTask.IsActive) && subTask.IsValid) + subTask.Dispatch(); _graphicsBuffer.Release(); } @@ -169,17 +170,20 @@ public class SkinnedTransformHider : ITransformHider { public bool IsActive { get; set; } = true; public bool IsValid => _computeBuffer != null; // TODO: cleanup dead tasks - + private readonly SkinnedTransformHider _parent; private readonly Transform _shrinkBone; private readonly int _vertexCount; private readonly ComputeBuffer _computeBuffer; private readonly int _threadGroups; - public SubTask(SkinnedTransformHider parent, Transform shrinkBone, List exclusionVerts) + private readonly FPRExclusion _exclusion; + + public SubTask(SkinnedTransformHider parent, FPRExclusion exclusion, List exclusionVerts) { _parent = parent; - _shrinkBone = shrinkBone; + _exclusion = exclusion; + _shrinkBone = _exclusion.target; _vertexCount = exclusionVerts.Count; _computeBuffer = new ComputeBuffer(_vertexCount, sizeof(int)); diff --git a/BetterShadowClone/TransformHider/TransformHiderManager.cs b/BetterShadowClone/TransformHider/TransformHiderManager.cs index b820d93..2c14854 100644 --- a/BetterShadowClone/TransformHider/TransformHiderManager.cs +++ b/BetterShadowClone/TransformHider/TransformHiderManager.cs @@ -1,4 +1,5 @@ using ABI_RC.Core.Player; +using ABI_RC.Systems.VRModeSwitch; using MagicaCloth; using UnityEngine; @@ -32,6 +33,7 @@ public class TransformHiderManager : MonoBehaviour // Settings internal static bool s_DebugHeadHide; + internal static bool s_DisallowFprExclusions = true; // Implementation private bool _hasRenderedThisFrame; @@ -58,7 +60,10 @@ public class TransformHiderManager : MonoBehaviour UpdatePlayerCameras(); + s_DisallowFprExclusions = ModSettings.EntryDontRespectFPR.Value; s_DebugHeadHide = ModSettings.EntryDebugHeadHide.Value; + + VRModeSwitchEvents.OnCompletedVRModeSwitch.AddListener(OnVRModeSwitchCompleted); } private void OnEnable() @@ -72,7 +77,13 @@ public class TransformHiderManager : MonoBehaviour Camera.onPreRender -= MyOnPreRender; Camera.onPostRender -= MyOnPostRender; } - + + private void OnDestroy() + { + VRModeSwitchEvents.OnCompletedVRModeSwitch.RemoveListener(OnVRModeSwitchCompleted); + OnAvatarCleared(); + } + #endregion #region Transform Hider Managment @@ -113,7 +124,7 @@ public class TransformHiderManager : MonoBehaviour if (!hider.Process()) continue; // not ready yet or disabled - if (hider.IsActive) hider.HideTransform(); + hider.HideTransform(s_DisallowFprExclusions); } _stopWatch.Stop(); @@ -136,7 +147,7 @@ public class TransformHiderManager : MonoBehaviour if (!hider.PostProcess()) continue; // does not need post processing - if (hider.IsActive) hider.ShowTransform(); + hider.ShowTransform(); } } @@ -153,10 +164,8 @@ public class TransformHiderManager : MonoBehaviour s_TransformHider.Clear(); } - private void OnVRModeSwitchCompleted(bool _, Camera __) - { - UpdatePlayerCameras(); - } + private void OnVRModeSwitchCompleted(bool _) + => UpdatePlayerCameras(); #endregion