Decompiled source of CustomPostProcessingAPI v1.0.2

CustomPostProcessingAPI/CustomPostProcessingAPI.dll

Decompiled 10 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using CustomPostProcessingAPI.Patches;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("CustomPostProcessingAPI")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CustomPostProcessingAPI")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("517fa4ec-5735-4228-bee2-969d19eba228")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
public enum ClearFlagsType
{
	None,
	Color,
	Depth,
	All
}
public enum InjectionType
{
	BeforeRendering,
	AfterOpaqueDepthAndNormal,
	AfterOpaqueAndSky,
	BeforePreRefraction,
	BeforeTransparent,
	BeforePostProcess,
	AfterPostProcess
}
public enum TargetType
{
	Camera,
	Custom,
	None
}
namespace CustomPostProcessingAPI
{
	public class Content
	{
		public static AssetBundle MainAssets;

		public static void TryLoadAssets()
		{
			if ((Object)(object)MainAssets == (Object)null)
			{
				MainAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "custompassasset"));
				Plugin.mls.LogInfo((object)"Loaded asset bundle!");
			}
		}
	}
	public class CustomPostProcessingManager : MonoBehaviour
	{
		private GameObject go;

		private List<FullScreenCustomPass> _customFSPasses = new List<FullScreenCustomPass>();

		private Material fetchColor;

		public Material dither;

		public Material screenShake;

		public static CustomPostProcessingManager Instance { get; private set; }

		public static bool Initialized { get; private set; }

		public IList<FullScreenCustomPass> CustomFSPasses => _customFSPasses.AsReadOnly();

		public static event EventHandler OnLoad;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
				Initialized = false;
			}
			else
			{
				Object.Destroy((Object)(object)((Component)Instance).gameObject);
				Instance = this;
				Initialized = false;
			}
		}

		private void Start()
		{
			Init();
		}

		private void Init()
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Expected O, but got Unknown
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Expected O, but got Unknown
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			if (!Initialized)
			{
				fetchColor = Content.MainAssets.LoadAsset<Material>("Assets/Custom/Materials/FetchColor.mat");
				dither = Content.MainAssets.LoadAsset<Material>("Assets/Custom/Materials/Dither.mat");
				screenShake = Content.MainAssets.LoadAsset<Material>("Assets/Custom/Materials/Shake.mat");
				((MonoBehaviour)this).StartCoroutine(SetCamera());
				go = GameObject.Find("Systems/Rendering/CustomPass");
				if (Object.op_Implicit((Object)(object)go))
				{
					GameObject val = new GameObject("FetchColorPass");
					val.transform.SetParent(go.transform, false);
					CustomPassVolume val2 = val.AddComponent<CustomPassVolume>();
					FullScreenCustomPass val3 = new FullScreenCustomPass();
					((CustomPass)val3).name = "FetchColorPass";
					val3.fetchColorBuffer = true;
					val3.fullscreenPassMaterial = fetchColor;
					((CustomPass)val3).targetColorBuffer = (TargetBuffer)1;
					((CustomPass)val3).targetDepthBuffer = (TargetBuffer)1;
					val2.injectionPoint = (CustomPassInjectionPoint)3;
					val2.priority = 1f;
					val2.customPasses.Add((CustomPass)(object)val3);
					val2.isGlobal = true;
					Plugin.mls.LogInfo((object)"Custom Post Processing Manager initialized!");
				}
			}
			else
			{
				Plugin.mls.LogWarning((object)"Tried to initialize Custom Post Processing Manager when already initialized!");
			}
		}

		private IEnumerator SetCamera()
		{
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)StartOfRound.Instance != (Object)null && (Object)(object)StartOfRound.Instance.localPlayerController != (Object)null));
			Initialized = true;
			CustomPostProcessingManager.OnLoad?.Invoke(this, EventArgs.Empty);
		}

		public FullScreenCustomPass AddPostProcess(PostProcess post)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			foreach (Transform item in go.transform)
			{
				Transform val = item;
				if (((Object)((Component)val).gameObject).name.ToLower() == post.Name.ToLower())
				{
					Plugin.mls.LogWarning((object)("There's already a PostProcess of name '" + post.Name + "' added!"));
					return null;
				}
			}
			GameObject val2 = new GameObject(post.Name);
			val2.transform.SetParent(go.transform, false);
			CustomPassVolume val3 = val2.AddComponent<CustomPassVolume>();
			FullScreenCustomPass val4 = new FullScreenCustomPass();
			((CustomPass)val4).name = post.Name;
			((CustomPass)val4).clearFlags = CheckFlag(post.ClearFlags);
			val4.fetchColorBuffer = post.FetchColorBuffer;
			val4.fullscreenPassMaterial = post.FullScreenMaterial;
			val4.materialPassName = post.MaterialPassName;
			((CustomPass)val4).targetColorBuffer = CheckTarget(post.TargetColorType);
			((CustomPass)val4).targetDepthBuffer = CheckTarget(post.TargetDepthType);
			((CustomPass)val4).enabled = post.Enabled;
			val3.injectionPoint = CheckInjection(post.InjectionType);
			val3.priority = post.Priority;
			val3.customPasses.Add((CustomPass)(object)val4);
			val3.isGlobal = true;
			_customFSPasses.Add(val4);
			Plugin.mls.LogMessage((object)("Added '" + post.Name + "' to the custom passes!"));
			return val4;
		}

		public FullScreenCustomPass GetPass(string name)
		{
			FullScreenCustomPass val = _customFSPasses.Find((FullScreenCustomPass x) => ((CustomPass)x).name.ToLower() == name.ToLower());
			if (val != null)
			{
				return val;
			}
			Plugin.mls.LogWarning((object)("Couldn't find pass of name '" + name + "'!"));
			return null;
		}

		public void EnablePass(FullScreenCustomPass fsPass)
		{
			if (fsPass == null)
			{
				Plugin.mls.LogError((object)"The given pass is null!");
				return;
			}
			FullScreenCustomPass val = _customFSPasses.Find((FullScreenCustomPass x) => x == fsPass);
			if (val != null)
			{
				if (!((CustomPass)val).enabled)
				{
					((CustomPass)val).enabled = true;
				}
			}
			else
			{
				Plugin.mls.LogWarning((object)("Couldn't find pass of name '" + ((Object)this).name + "'!"));
			}
		}

		public void DisablePass(FullScreenCustomPass fsPass)
		{
			if (fsPass == null)
			{
				Plugin.mls.LogError((object)"The given pass is null!");
				return;
			}
			FullScreenCustomPass val = _customFSPasses.Find((FullScreenCustomPass x) => x == fsPass);
			if (val != null)
			{
				if (((CustomPass)val).enabled)
				{
					((CustomPass)val).enabled = false;
				}
			}
			else
			{
				Plugin.mls.LogWarning((object)("Couldn't find pass of name '" + ((Object)this).name + "'!"));
			}
		}

		private ClearFlag CheckFlag(ClearFlagsType type)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			return (ClearFlag)(type switch
			{
				ClearFlagsType.None => 0, 
				ClearFlagsType.Color => 1, 
				ClearFlagsType.Depth => 2, 
				ClearFlagsType.All => 7, 
				_ => 0, 
			});
		}

		private TargetBuffer CheckTarget(TargetType type)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			return (TargetBuffer)(type switch
			{
				TargetType.None => 2, 
				TargetType.Camera => 0, 
				TargetType.Custom => 1, 
				_ => 0, 
			});
		}

		private CustomPassInjectionPoint CheckInjection(InjectionType type)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			return (CustomPassInjectionPoint)(type switch
			{
				InjectionType.AfterOpaqueAndSky => 6, 
				InjectionType.AfterOpaqueDepthAndNormal => 5, 
				InjectionType.AfterPostProcess => 3, 
				InjectionType.BeforePostProcess => 2, 
				InjectionType.BeforePreRefraction => 4, 
				InjectionType.BeforeRendering => 0, 
				InjectionType.BeforeTransparent => 1, 
				_ => 1, 
			});
		}
	}
	[BepInPlugin("Chaos.CustomPostProcessingAPI", "CustomPostProcessingAPI", "1.0.2")]
	public class Plugin : BaseUnityPlugin
	{
		private const string modGUID = "Chaos.CustomPostProcessingAPI";

		private const string modName = "CustomPostProcessingAPI";

		private const string modVersion = "1.0.2";

		private readonly Harmony harmony = new Harmony("Chaos.CustomPostProcessingAPI");

		public static Plugin Instance;

		public static ManualLogSource mls;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = ((BaseUnityPlugin)this).Logger;
			Content.TryLoadAssets();
			harmony.PatchAll(typeof(HUDManagerPatch));
			mls.LogInfo((object)"CustomPostProcessingAPI started.");
		}
	}
	public class PostProcess
	{
		public string Name { get; private set; }

		public Material FullScreenMaterial { get; private set; }

		public InjectionType InjectionType { get; set; } = InjectionType.BeforeTransparent;


		public TargetType TargetColorType { get; set; } = TargetType.Camera;


		public TargetType TargetDepthType { get; set; } = TargetType.Camera;


		public ClearFlagsType ClearFlags { get; set; } = ClearFlagsType.None;


		public bool FetchColorBuffer { get; set; } = false;


		public float Priority { get; set; } = 0f;


		public bool Enabled { get; set; } = true;


		public string MaterialPassName { get; set; } = "DrawProcedural";


		public PostProcess(string passName, Material material)
		{
			Name = passName;
			FullScreenMaterial = material;
		}
	}
}
namespace CustomPostProcessingAPI.Patches
{
	[HarmonyPatch(typeof(HUDManager))]
	public class HUDManagerPatch
	{
		[HarmonyPatch(typeof(HUDManager), "Awake")]
		[HarmonyPrefix]
		private static void Awake(ref HUDManager __instance)
		{
			CustomPostProcessingManager component = ((Component)__instance).gameObject.GetComponent<CustomPostProcessingManager>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				((Component)__instance).gameObject.AddComponent<CustomPostProcessingManager>();
			}
		}
	}
}