Decompiled source of GBGraphicsPlus v1.0.0

Mods/GBGraphicsPlus.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using GBGraphicsPlus;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using MelonLoader;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(GraphicsMod), "GBGraphicsPlus", "1.5.0", "Author", null)]
[assembly: MelonGame("Boneloaf", "Gang Beasts")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("GBGraphicsPlus")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Graphics Enhancer for Gang Beasts")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("GBGraphicsPlus")]
[assembly: AssemblyTitle("GBGraphicsPlus")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace GBGraphicsPlus
{
	public class GraphicsMod : MelonMod
	{
		private bool showMenu;

		private bool showPresetsMenu;

		private Rect windowRect = new Rect(20f, 20f, 480f, 680f);

		private bool isDragging;

		private Vector2 dragOffset;

		private Vector2 scrollPosition = Vector2.zero;

		private GUIStyle labelStyle;

		private GUIStyle valueStyle;

		private GUIStyle headerStyle;

		private GUIStyle boxStyle;

		private GUIStyle buttonStyle;

		private float bloomIntensity = 1.71f;

		private float bloomThreshold = 0.69f;

		private float dofFocusDistance = 9.69f;

		private float dofAperture = 1.46f;

		private float dofFocalLength = 63.77f;

		private float caIntensity = 0.17f;

		private float gamma = 1.17f;

		private float contrast = 5.26f;

		private float fogDensity = 0.01f;

		private float vignetteIntensity = 0.25f;

		private List<VolumeProfile> activeProfiles = new List<VolumeProfile>();

		private float drawY;

		private bool settingsChanged;

		private string presetFolder;

		public override void OnInitializeMelon()
		{
			presetFolder = Path.Combine(MelonEnvironment.UserDataDirectory, "GBGraphicsPlus");
			if (!Directory.Exists(presetFolder))
			{
				Directory.CreateDirectory(presetFolder);
			}
		}

		public override void OnSceneWasLoaded(int buildIndex, string sceneName)
		{
			activeProfiles.Clear();
			Camera main = Camera.main;
			if ((Object)(object)main != (Object)null)
			{
				UniversalAdditionalCameraData component = ((Component)main).GetComponent<UniversalAdditionalCameraData>();
				if ((Object)(object)component != (Object)null)
				{
					component.requiresDepthTexture = true;
					component.renderPostProcessing = true;
				}
			}
			Volume[] array = Il2CppArrayBase<Volume>.op_Implicit(Object.FindObjectsOfType<Volume>());
			if (array != null)
			{
				Volume[] array2 = array;
				foreach (Volume val in array2)
				{
					if ((Object)(object)val.profile != (Object)null)
					{
						val.isGlobal = true;
						activeProfiles.Add(val.profile);
					}
				}
			}
			ApplyRealTimeSettings();
		}

		public override void OnUpdate()
		{
			if (Keyboard.current != null && ((ButtonControl)Keyboard.current.f9Key).wasPressedThisFrame)
			{
				showMenu = !showMenu;
			}
			if (showMenu)
			{
				Cursor.visible = true;
				Cursor.lockState = (CursorLockMode)0;
			}
		}

		public override void OnGUI()
		{
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Invalid comparison between Unknown and I4
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Invalid comparison between Unknown and I4
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			if (!showMenu)
			{
				return;
			}
			Cursor.visible = true;
			Cursor.lockState = (CursorLockMode)0;
			if (boxStyle == null)
			{
				InitializeStyles();
			}
			Event current = Event.current;
			if (current != null)
			{
				Rect val = default(Rect);
				((Rect)(ref val))..ctor(((Rect)(ref windowRect)).x, ((Rect)(ref windowRect)).y, ((Rect)(ref windowRect)).width, 40f);
				if ((int)current.type == 0 && ((Rect)(ref val)).Contains(current.mousePosition))
				{
					isDragging = true;
					dragOffset = current.mousePosition - new Vector2(((Rect)(ref windowRect)).x, ((Rect)(ref windowRect)).y);
				}
				else if ((int)current.type == 1)
				{
					isDragging = false;
				}
				if (isDragging && (int)current.type == 3)
				{
					((Rect)(ref windowRect)).x = current.mousePosition.x - dragOffset.x;
					((Rect)(ref windowRect)).y = current.mousePosition.y - dragOffset.y;
				}
			}
			GUI.backgroundColor = Color.white;
			GUI.Box(windowRect, "GB Graphics+ Menu (F9)", boxStyle);
			scrollPosition = GUI.BeginScrollView(new Rect(((Rect)(ref windowRect)).x + 15f, ((Rect)(ref windowRect)).y + 50f, ((Rect)(ref windowRect)).width - 30f, ((Rect)(ref windowRect)).height - 60f), scrollPosition, new Rect(0f, 0f, ((Rect)(ref windowRect)).width - 50f, 1000f));
			if (showPresetsMenu)
			{
				DrawPresetsMenu();
			}
			else
			{
				DrawMainGUI();
			}
			GUI.EndScrollView();
		}

		private void InitializeStyles()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Expected O, but got Unknown
			//IL_00bd: Expected O, but got Unknown
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Expected O, but got Unknown
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: 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_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Expected O, but got Unknown
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Expected O, but got Unknown
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Expected O, but got Unknown
			Texture2D background = MakeTex(2, 2, new Color(0.05f, 0.05f, 0.05f, 0.95f));
			Texture2D background2 = MakeTex(2, 2, new Color(0.15f, 0.15f, 0.15f, 1f));
			Texture2D background3 = MakeTex(2, 2, new Color(0.25f, 0.25f, 0.25f, 1f));
			GUIStyle val = new GUIStyle(GUI.skin.box);
			val.normal.background = background;
			val.normal.textColor = Color.white;
			val.fontSize = 18;
			val.fontStyle = (FontStyle)1;
			val.alignment = (TextAnchor)1;
			val.padding = new RectOffset(0, 0, 15, 0);
			boxStyle = val;
			GUIStyle val2 = new GUIStyle();
			val2.normal.textColor = new Color(0.9f, 0.9f, 0.9f);
			val2.fontSize = 15;
			val2.fontStyle = (FontStyle)1;
			labelStyle = val2;
			GUIStyle val3 = new GUIStyle();
			val3.normal.textColor = Color.cyan;
			val3.fontSize = 15;
			val3.fontStyle = (FontStyle)1;
			val3.alignment = (TextAnchor)2;
			valueStyle = val3;
			GUIStyle val4 = new GUIStyle();
			val4.normal.textColor = new Color(1f, 0.8f, 0.2f);
			val4.fontSize = 18;
			val4.fontStyle = (FontStyle)1;
			val4.alignment = (TextAnchor)4;
			headerStyle = val4;
			GUIStyle val5 = new GUIStyle(GUI.skin.button);
			val5.normal.background = background2;
			val5.normal.textColor = Color.white;
			val5.hover.background = background3;
			val5.hover.textColor = Color.white;
			val5.fontSize = 14;
			val5.fontStyle = (FontStyle)1;
			buttonStyle = val5;
		}

		private Texture2D MakeTex(int width, int height, Color col)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: 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_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			Color[] array = (Color[])(object)new Color[width * height];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = col;
			}
			Texture2D val = new Texture2D(width, height);
			val.SetPixels(Il2CppStructArray<Color>.op_Implicit(array));
			val.Apply();
			return val;
		}

		private void DrawMainGUI()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			drawY = 0f;
			settingsChanged = false;
			float num = (((Rect)(ref windowRect)).width - 60f) / 2f;
			if (GUI.Button(new Rect(0f, drawY, num, 35f), "Load Presets", buttonStyle))
			{
				showPresetsMenu = true;
			}
			if (GUI.Button(new Rect(num + 10f, drawY, num, 35f), "Save New Preset", buttonStyle))
			{
				SavePreset();
			}
			drawY += 60f;
			DrawHeader("BLOOM");
			bloomIntensity = DrawSlider("Intensity", bloomIntensity, 0f, 30f);
			bloomThreshold = DrawSlider("Threshold", bloomThreshold, 0f, 2f);
			drawY += 10f;
			DrawHeader("DEPTH OF FIELD");
			dofFocusDistance = DrawSlider("Focus Distance", dofFocusDistance, 0.1f, 50f);
			dofAperture = DrawSlider("Aperture (Lower = Blur)", dofAperture, 1f, 32f);
			dofFocalLength = DrawSlider("Focal Length", dofFocalLength, 1f, 300f);
			drawY += 10f;
			DrawHeader("CHROMATIC ABERRATION");
			caIntensity = DrawSlider("Intensity", caIntensity, 0f, 1f);
			drawY += 10f;
			DrawHeader("VIGNETTE");
			vignetteIntensity = DrawSlider("Intensity", vignetteIntensity, 0f, 1f);
			drawY += 10f;
			DrawHeader("COLOR ADJUSTMENTS");
			gamma = DrawSlider("Gamma", gamma, -5f, 5f);
			contrast = DrawSlider("Contrast", contrast, -100f, 100f);
			drawY += 10f;
			DrawHeader("FOG");
			fogDensity = DrawSlider("Density", fogDensity, 0f, 0.1f);
			if (settingsChanged)
			{
				ApplyRealTimeSettings();
			}
		}

		private void DrawPresetsMenu()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			drawY = 0f;
			if (GUI.Button(new Rect(0f, drawY, ((Rect)(ref windowRect)).width - 50f, 35f), "Back to Settings", buttonStyle))
			{
				showPresetsMenu = false;
			}
			drawY += 60f;
			DrawHeader("SAVED PRESETS");
			string[] files = Directory.GetFiles(presetFolder, "*.txt");
			if (files.Length == 0)
			{
				GUI.Label(new Rect(0f, drawY, ((Rect)(ref windowRect)).width - 50f, 30f), "No presets saved yet.", labelStyle);
				return;
			}
			string[] array = files;
			foreach (string text in array)
			{
				string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text);
				if (GUI.Button(new Rect(0f, drawY, ((Rect)(ref windowRect)).width - 50f, 35f), fileNameWithoutExtension, buttonStyle))
				{
					LoadPreset(text);
					showPresetsMenu = false;
				}
				drawY += 45f;
			}
		}

		private void DrawHeader(string text)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			GUI.Label(new Rect(0f, drawY, ((Rect)(ref windowRect)).width - 50f, 30f), text, headerStyle);
			drawY += 35f;
		}

		private float DrawSlider(string label, float value, float min, float max)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			GUI.Label(new Rect(0f, drawY, ((Rect)(ref windowRect)).width - 200f, 25f), label, labelStyle);
			GUI.Label(new Rect(((Rect)(ref windowRect)).width - 150f, drawY, 100f, 25f), value.ToString("F2"), valueStyle);
			drawY += 25f;
			float num = GUI.HorizontalSlider(new Rect(0f, drawY, ((Rect)(ref windowRect)).width - 50f, 25f), value, min, max);
			drawY += 30f;
			if (Mathf.Abs(num - value) > 0.001f)
			{
				settingsChanged = true;
			}
			return num;
		}

		private void ApplyRealTimeSettings()
		{
			RenderSettings.fog = fogDensity > 0.001f;
			RenderSettings.fogDensity = fogDensity;
			Bloom val = default(Bloom);
			DepthOfField val2 = default(DepthOfField);
			ChromaticAberration val3 = default(ChromaticAberration);
			Vignette val4 = default(Vignette);
			ColorAdjustments val5 = default(ColorAdjustments);
			foreach (VolumeProfile activeProfile in activeProfiles)
			{
				if (!((Object)(object)activeProfile == (Object)null))
				{
					if (!activeProfile.TryGet<Bloom>(ref val))
					{
						val = activeProfile.Add<Bloom>(false);
					}
					((VolumeComponent)val).active = true;
					((VolumeParameter<float>)(object)val.intensity).Override(bloomIntensity);
					((VolumeParameter<float>)(object)val.threshold).Override(bloomThreshold);
					if (!activeProfile.TryGet<DepthOfField>(ref val2))
					{
						val2 = activeProfile.Add<DepthOfField>(false);
					}
					((VolumeComponent)val2).active = true;
					((VolumeParameter<DepthOfFieldMode>)(object)val2.mode).Override((DepthOfFieldMode)2);
					((VolumeParameter<float>)(object)val2.focusDistance).Override(dofFocusDistance);
					((VolumeParameter<float>)(object)val2.aperture).Override(dofAperture);
					((VolumeParameter<float>)(object)val2.focalLength).Override(dofFocalLength);
					if (!activeProfile.TryGet<ChromaticAberration>(ref val3))
					{
						val3 = activeProfile.Add<ChromaticAberration>(false);
					}
					((VolumeComponent)val3).active = true;
					((VolumeParameter<float>)(object)val3.intensity).Override(caIntensity);
					if (!activeProfile.TryGet<Vignette>(ref val4))
					{
						val4 = activeProfile.Add<Vignette>(false);
					}
					((VolumeComponent)val4).active = true;
					((VolumeParameter<float>)(object)val4.intensity).Override(vignetteIntensity);
					if (!activeProfile.TryGet<ColorAdjustments>(ref val5))
					{
						val5 = activeProfile.Add<ColorAdjustments>(false);
					}
					((VolumeComponent)val5).active = true;
					((VolumeParameter<float>)(object)val5.postExposure).Override(gamma);
					((VolumeParameter<float>)(object)val5.contrast).Override(contrast);
				}
			}
		}

		private void SavePreset()
		{
			string text = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
			string text2 = Path.Combine(presetFolder, "Preset_" + text + ".txt");
			string[] contents = new string[10]
			{
				"bloomIntensity=" + bloomIntensity,
				"bloomThreshold=" + bloomThreshold,
				"dofFocusDistance=" + dofFocusDistance,
				"dofAperture=" + dofAperture,
				"dofFocalLength=" + dofFocalLength,
				"caIntensity=" + caIntensity,
				"vignetteIntensity=" + vignetteIntensity,
				"gamma=" + gamma,
				"contrast=" + contrast,
				"fogDensity=" + fogDensity
			};
			File.WriteAllLines(text2, contents);
			MelonLogger.Msg("Saved Preset: " + text2);
		}

		private void LoadPreset(string filePath)
		{
			if (!File.Exists(filePath))
			{
				return;
			}
			string[] array = File.ReadAllLines(filePath);
			for (int i = 0; i < array.Length; i++)
			{
				string[] array2 = array[i].Split('=');
				if (array2.Length == 2)
				{
					string text = array2[0];
					float.TryParse(array2[1], out var result);
					switch (text)
					{
					case "bloomIntensity":
						bloomIntensity = result;
						break;
					case "bloomThreshold":
						bloomThreshold = result;
						break;
					case "dofFocusDistance":
						dofFocusDistance = result;
						break;
					case "dofAperture":
						dofAperture = result;
						break;
					case "dofFocalLength":
						dofFocalLength = result;
						break;
					case "caIntensity":
						caIntensity = result;
						break;
					case "vignetteIntensity":
						vignetteIntensity = result;
						break;
					case "gamma":
						gamma = result;
						break;
					case "contrast":
						contrast = result;
						break;
					case "fogDensity":
						fogDensity = result;
						break;
					}
				}
			}
			ApplyRealTimeSettings();
			MelonLogger.Msg("Loaded Preset: " + filePath);
		}
	}
}