SHA256
43 lines
2.1 KiB
C#
43 lines
2.1 KiB
C#
using System.Diagnostics.CodeAnalysis;
|
|
using HarmonyLib;
|
|
|
|
namespace ADOFAIRenderer.Patch.Game;
|
|
|
|
/// <summary>
|
|
/// Protects the camera render texture <c>scrCamera.camRT</c> when the custom frame rate effect is turned off while it is
|
|
/// already off.
|
|
/// <para>
|
|
/// Patched member: <c>scrCamera.SetCustomFrameRate(bool enable, float frame)</c> (level effect that updates the screen at a
|
|
/// lower frame rate). Enabling assigns a new RenderTexture to the camera quad material and refreshes it at <c>frame</c> fps.
|
|
/// Disabling calls <c>Release()</c> on the quad material's current <c>mainTexture</c> and assigns <c>camRT</c> back. When
|
|
/// the effect was never enabled, <c>mainTexture</c> is <c>camRT</c> itself, so the original releases the live camera
|
|
/// render texture.
|
|
/// </para>
|
|
/// <para>Always active (independent of the render stage).</para>
|
|
/// </summary>
|
|
[HarmonyPatch(typeof(scrCamera))]
|
|
// ReSharper disable once InconsistentNaming
|
|
public class scrCameraPatch
|
|
{
|
|
/// <summary>
|
|
/// Prefix of <c>scrCamera.SetCustomFrameRate</c>. For a disable request while <c>enableCustomFPS</c> is already false,
|
|
/// stores the arguments in <c>enableCustomFPS</c> / <c>frameRate</c> and skips the original (no texture is released).
|
|
/// Enable requests and disable requests while the effect is on run the original.
|
|
/// </summary>
|
|
/// <param name="__instance">The camera.</param>
|
|
/// <param name="enable">True to turn the custom frame rate on, false to turn it off.</param>
|
|
/// <param name="frame">Custom frame rate in frames per second.</param>
|
|
/// <returns>True to run the original method; false to skip it.</returns>
|
|
[HarmonyPrefix]
|
|
[HarmonyPatch("SetCustomFrameRate")]
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
private static bool FixCamRT(scrCamera __instance, bool enable, float frame)
|
|
{
|
|
// Disable request while the effect is off: the quad material's mainTexture is camRT, which the original would Release().
|
|
if (enable || __instance.enableCustomFPS != enable) return true;
|
|
|
|
__instance.enableCustomFPS = enable;
|
|
__instance.frameRate = frame;
|
|
return false;
|
|
}
|
|
} |