diff --git a/API/RenderSession.cs b/API/RenderSession.cs index 3623847..ba28895 100644 --- a/API/RenderSession.cs +++ b/API/RenderSession.cs @@ -146,8 +146,8 @@ public class RenderSession RenderManager.Instance.levelPath = levelPath; RenderManager.Instance.Configuration = renderConfig; - - RenderManager.Instance.StartLoadingOverride(); + + RenderManager.Instance.stage = RenderStage.Load; if (_outputPath is null) RenderManager.Instance.SetupCaptureDirectory(); else FileUtil.CreateDirectory(Path.GetDirectoryName(_outputPath) ?? throw new InvalidOperationException()); diff --git a/Core/RenderManager.cs b/Core/RenderManager.cs index a380ffd..6a08601 100644 --- a/Core/RenderManager.cs +++ b/Core/RenderManager.cs @@ -22,6 +22,11 @@ using ThreadPriority = System.Threading.ThreadPriority; namespace ADOFAIRenderer.Core; +internal enum RenderStage +{ + None, Load, OnScene, Render +} + internal static class RenderContext { public static bool Auto = true; @@ -68,8 +73,8 @@ internal class RenderManager : MonoBehaviour { // Singleton Accessors public static RenderManager Instance { get; private set; } = null!; - public static bool IsActive => Instance && Instance.IsRendering; - public static bool IsCapturingActive => Instance && Instance.IsCapturing; + public static bool IsActive => Instance && Instance.stage >= RenderStage.OnScene; + public static bool IsCapturingActive => Instance && Instance.stage >= RenderStage.Render; public const int MaxQueuedFrames = 64; @@ -86,9 +91,7 @@ internal class RenderManager : MonoBehaviour public RenderConfig Configuration = null!; // Render Sessions State (OOP Instance Fields) - public bool OverrideLoading { get; private set; } - private bool IsRendering { get; set; } - private bool IsCapturing { get; set; } + public RenderStage stage = RenderStage.None; public double timeBase; public double unscaledTimeBase; public double dspTimeBase; @@ -142,28 +145,10 @@ internal class RenderManager : MonoBehaviour CleanUpActiveRender(); } - public void StartLoadingOverride() - { - OverrideLoading = true; - } - - public void StartRendering() - { - IsRendering = true; - } - - public void StartCapturing() - { - IsCapturing = true; - IsRenderCancelled = false; - } - public void ResetRenderState(bool success) { - IsRendering = false; - IsCapturing = false; - OverrideLoading = false; IsRenderCancelled = !success; + stage = RenderStage.None; } public void CleanUpActiveRender() @@ -233,9 +218,8 @@ internal class RenderManager : MonoBehaviour scrController.instance.noFailInfiniteMargin = true; } - StartRendering(); - countdown = 3; - endFrame = -1; + stage = RenderStage.OnScene; + countdown = 3; endFrame = -1; if (!_escapeHandlerObj) { @@ -248,7 +232,7 @@ internal class RenderManager : MonoBehaviour scrController.instance!.StartCoroutine(SetupPlay()); } - if (!IsRendering) return; + if (Instance.stage < RenderStage.OnScene) return; if (!scrController.instance || scrController.instance.state == States.Fail || scrController.instance.state == States.Fail2) { ResetRenderState(success: false); @@ -272,13 +256,13 @@ internal class RenderManager : MonoBehaviour public void OnPreUpdate() { - if (!IsRendering) return; + if (Instance.stage < RenderStage.OnScene) return; frameCount++; } public void OnLastUpdate() { - if (!OverrideLoading) return; + if (Instance.stage < RenderStage.Load) return; if (!Configuration.AdvancedConfig.NonTile) return; foreach (var floor in scrLevelMaker.instance.listFloors .Where(floor => floor.holdRenderer && floor.holdRenderer.m_meshRenderer.enabled)) @@ -292,12 +276,12 @@ internal class RenderManager : MonoBehaviour // ReSharper disable once Unity.IncorrectMethodSignature public void OnPostFrame(RenderTexture? texture) { - if (!IsCapturing || !texture) return; + if (Instance.stage < RenderStage.Render || !texture) return; // [Backpressure Throttling] isThrottling = false; - - while (IsCapturing && IsRendering) + + while (Instance.stage >= RenderStage.Render) { int count; lock (ImageQueue) @@ -351,7 +335,6 @@ internal class RenderManager : MonoBehaviour var quitDelegate = (Func)Delegate.CreateDelegate(typeof(Func), scnEditor.instance, targetMethod); - if (Instance) Instance.StartLoadingOverride(); Application.wantsToQuit -= quitDelegate; ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "Assets/Scenes/RenderSettingsScene.unity"); }); @@ -418,7 +401,7 @@ internal class RenderManager : MonoBehaviour yield break; } - StartCapturing(); + Instance.stage = RenderStage.Render; scrController.instance.paused = scrController.instance.audioPaused = false; scrController.instance.levelWasSkipped = true; @@ -538,7 +521,7 @@ internal class RenderManager : MonoBehaviour { var firstKey = ImageQueue.Keys[0]; - if (firstKey > passCount && !IsCapturing) + if (firstKey > passCount && Instance.stage < RenderStage.Render) { passCount = firstKey; } diff --git a/Patch/Engine/RenderEnvironmentPatches.cs b/Patch/Engine/RenderEnvironmentPatches.cs index 726aad0..02856c4 100644 --- a/Patch/Engine/RenderEnvironmentPatches.cs +++ b/Patch/Engine/RenderEnvironmentPatches.cs @@ -158,7 +158,7 @@ public static class RenderEnvironmentPatches [SuppressMessage("ReSharper", "InconsistentNaming")] public static void Prefix(ref bool stream) { - if (RenderManager.Instance && RenderManager.Instance.OverrideLoading && RenderManager.Instance.Configuration.AdvancedConfig.ProcessAudio) + if (RenderManager.Instance && RenderManager.Instance.stage >= RenderStage.Load && RenderManager.Instance.Configuration.AdvancedConfig.ProcessAudio) stream = false; } } diff --git a/Patch/Game/scnGamePatch.cs b/Patch/Game/scnGamePatch.cs index bf4df1d..52dcd5c 100644 --- a/Patch/Game/scnGamePatch.cs +++ b/Patch/Game/scnGamePatch.cs @@ -14,7 +14,7 @@ public static class scnGamePatch [HarmonyPatch("Play")] public static void ProcessFloors() { - var nonTile = RenderManager.Instance.OverrideLoading && + var nonTile = RenderManager.Instance.stage >= RenderStage.Load && RenderManager.Instance.Configuration.AdvancedConfig.NonTile; if (!nonTile) return; diff --git a/Patch/Game/scrFloorPatch.cs b/Patch/Game/scrFloorPatch.cs index 2cdb3aa..56c9be8 100644 --- a/Patch/Game/scrFloorPatch.cs +++ b/Patch/Game/scrFloorPatch.cs @@ -14,7 +14,7 @@ public class scrFloorPatch { if (!scrLevelMaker.instance.listFloors.Contains(__instance)) return true; - var nonTile = RenderManager.Instance.OverrideLoading && + var nonTile = RenderManager.Instance.stage >= RenderStage.Load && RenderManager.Instance.Configuration.AdvancedConfig.NonTile; return !nonTile; } diff --git a/Patch/Game/scrPortalParticlesPatch.cs b/Patch/Game/scrPortalParticlesPatch.cs index c90baf0..4cec411 100644 --- a/Patch/Game/scrPortalParticlesPatch.cs +++ b/Patch/Game/scrPortalParticlesPatch.cs @@ -13,7 +13,7 @@ public static class scrPortalParticlesPatch // ReSharper disable once InconsistentNaming public static void ForceScaledTime(scrPortalParticles __instance) { - if (!RenderManager.Instance || !RenderManager.Instance.OverrideLoading) return; + if (!RenderManager.Instance || RenderManager.Instance.stage < RenderStage.Load) return; if (__instance == null) return; var particleSystems = __instance.GetComponentsInChildren(true); diff --git a/UI/RenderConfigUIManager.cs b/UI/RenderConfigUIManager.cs index 0ee1842..5ab3694 100644 --- a/UI/RenderConfigUIManager.cs +++ b/UI/RenderConfigUIManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using ADOFAIRenderer.API; using ADOFAIRenderer.Core; using ADOFAIRenderer.Data; using ADOFAIRenderer.Data.Input; @@ -928,9 +929,8 @@ internal class RenderConfigUIManager : MonoBehaviour if (showJudgementText != null) config.ShowJudgementText = showJudgementText.value; - - RenderManager.Instance.SetupCaptureDirectory(); - RenderManager.Instance.SetupGameScene(); + + new RenderSession().Start(config, RenderManager.Instance.levelPath); } private VisualElement? _presetConfigContainer;