SHA256
60 lines
2.9 KiB
C#
60 lines
2.9 KiB
C#
using ADOFAIRenderer.Core;
|
|
using HarmonyLib;
|
|
using UnityEngine;
|
|
|
|
namespace ADOFAIRenderer.Patch.Game;
|
|
|
|
/// <summary>
|
|
/// Makes the game's bloom compute its blur size as if the frame were 720 pixels high
|
|
/// ("High-Resolution Bloom Correction" option).
|
|
/// <para>
|
|
/// Patched member: <c>VideoBloom.OnRenderImage(RenderTexture source, RenderTexture destination)</c>. The game scales the
|
|
/// frame down to a bloom buffer 198 pixels high (<c>scale = 198 / source.height</c>) and sets the blur radius in bloom
|
|
/// buffer pixels to <c>KernelSize * MediumKernelScale * scale</c> (and <c>KernelSize * LargeKernelScale * scale</c>).
|
|
/// <c>BloomBlit</c> turns the radius into the number of 5-tap blur passes and the blend amount of the last pass.
|
|
/// </para>
|
|
/// <para>
|
|
/// While the render is active (<see cref="RenderManager.IsActive"/>) and <c>AdvancedConfig.HighResBloomCorrection</c> is
|
|
/// enabled, the prefix multiplies <c>KernelSize</c> by <c>source.height / 720</c> for the duration of the call, so the
|
|
/// radius equals <c>KernelSize * MediumKernelScale * 198 / 720</c> and the blur passes on the bloom buffer are the same
|
|
/// as in a 720p frame. The finalizer restores the original <c>KernelSize</c>. The bloom buffer size and the downscale
|
|
/// from the source frame keep the game's behavior.
|
|
/// </para>
|
|
/// </summary>
|
|
[HarmonyPatch(typeof(VideoBloom))]
|
|
public class VideoBloomPatch
|
|
{
|
|
/// <summary>Frame height in pixels the blur size is computed for.</summary>
|
|
private const float ReferenceHeight = 720f;
|
|
|
|
/// <summary>Prefix of <c>VideoBloom.OnRenderImage</c>.</summary>
|
|
/// <param name="__instance">The bloom component on the game camera.</param>
|
|
/// <param name="source">The camera frame; its height selects the multiplier.</param>
|
|
/// <param name="__state">Original <c>KernelSize</c>, or null when it was not changed.</param>
|
|
[HarmonyPrefix]
|
|
[HarmonyPatch("OnRenderImage")]
|
|
// ReSharper disable InconsistentNaming
|
|
public static void ScaleKernelSize(VideoBloom __instance, RenderTexture source, out float? __state)
|
|
// ReSharper restore InconsistentNaming
|
|
{
|
|
__state = null;
|
|
if (!source || !RenderManager.IsActive || !RenderManager.Instance.Configuration.AdvancedConfig.HighResBloomCorrection)
|
|
return;
|
|
|
|
__state = __instance.KernelSize;
|
|
__instance.KernelSize *= source.height / ReferenceHeight;
|
|
}
|
|
|
|
/// <summary>Finalizer of <c>VideoBloom.OnRenderImage</c>: restores <c>KernelSize</c> when the prefix changed it.</summary>
|
|
/// <param name="__instance">The bloom component on the game camera.</param>
|
|
/// <param name="__state">Original <c>KernelSize</c> stored by the prefix, or null.</param>
|
|
[HarmonyFinalizer]
|
|
[HarmonyPatch("OnRenderImage")]
|
|
// ReSharper disable InconsistentNaming
|
|
public static void RestoreKernelSize(VideoBloom __instance, float? __state)
|
|
// ReSharper restore InconsistentNaming
|
|
{
|
|
if (__state.HasValue) __instance.KernelSize = __state.Value;
|
|
}
|
|
}
|