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.Threading; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.RenderGraphModule; using UnityEngine.Rendering.RenderGraphModule.Util; using UnityEngine.Rendering.Universal; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("PeakFilter")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.1.0")] [assembly: AssemblyInformationalVersion("1.1.1")] [assembly: AssemblyProduct("PeakFilter")] [assembly: AssemblyTitle("PeakFilter")] [assembly: AssemblyVersion("1.1.1.0")] [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 PeakFilter { [HarmonyPatch] public static class CursorPatch { private static bool shouldUnlock; public static void SetUnlock(bool unlock) { shouldUnlock = unlock; } [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPrefix] private static bool PrefixLockState(ref CursorLockMode value) { if (shouldUnlock) { value = (CursorLockMode)0; } return true; } [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPrefix] private static bool PrefixVisible(ref bool value) { if (shouldUnlock) { value = true; } return true; } } public static class FilterConfig { private static bool savePending; private static DateTime nextSaveTimeUtc; private static readonly TimeSpan SaveDelay = TimeSpan.FromMilliseconds(500.0); public static ConfigEntry ModEnabled; public static ConfigEntry ActiveFilter; public static ConfigEntry Intensity; public static ConfigEntry SketchEdgeStrength; public static ConfigEntry SketchLineWidth; public static ConfigEntry SketchPaperTexture; public static ConfigEntry PencilDensity; public static ConfigEntry PencilDarkness; public static ConfigEntry PencilPaperGrain; public static ConfigEntry CelOutlineStrength; public static ConfigEntry CelColorSharpness; public static ConfigEntry CelTintAmount; public static ConfigEntry ToonRampSteps; public static ConfigEntry ToonShadowCutoff; public static ConfigEntry ToonInkStrength; public static ConfigEntry HorrorFearTint; public static ConfigEntry HorrorDarkness; public static ConfigEntry HorrorGrain; public static ConfigEntry PixelSize; public static ConfigEntry PixelOutlineStrength; public static ConfigEntry PixelDitherAmount; public static ConfigEntry UIPanelX; public static ConfigEntry UIPanelY; public static ConfigFile ConfigFile { get; private set; } public static long Version { get; private set; } public static void Initialize(ConfigFile config) { ConfigFile = config; ModEnabled = config.Bind("General", "Enabled", true, "Enable/disable the filter mod"); ActiveFilter = config.Bind("General", "ActiveFilter", FilterType.Sketch, "Active filter type"); Intensity = config.Bind("General", "Intensity", 0.86f, "Filter intensity (0-1)"); if (!IsAvailableFilter(ActiveFilter.Value)) { ActiveFilter.Value = FilterType.Sketch; } SketchEdgeStrength = config.Bind("Sketch", "EdgeStrength", 2.8f, "Edge detection strength (0-5)"); SketchLineWidth = config.Bind("Sketch", "LineWidth", 3f, "Line width (0.5-8)"); SketchPaperTexture = config.Bind("Sketch", "PaperTexture", 0.45f, "Paper texture intensity (0-1)"); PencilDensity = config.Bind("PencilSketch", "Density", 3.2f, "Pencil hatching density (0.5-8)"); PencilDarkness = config.Bind("PencilSketch", "Darkness", 1.8f, "Pencil darkness (0-3)"); PencilPaperGrain = config.Bind("PencilSketch", "PaperGrain", 0.5f, "Paper grain intensity (0-1)"); CelOutlineStrength = config.Bind("CelShade", "OutlineStrength", 3.2f, "Outline strength (0-5)"); CelColorSharpness = config.Bind("CelShade", "ColorSharpness", 10f, "Color quantization sharpness (2-20)"); CelTintAmount = config.Bind("CelShade", "TintAmount", 0.55f, "Cel shading tint amount (0-1)"); ToonRampSteps = config.Bind("ToonRamp", "RampSteps", 4f, "Cel ramp steps (2-8)"); ToonShadowCutoff = config.Bind("ToonRamp", "ShadowCutoff", 0.44f, "Shadow separation threshold (0.1-0.9)"); ToonInkStrength = config.Bind("ToonRamp", "InkStrength", 1.4f, "Ink outline strength (0-3)"); HorrorFearTint = config.Bind("Horror", "FearTint", 0.92f, "Cold green-red horror tint (0-1)"); HorrorDarkness = config.Bind("Horror", "Darkness", 0.78f, "Dark vignette and contrast (0-1)"); HorrorGrain = config.Bind("Horror", "Grain", 0.7f, "Dirty film grain amount (0-1)"); PixelSize = config.Bind("Pixelate", "PixelSize", 7f, "Pixel block size (1-30)"); PixelOutlineStrength = config.Bind("Pixelate", "OutlineStrength", 0.8f, "Pixel outline strength (0-3)"); PixelDitherAmount = config.Bind("Pixelate", "DitherAmount", 0.08f, "Pixel dithering amount (0-1)"); UIPanelX = config.Bind("UI", "PanelX", 20f, "UI panel X position"); UIPanelY = config.Bind("UI", "PanelY", 20f, "UI panel Y position"); config.SettingChanged += delegate { Version++; RequestSave(); }; } public static void FlushPendingSave(bool force = false) { if (savePending && ConfigFile != null && (force || !(DateTime.UtcNow < nextSaveTimeUtc))) { ConfigFile.Save(); savePending = false; } } public static void ResetDefaults() { ModEnabled.Value = true; ActiveFilter.Value = FilterType.Sketch; Intensity.Value = 0.86f; SketchEdgeStrength.Value = 2.8f; SketchLineWidth.Value = 3f; SketchPaperTexture.Value = 0.45f; PencilDensity.Value = 3.2f; PencilDarkness.Value = 1.8f; PencilPaperGrain.Value = 0.5f; CelOutlineStrength.Value = 3.2f; CelColorSharpness.Value = 10f; CelTintAmount.Value = 0.55f; ToonRampSteps.Value = 4f; ToonShadowCutoff.Value = 0.44f; ToonInkStrength.Value = 1.4f; HorrorFearTint.Value = 0.92f; HorrorDarkness.Value = 0.78f; HorrorGrain.Value = 0.7f; PixelSize.Value = 7f; PixelOutlineStrength.Value = 0.8f; PixelDitherAmount.Value = 0.08f; } public static void SavePanelPosition(float x, float y) { UIPanelX.Value = x; UIPanelY.Value = y; } private static void RequestSave() { savePending = true; nextSaveTimeUtc = DateTime.UtcNow + SaveDelay; } private static bool IsAvailableFilter(FilterType type) { if ((uint)type <= 5u || type == FilterType.Horror) { return true; } return false; } } public class FilterManager : MonoBehaviour { private PeakFilterFeature filterFeature; private Dictionary materials = new Dictionary(); private AssetBundle shaderBundle; private bool isInitialized; private long lastAppliedConfigVersion = -1L; private static readonly Dictionary ShaderInternalNames = new Dictionary { { FilterType.Sketch, "Hidden/PeakFilter/Sketch" }, { FilterType.PencilSketch, "Hidden/PeakFilter/PencilSketch" }, { FilterType.CelShade, "Hidden/PeakFilter/CelShade" }, { FilterType.ToonRamp, "Hidden/PeakFilter/ToonRamp" }, { FilterType.Horror, "Hidden/PeakFilter/Horror" }, { FilterType.Pixelate, "Hidden/PeakFilter/Pixelate" } }; public bool IsInitialized => isInitialized; public void Initialize() { LoadShaders(); InjectFeature(); isInitialized = true; } private void LoadShaders() { LoadFromAssetBundle(); int num = 0; foreach (KeyValuePair shaderInternalName in ShaderInternalNames) { if (materials.ContainsKey(shaderInternalName.Key) && (Object)(object)materials[shaderInternalName.Key] != (Object)null && (Object)(object)materials[shaderInternalName.Key].shader != (Object)null && ((Object)materials[shaderInternalName.Key].shader).name == shaderInternalName.Value) { num++; } } if (num < ShaderInternalNames.Count) { Debug.LogWarning((object)$"[PeakFilter] AssetBundle loaded {num}/{ShaderInternalNames.Count} shaders, trying Shader.Find fallback..."); LoadFromShaderFind(); } num = 0; foreach (KeyValuePair shaderInternalName2 in ShaderInternalNames) { if (materials.ContainsKey(shaderInternalName2.Key) && (Object)(object)materials[shaderInternalName2.Key] != (Object)null && (Object)(object)materials[shaderInternalName2.Key].shader != (Object)null && ((Object)materials[shaderInternalName2.Key].shader).name == shaderInternalName2.Value) { num++; } } if (num < ShaderInternalNames.Count) { CreateFallbackMaterials(); } LogMissingShaders(); Debug.Log((object)$"[PeakFilter] Shader loading complete: {num}/{ShaderInternalNames.Count} shaders ready."); } private void LogMissingShaders() { foreach (KeyValuePair shaderInternalName in ShaderInternalNames) { if (!materials.ContainsKey(shaderInternalName.Key) || (Object)(object)materials[shaderInternalName.Key] == (Object)null || (Object)(object)materials[shaderInternalName.Key].shader == (Object)null || ((Object)materials[shaderInternalName.Key].shader).name != shaderInternalName.Value) { Debug.LogWarning((object)$"[PeakFilter] Shader not ready: {shaderInternalName.Key} -> '{shaderInternalName.Value}'"); } } } private void LoadFromAssetBundle() { //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Expected O, but got Unknown try { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(directoryName, "peakfilter_shaders"); if (!File.Exists(text)) { text = Path.Combine(directoryName, "Shaders", "peakfilter_shaders"); } if (!File.Exists(text)) { Debug.LogWarning((object)"[PeakFilter] AssetBundle file not found."); return; } shaderBundle = AssetBundle.LoadFromFile(text); if ((Object)(object)shaderBundle == (Object)null) { Debug.LogError((object)"[PeakFilter] Failed to load AssetBundle."); return; } Debug.Log((object)("[PeakFilter] AssetBundle loaded: '" + ((Object)shaderBundle).name + "'")); Shader[] array = shaderBundle.LoadAllAssets(); if (array == null || array.Length == 0) { Debug.LogError((object)"[PeakFilter] No shaders found in AssetBundle."); return; } Debug.Log((object)$"[PeakFilter] Found {array.Length} shaders in bundle:"); Shader[] array2 = array; foreach (Shader val in array2) { Debug.Log((object)$"[PeakFilter] - name='{((Object)val).name}' supported={val.isSupported}"); } foreach (KeyValuePair shaderInternalName in ShaderInternalNames) { if (materials.ContainsKey(shaderInternalName.Key) && (Object)(object)materials[shaderInternalName.Key] != (Object)null && (Object)(object)materials[shaderInternalName.Key].shader != (Object)null && ((Object)materials[shaderInternalName.Key].shader).name == shaderInternalName.Value) { continue; } array2 = array; foreach (Shader val2 in array2) { if (((Object)val2).name == shaderInternalName.Value && val2.isSupported) { materials[shaderInternalName.Key] = new Material(val2) { hideFlags = (HideFlags)61 }; Debug.Log((object)$"[PeakFilter] Material from bundle: {shaderInternalName.Key} -> '{shaderInternalName.Value}'"); break; } } } } catch (Exception ex) { Debug.LogError((object)("[PeakFilter] AssetBundle error: " + ex.Message)); } } private void LoadFromShaderFind() { //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown foreach (KeyValuePair shaderInternalName in ShaderInternalNames) { if (materials.ContainsKey(shaderInternalName.Key) && (Object)(object)materials[shaderInternalName.Key] != (Object)null && (Object)(object)materials[shaderInternalName.Key].shader != (Object)null && ((Object)materials[shaderInternalName.Key].shader).name == shaderInternalName.Value) { continue; } try { Shader val = Shader.Find(shaderInternalName.Value); if ((Object)(object)val != (Object)null && val.isSupported) { materials[shaderInternalName.Key] = new Material(val) { hideFlags = (HideFlags)61 }; Debug.Log((object)$"[PeakFilter] Material from Shader.Find: {shaderInternalName.Key} -> '{shaderInternalName.Value}'"); } } catch (Exception ex) { Debug.LogWarning((object)("[PeakFilter] Shader.Find failed for '" + shaderInternalName.Value + "': " + ex.Message)); } } } private void CreateFallbackMaterials() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown try { Shader val = Shader.Find("Hidden/Universal Render Pipeline/Blit") ?? Shader.Find("Hidden/UniversalRenderPipeline/Blit") ?? Shader.Find("PostProcessing/Blit") ?? Shader.Find("Hidden/PostProcessing/Blit") ?? Shader.Find("Hidden/Blit") ?? Shader.Find("Blit"); if ((Object)(object)val != (Object)null && val.isSupported) { Material value = new Material(val) { hideFlags = (HideFlags)61 }; foreach (FilterType key in ShaderInternalNames.Keys) { if (!materials.ContainsKey(key) || (Object)(object)materials[key] == (Object)null) { materials[key] = value; } } Debug.LogWarning((object)"[PeakFilter] Fallback materials created for missing shaders."); } else { Debug.LogWarning((object)"[PeakFilter] Some shaders are missing and no fallback Blit shader was found."); } } catch (Exception ex) { Debug.LogError((object)("[PeakFilter] Error creating fallback materials: " + ex.Message)); } } private void InjectFeature() { try { RenderPipelineAsset currentRenderPipeline = GraphicsSettings.currentRenderPipeline; UniversalRenderPipelineAsset val = (UniversalRenderPipelineAsset)(object)((currentRenderPipeline is UniversalRenderPipelineAsset) ? currentRenderPipeline : null); if ((Object)(object)val == (Object)null) { Debug.LogError((object)"[PeakFilter] UniversalRenderPipelineAsset not found."); return; } ScriptableRendererData rendererData = GetRendererData(val); if ((Object)(object)rendererData == (Object)null) { Debug.LogError((object)"[PeakFilter] Could not access UniversalRendererData."); return; } for (int i = 0; i < rendererData.rendererFeatures.Count; i++) { if (rendererData.rendererFeatures[i] is PeakFilterFeature peakFilterFeature) { filterFeature = peakFilterFeature; Debug.Log((object)"[PeakFilter] Found existing PeakFilterFeature."); return; } } filterFeature = ScriptableObject.CreateInstance(); ((Object)filterFeature).name = "PeakFilter"; ((ScriptableRendererFeature)filterFeature).Create(); rendererData.rendererFeatures.Add((ScriptableRendererFeature)(object)filterFeature); try { typeof(ScriptableRendererData).GetMethod("SetDirty", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(rendererData, null); } catch { } Debug.Log((object)"[PeakFilter] Injected PeakFilterFeature into URP pipeline."); } catch (Exception ex) { Debug.LogError((object)("[PeakFilter] Error injecting renderer feature: " + ex.Message)); } } private ScriptableRendererData GetRendererData(UniversalRenderPipelineAsset pipelineAsset) { Type type = ((object)pipelineAsset).GetType(); FieldInfo field = type.GetField("m_RendererDataList", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && field.GetValue(pipelineAsset) is ScriptableRendererData[] array && array.Length != 0) { return array[0]; } PropertyInfo property = type.GetProperty("rendererDataList", BindingFlags.Instance | BindingFlags.NonPublic); if (property != null && property.GetValue(pipelineAsset) is ScriptableRendererData[] array2 && array2.Length != 0) { return array2[0]; } return null; } public void UpdateFilter() { if ((Object)(object)filterFeature == (Object)null) { return; } long version = FilterConfig.Version; if (version == lastAppliedConfigVersion) { return; } FilterType value = FilterConfig.ActiveFilter.Value; bool value2 = FilterConfig.ModEnabled.Value; float value3 = FilterConfig.Intensity.Value; if (value == FilterType.None || !materials.ContainsKey(value) || !value2) { filterFeature.IsActive = false; filterFeature.CurrentMaterial = null; lastAppliedConfigVersion = version; return; } Material val = materials[value]; if (val.HasProperty("_Intensity")) { val.SetFloat("_Intensity", value3); } switch (value) { case FilterType.Sketch: if (val.HasProperty("_EdgeStrength")) { val.SetFloat("_EdgeStrength", FilterConfig.SketchEdgeStrength.Value); } if (val.HasProperty("_LineWidth")) { val.SetFloat("_LineWidth", FilterConfig.SketchLineWidth.Value); } if (val.HasProperty("_PaperTexture")) { val.SetFloat("_PaperTexture", FilterConfig.SketchPaperTexture.Value); } break; case FilterType.PencilSketch: if (val.HasProperty("_PencilDensity")) { val.SetFloat("_PencilDensity", FilterConfig.PencilDensity.Value); } if (val.HasProperty("_PencilDarkness")) { val.SetFloat("_PencilDarkness", FilterConfig.PencilDarkness.Value); } if (val.HasProperty("_PaperGrain")) { val.SetFloat("_PaperGrain", FilterConfig.PencilPaperGrain.Value); } break; case FilterType.CelShade: if (val.HasProperty("_OutlineStrength")) { val.SetFloat("_OutlineStrength", FilterConfig.CelOutlineStrength.Value); } if (val.HasProperty("_ColorSharpness")) { val.SetFloat("_ColorSharpness", FilterConfig.CelColorSharpness.Value); } if (val.HasProperty("_TintAmount")) { val.SetFloat("_TintAmount", FilterConfig.CelTintAmount.Value); } break; case FilterType.ToonRamp: if (val.HasProperty("_RampSteps")) { val.SetFloat("_RampSteps", FilterConfig.ToonRampSteps.Value); } if (val.HasProperty("_ShadowCutoff")) { val.SetFloat("_ShadowCutoff", FilterConfig.ToonShadowCutoff.Value); } if (val.HasProperty("_InkStrength")) { val.SetFloat("_InkStrength", FilterConfig.ToonInkStrength.Value); } break; case FilterType.Horror: if (val.HasProperty("_FearTint")) { val.SetFloat("_FearTint", FilterConfig.HorrorFearTint.Value); } if (val.HasProperty("_Darkness")) { val.SetFloat("_Darkness", FilterConfig.HorrorDarkness.Value); } if (val.HasProperty("_Grain")) { val.SetFloat("_Grain", FilterConfig.HorrorGrain.Value); } break; case FilterType.Pixelate: if (val.HasProperty("_PixelSize")) { val.SetFloat("_PixelSize", FilterConfig.PixelSize.Value); } if (val.HasProperty("_OutlineStrength")) { val.SetFloat("_OutlineStrength", FilterConfig.PixelOutlineStrength.Value); } if (val.HasProperty("_DitherAmount")) { val.SetFloat("_DitherAmount", FilterConfig.PixelDitherAmount.Value); } break; } filterFeature.CurrentMaterial = val; filterFeature.IsActive = value2; lastAppliedConfigVersion = version; } public void SetEnabled(bool enabled) { if ((Object)(object)filterFeature != (Object)null) { filterFeature.IsActive = enabled; } } public void ForceUpdate() { lastAppliedConfigVersion = -1L; UpdateFilter(); } private void OnDestroy() { if ((Object)(object)filterFeature != (Object)null) { filterFeature.IsActive = false; filterFeature.CurrentMaterial = null; } HashSet hashSet = new HashSet(); foreach (Material value in materials.Values) { if ((Object)(object)value != (Object)null && hashSet.Add(value)) { Object.DestroyImmediate((Object)(object)value); } } materials.Clear(); if ((Object)(object)shaderBundle != (Object)null) { shaderBundle.Unload(true); shaderBundle = null; } } } public class PeakFilterFeature : ScriptableRendererFeature { public bool IsActive; public Material CurrentMaterial; public override void Create() { } public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { if (IsActive && !((Object)(object)CurrentMaterial == (Object)null)) { PeakFilterPass peakFilterPass = new PeakFilterPass(CurrentMaterial); renderer.EnqueuePass((ScriptableRenderPass)(object)peakFilterPass); } } } public class PeakFilterPass : ScriptableRenderPass { private Material material; public PeakFilterPass(Material mat) { material = mat; ((ScriptableRenderPass)this).renderPassEvent = (RenderPassEvent)550; } public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0056: 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_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)material == (Object)null || (Object)(object)material.shader == (Object)null || !material.shader.isSupported) { return; } UniversalResourceData val = frameData.Get(); if (!val.isActiveTargetBackBuffer) { TextureHandle activeColorTexture = val.activeColorTexture; if (((TextureHandle)(ref activeColorTexture)).IsValid()) { TextureHandle val2 = renderGraph.CreateTexture(activeColorTexture, "_PeakFilterDest", false); BlitMaterialParameters val3 = default(BlitMaterialParameters); ((BlitMaterialParameters)(ref val3))..ctor(activeColorTexture, val2, material, 0); RenderGraphUtils.AddBlitPass(renderGraph, val3, "PeakFilter", "C:\\Users\\17994\\Desktop\\PeakFilter\\FilterRenderer.cs", 52); val.cameraColor = val2; } } } public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } public override void OnCameraCleanup(CommandBuffer cmd) { } } public enum FilterType { None = 0, Sketch = 1, PencilSketch = 2, CelShade = 3, ToonRamp = 4, Pixelate = 5, Horror = 9, [Obsolete("Removed from the active filter set.")] Watercolor = 6, [Obsolete("Removed from the active filter set.")] OilPaint = 7, [Obsolete("Removed from the active filter set.")] ShadowBalance = 8, [Obsolete("Removed from the active filter set.")] DreamBloom = 10, [Obsolete("Removed from the active filter set.")] PosterizePop = 11, [Obsolete("Removed from the active filter set.")] FrostedGlass = 12, [Obsolete("Removed from the active filter set.")] BlackWhite = 100, [Obsolete("Removed from the active filter set.")] Sepia = 101, [Obsolete("Removed from the active filter set.")] Silhouette = 102, [Obsolete("Removed from the active filter set.")] Cyberpunk = 103, [Obsolete("Removed from the active filter set.")] Vintage = 104, [Obsolete("Removed from the active filter set.")] NeonGlow = 105 } public class FilterUI : MonoBehaviour { private class FilterGroup { public string label; public FilterType[] filters; } private bool showPanel; private Rect panelRect = new Rect(20f, 20f, 540f, 560f); private bool isDragging; private Vector2 dragOffset; private float scale = 0.68f; private Vector2 scrollPos; private const string version = "v1.1.1"; private const float PanelWidth = 540f; private const float MaxPanelHeight = 640f; private const float TitleHeight = 42f; private const float ContentPad = 16f; private const float CategoryWidth = 106f; private const float ButtonGap = 8f; private const float RowGap = 8f; private const float ButtonHeight = 34f; private const float SliderBlockHeight = 58f; private static readonly Color PanelBg = new Color(0.9f, 0.96f, 1f, 0.94f); private static readonly Color TitleBg = new Color(0.82f, 0.91f, 1f, 0.78f); private static readonly Color TextColor = new Color(0.12f, 0.14f, 0.26f, 1f); private static readonly Color TextDim = new Color(0.22f, 0.25f, 0.39f, 1f); private static readonly Color GradStart = new Color(0.13f, 0.55f, 0.98f, 1f); private static readonly Color GradMid = new Color(0.67f, 0.34f, 0.95f, 1f); private static readonly Color GradEnd = new Color(1f, 0.72f, 0.48f, 1f); private static readonly Color SelectedBorder = new Color(0.18f, 0.45f, 0.95f, 0.95f); private static readonly FilterGroup[] Groups = new FilterGroup[3] { new FilterGroup { label = "artistic", filters = new FilterType[2] { FilterType.Sketch, FilterType.PencilSketch } }, new FilterGroup { label = "painttoon", filters = new FilterType[2] { FilterType.CelShade, FilterType.ToonRamp } }, new FilterGroup { label = "effects", filters = new FilterType[2] { FilterType.Horror, FilterType.Pixelate } } }; private static readonly Dictionary FilterKeys = new Dictionary { { FilterType.None, "none" }, { FilterType.Sketch, "sketch" }, { FilterType.PencilSketch, "pencilsketch" }, { FilterType.CelShade, "celshade" }, { FilterType.ToonRamp, "toonramp" }, { FilterType.Horror, "horror" }, { FilterType.Pixelate, "pixelate" } }; private static readonly Dictionary, float, float>[]> FilterParams = new Dictionary, float, float>[]> { { FilterType.Sketch, new Tuple, float, float>[3] { Tuple.Create, float, float>("edgeStrength", () => FilterConfig.SketchEdgeStrength.Value, 0f, 5f), Tuple.Create, float, float>("lineWidth", () => FilterConfig.SketchLineWidth.Value, 0.5f, 8f), Tuple.Create, float, float>("paperTexture", () => FilterConfig.SketchPaperTexture.Value, 0f, 1f) } }, { FilterType.PencilSketch, new Tuple, float, float>[3] { Tuple.Create, float, float>("pencilDensity", () => FilterConfig.PencilDensity.Value, 0.5f, 8f), Tuple.Create, float, float>("pencilDarkness", () => FilterConfig.PencilDarkness.Value, 0f, 3f), Tuple.Create, float, float>("paperGrain", () => FilterConfig.PencilPaperGrain.Value, 0f, 1f) } }, { FilterType.CelShade, new Tuple, float, float>[3] { Tuple.Create, float, float>("outlineStrength", () => FilterConfig.CelOutlineStrength.Value, 0f, 5f), Tuple.Create, float, float>("colorSharpness", () => FilterConfig.CelColorSharpness.Value, 2f, 20f), Tuple.Create, float, float>("celTint", () => FilterConfig.CelTintAmount.Value, 0f, 1f) } }, { FilterType.ToonRamp, new Tuple, float, float>[3] { Tuple.Create, float, float>("rampSteps", () => FilterConfig.ToonRampSteps.Value, 2f, 8f), Tuple.Create, float, float>("shadowCutoff", () => FilterConfig.ToonShadowCutoff.Value, 0.1f, 0.9f), Tuple.Create, float, float>("inkStrength", () => FilterConfig.ToonInkStrength.Value, 0f, 3f) } }, { FilterType.Horror, new Tuple, float, float>[3] { Tuple.Create, float, float>("fearTint", () => FilterConfig.HorrorFearTint.Value, 0f, 1f), Tuple.Create, float, float>("darkness", () => FilterConfig.HorrorDarkness.Value, 0f, 1f), Tuple.Create, float, float>("grain", () => FilterConfig.HorrorGrain.Value, 0f, 1f) } }, { FilterType.Pixelate, new Tuple, float, float>[3] { Tuple.Create, float, float>("pixelSize", () => FilterConfig.PixelSize.Value, 1f, 30f), Tuple.Create, float, float>("pixelOutline", () => FilterConfig.PixelOutlineStrength.Value, 0f, 3f), Tuple.Create, float, float>("ditherAmount", () => FilterConfig.PixelDitherAmount.Value, 0f, 1f) } } }; private GUIStyle titleStyle; private GUIStyle sectionStyle; private GUIStyle groupLabelStyle; private GUIStyle btnStyle; private GUIStyle selectedBtnStyle; private GUIStyle closeBtnStyle; private GUIStyle labelStyle; private GUIStyle valueStyle; private bool stylesInit; private Texture2D panelBgTex; private Texture2D titleBgTex; private Texture2D gradSliderBg; private Texture2D sliderTrackTex; private Texture2D buttonGradTex; private Texture2D buttonSelectedTex; private Texture2D buttonHoverTex; private Texture2D whiteTex; private bool texInit; private void InitStyles() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0056: 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_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006a: 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_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: 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_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Expected O, but got Unknown //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016e: 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_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Expected O, but got Unknown //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Expected O, but got Unknown //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Expected O, but got Unknown //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Expected O, but got Unknown if (!stylesInit) { stylesInit = true; GUIStyle val = new GUIStyle(GUI.skin.label) { fontSize = 24, fontStyle = (FontStyle)1, alignment = (TextAnchor)3 }; val.normal.textColor = TextColor; titleStyle = val; GUIStyle val2 = new GUIStyle(GUI.skin.label) { fontSize = 16, fontStyle = (FontStyle)1, alignment = (TextAnchor)3 }; val2.normal.textColor = TextColor; sectionStyle = val2; GUIStyle val3 = new GUIStyle(GUI.skin.label) { fontSize = 13, fontStyle = (FontStyle)1, alignment = (TextAnchor)3, wordWrap = false, clipping = (TextClipping)1 }; val3.normal.textColor = TextDim; groupLabelStyle = val3; GUIStyle val4 = new GUIStyle(GUI.skin.button) { fontSize = 14, fontStyle = (FontStyle)1, alignment = (TextAnchor)4, wordWrap = false, clipping = (TextClipping)1 }; val4.normal.textColor = TextColor; val4.normal.background = null; val4.hover.textColor = TextColor; val4.hover.background = null; val4.active.textColor = TextColor; val4.active.background = null; btnStyle = val4; GUIStyle val5 = new GUIStyle(btnStyle); val5.normal.textColor = Color.white; val5.normal.background = null; val5.hover.textColor = Color.white; val5.hover.background = null; val5.active.textColor = Color.white; val5.active.background = null; selectedBtnStyle = val5; GUIStyle val6 = new GUIStyle(GUIStyle.none) { fontSize = 18, fontStyle = (FontStyle)1, alignment = (TextAnchor)4 }; val6.normal.textColor = new Color(0.78f, 0.84f, 0.96f, 1f); val6.hover.textColor = Color.white; val6.active.textColor = Color.white; closeBtnStyle = val6; GUIStyle val7 = new GUIStyle(GUI.skin.label) { fontSize = 14, alignment = (TextAnchor)3, wordWrap = false, clipping = (TextClipping)1 }; val7.normal.textColor = TextDim; labelStyle = val7; GUIStyle val8 = new GUIStyle(GUI.skin.label) { fontSize = 14, alignment = (TextAnchor)5 }; val8.normal.textColor = TextColor; valueStyle = val8; } } private Texture2D MakeTex(int w, int h, Color c) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0013: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(w, h); for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { val.SetPixel(i, j, c); } } val.Apply(); return val; } private Texture2D MakeGradTex(int w, int h, Color from, Color to) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(w, h); for (int i = 0; i < w; i++) { float num = (float)i / (float)Mathf.Max(w - 1, 1); Color val2 = Color.Lerp(from, to, num); for (int j = 0; j < h; j++) { val.SetPixel(i, j, val2); } } val.Apply(); return val; } private Texture2D MakeSliderGradTex(int w, int h) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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_0027: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(w, h); for (int i = 0; i < w; i++) { float num = (float)i / (float)Mathf.Max(w - 1, 1); Color val2 = ((num < 0.55f) ? Color.Lerp(GradStart, GradMid, num / 0.55f) : Color.Lerp(GradMid, GradEnd, (num - 0.55f) / 0.45f)); for (int j = 0; j < h; j++) { val.SetPixel(i, j, val2); } } val.Apply(); return val; } private void InitTextures() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: 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_0122: Unknown result type (might be due to invalid IL or missing references) if (!texInit) { texInit = true; panelBgTex = MakeTex(1, 1, PanelBg); titleBgTex = MakeTex(1, 1, TitleBg); gradSliderBg = MakeSliderGradTex(256, 1); sliderTrackTex = MakeTex(1, 1, new Color(0.8f, 0.84f, 0.9f, 1f)); buttonGradTex = MakeGradTex(128, 1, new Color(0.19f, 0.55f, 0.98f, 0.95f), new Color(0.55f, 0.32f, 0.88f, 0.95f)); buttonSelectedTex = MakeGradTex(128, 1, new Color(0.1f, 0.35f, 0.82f, 1f), new Color(0.35f, 0.2f, 0.7f, 1f)); buttonHoverTex = MakeTex(1, 1, new Color(1f, 1f, 1f, 0.18f)); whiteTex = MakeTex(1, 1, Color.white); } } private void Awake() { Localization.Initialize(); ((Rect)(ref panelRect)).x = FilterConfig.UIPanelX.Value; ((Rect)(ref panelRect)).y = FilterConfig.UIPanelY.Value; } private void Update() { if (Input.GetKeyDown((KeyCode)284)) { showPanel = !showPanel; CursorPatch.SetUnlock(showPanel); } } private void OnGUI() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_0113: 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_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Invalid comparison between Unknown and I4 //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02cf: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Invalid comparison between Unknown and I4 //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0197: 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_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_014d: 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_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Unknown result type (might be due to invalid IL or missing references) //IL_035b: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_0365: Unknown result type (might be due to invalid IL or missing references) //IL_03be: Unknown result type (might be due to invalid IL or missing references) //IL_03f7: Unknown result type (might be due to invalid IL or missing references) //IL_041d: Unknown result type (might be due to invalid IL or missing references) //IL_046a: Unknown result type (might be due to invalid IL or missing references) //IL_04e1: Unknown result type (might be due to invalid IL or missing references) //IL_06af: Unknown result type (might be due to invalid IL or missing references) //IL_05ed: Unknown result type (might be due to invalid IL or missing references) if (!showPanel) { return; } InitStyles(); InitTextures(); GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one * scale); float num = ((Rect)(ref panelRect)).x / scale; float num2 = ((Rect)(ref panelRect)).y / scale; float num3 = 540f; float contentHeight = GetContentHeight(); float num4 = Mathf.Min(contentHeight + 42f + 8f, 640f); Rect val = default(Rect); ((Rect)(ref val))..ctor(num, num2, num3, num4); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(num + num3 - 40f, num2 + 6f, 30f, 30f); if ((int)Event.current.type == 0 && Event.current.button == 0 && !((Rect)(ref val)).Contains(Event.current.mousePosition)) { showPanel = false; CursorPatch.SetUnlock(unlock: false); Event.current.Use(); GUI.matrix = Matrix4x4.identity; return; } Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(num, num2, num3, 42f); if ((int)Event.current.type == 0 && ((Rect)(ref val3)).Contains(Event.current.mousePosition) && !((Rect)(ref val2)).Contains(Event.current.mousePosition)) { isDragging = true; dragOffset = Event.current.mousePosition - new Vector2(num, num2); Event.current.Use(); } if (isDragging && (int)Event.current.type == 3) { Vector2 val4 = Event.current.mousePosition - dragOffset; ((Rect)(ref panelRect)).x = val4.x * scale; ((Rect)(ref panelRect)).y = val4.y * scale; Event.current.Use(); } if (isDragging && (int)Event.current.type == 1) { isDragging = false; Event.current.Use(); } GUI.DrawTexture(new Rect(num, num2, num3, num4), (Texture)(object)panelBgTex); DrawBorder(num, num2, num3, num4, new Color(1f, 1f, 1f, 0.95f)); GUI.DrawTexture(new Rect(num, num2, num3, 42f), (Texture)(object)titleBgTex); GUI.Label(new Rect(num + 16f, num2 + 2f, num3 - 76f, 38f), Localization.Get("title") + " v1.1.1", titleStyle); DrawSolidRect(new Rect(num + 16f, num2 + 42f - 1f, num3 - 32f, 1f), new Color(0.34f, 0.42f, 0.58f, 0.65f)); DrawSolidRect(val2, new Color(0.12f, 0.14f, 0.28f, 0.96f)); if (GUI.Button(val2, "×", closeBtnStyle)) { showPanel = false; CursorPatch.SetUnlock(unlock: false); } float num5 = num; float num6 = num2 + 42f + 2f; float num7 = num3; float num8 = num4 - 42f - 6f; scrollPos = GUI.BeginScrollView(new Rect(num5, num6, num7, num8), scrollPos, new Rect(0f, 0f, num3 - 18f, contentHeight)); float num9 = 16f; float num10 = 12f; float num11 = num3 - 32f - 18f; float num12 = num9 + 106f + 8f; float num13 = num11 - 106f - 8f; FilterType value = FilterConfig.ActiveFilter.Value; GUI.Label(new Rect(num9, num10, num11, 22f), Localization.Get("filterSelection"), sectionStyle); num10 += 30f; bool selected = value == FilterType.None; GUI.Label(new Rect(num9, num10, 106f, 34f), Localization.Get("filter"), groupLabelStyle); if (DrawFilterButton(new Rect(num12, num10, num13, 34f), Localization.Get("none"), selected)) { FilterConfig.ActiveFilter.Value = FilterType.None; } num10 += 42f; for (int i = 0; i < Groups.Length; i++) { FilterGroup filterGroup = Groups[i]; GUI.Label(new Rect(num9, num10, 106f, 34f), Localization.Get(filterGroup.label), groupLabelStyle); int num14 = Mathf.Max(1, filterGroup.filters.Length); float num15 = (num13 - 8f * (float)(num14 - 1)) / (float)num14; for (int j = 0; j < filterGroup.filters.Length; j++) { FilterType filterType = filterGroup.filters[j]; bool selected2 = value == filterType; float num16 = num12 + (float)j * (num15 + 8f); if (DrawFilterButton(new Rect(num16, num10, num15, 34f), Localization.Get(FilterKeys[filterType]), selected2)) { FilterConfig.ActiveFilter.Value = filterType; } } num10 += 42f; } num10 += 8f; DrawSeparator(num9, num10, num11); num10 += 14f; float value2 = FilterConfig.Intensity.Value; DrawSliderBlock(num9, num10, num11, Localization.Get("intensity"), ref value2, 0f, 1f); if (!Mathf.Approximately(FilterConfig.Intensity.Value, value2)) { FilterConfig.Intensity.Value = value2; } num10 += 58f; DrawSeparator(num9, num10, num11); num10 += 14f; if (value != 0 && FilterParams.ContainsKey(value)) { GUI.Label(new Rect(num9, num10, num11, 22f), Localization.Get("filterParams"), sectionStyle); num10 += 30f; Tuple, float, float>[] array = FilterParams[value]; foreach (Tuple, float, float> obj in array) { string item = obj.Item1; float value3 = obj.Item2(); float item2 = obj.Item3; float item3 = obj.Item4; DrawSliderBlock(num9, num10, num11, Localization.Get(item), ref value3, item2, item3); num10 += 58f; ConfigEntry paramEntry = GetParamEntry(value, item); if (paramEntry != null && !Mathf.Approximately(paramEntry.Value, value3)) { paramEntry.Value = value3; } } } GUI.EndScrollView(); GUI.matrix = Matrix4x4.identity; } private float GetContentHeight() { float num = 12f; num += 30f; num += (float)(1 + Groups.Length) * 42f; num += 94f; FilterType value = FilterConfig.ActiveFilter.Value; if (value != 0 && FilterParams.ContainsKey(value)) { num += 30f; Tuple, float, float>[] array = FilterParams[value]; for (int i = 0; i < array.Length; i++) { _ = array[i]; num += 58f; } } return num + 10f; } private bool DrawFilterButton(Rect rect, string text, bool selected) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) bool num = ((Rect)(ref rect)).Contains(Event.current.mousePosition); GUI.DrawTexture(rect, (Texture)(object)(selected ? buttonSelectedTex : buttonGradTex)); if (num) { GUI.DrawTexture(rect, (Texture)(object)buttonHoverTex); } DrawBorder(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height, (Color)(selected ? SelectedBorder : new Color(1f, 1f, 1f, 0.55f))); GUI.Label(rect, text, selected ? selectedBtnStyle : btnStyle); return GUI.Button(rect, GUIContent.none, GUIStyle.none); } private void DrawSliderBlock(float x, float y, float w, string label, ref float value, float min, float max) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) GUI.Label(new Rect(x, y, w * 0.65f, 22f), label, labelStyle); GUI.Label(new Rect(x + w * 0.65f, y, w * 0.35f, 22f), value.ToString("F2"), valueStyle); DrawGradientSlider(x + 2f, y + 30f, w - 4f, ref value, min, max); } private void DrawGradientSlider(float x, float y, float w, ref float value, float min, float max) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected I4, but got Unknown //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) float num = Mathf.InverseLerp(min, max, value); Rect val = default(Rect); ((Rect)(ref val))..ctor(x - 8f, y - 8f, w + 16f, 30f); int controlID = GUIUtility.GetControlID("PeakFilterSlider".GetHashCode(), (FocusType)2, val); Event current = Event.current; EventType typeForControl = current.GetTypeForControl(controlID); switch ((int)typeForControl) { case 0: if (current.button == 0 && ((Rect)(ref val)).Contains(current.mousePosition)) { GUIUtility.hotControl = controlID; value = SliderValueFromMouse(current.mousePosition.x, x, w, min, max); current.Use(); } break; case 3: if (GUIUtility.hotControl == controlID) { value = SliderValueFromMouse(current.mousePosition.x, x, w, min, max); current.Use(); } break; case 1: if (GUIUtility.hotControl == controlID) { GUIUtility.hotControl = 0; current.Use(); } break; } num = Mathf.InverseLerp(min, max, value); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(x, y + 4f, w, 10f); GUI.DrawTexture(val2, (Texture)(object)sliderTrackTex); DrawBorder(((Rect)(ref val2)).x, ((Rect)(ref val2)).y, ((Rect)(ref val2)).width, ((Rect)(ref val2)).height, new Color(0.2f, 0.23f, 0.34f, 0.9f)); float num2 = num * w; if (num2 > 0f) { GUI.DrawTextureWithTexCoords(new Rect(x, y + 4f, num2, 10f), (Texture)(object)gradSliderBg, new Rect(0f, 0f, Mathf.Clamp01(num), 1f)); } float num3 = 16f; float num4 = 18f; float num5 = x + num * w - num3 / 2f; Rect rect = default(Rect); ((Rect)(ref rect))..ctor(num5, y, num3, num4); DrawSolidRect(rect, new Color(0.92f, 0.95f, 1f, 1f)); DrawBorder(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height, new Color(0.2f, 0.23f, 0.34f, 0.95f)); } private float SliderValueFromMouse(float mouseX, float x, float w, float min, float max) { float num = Mathf.Clamp01((mouseX - x) / w); return Mathf.Round(Mathf.Lerp(min, max, num) * 100f) / 100f; } private void DrawSeparator(float x, float y, float w) { //IL_0009: 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) DrawSolidRect(new Rect(x, y, w, 1f), new Color(0.34f, 0.42f, 0.58f, 0.55f)); } private void DrawSolidRect(Rect rect, Color color) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) Color color2 = GUI.color; GUI.color = color; GUI.DrawTexture(rect, (Texture)(object)whiteTex); GUI.color = color2; } private void DrawBorder(float x, float y, float w, float h, Color color) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: 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_0060: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(new Rect(x, y, w, 1f), color); DrawSolidRect(new Rect(x, y + h - 1f, w, 1f), color); DrawSolidRect(new Rect(x, y, 1f, h), color); DrawSolidRect(new Rect(x + w - 1f, y, 1f, h), color); } private ConfigEntry GetParamEntry(FilterType type, string key) { switch (type) { case FilterType.Sketch: switch (key) { case "edgeStrength": return FilterConfig.SketchEdgeStrength; case "lineWidth": return FilterConfig.SketchLineWidth; case "paperTexture": return FilterConfig.SketchPaperTexture; } break; case FilterType.PencilSketch: switch (key) { case "pencilDensity": return FilterConfig.PencilDensity; case "pencilDarkness": return FilterConfig.PencilDarkness; case "paperGrain": return FilterConfig.PencilPaperGrain; } break; case FilterType.CelShade: switch (key) { case "outlineStrength": return FilterConfig.CelOutlineStrength; case "colorSharpness": return FilterConfig.CelColorSharpness; case "celTint": return FilterConfig.CelTintAmount; } break; case FilterType.ToonRamp: switch (key) { case "rampSteps": return FilterConfig.ToonRampSteps; case "shadowCutoff": return FilterConfig.ToonShadowCutoff; case "inkStrength": return FilterConfig.ToonInkStrength; } break; case FilterType.Horror: switch (key) { case "fearTint": return FilterConfig.HorrorFearTint; case "darkness": return FilterConfig.HorrorDarkness; case "grain": return FilterConfig.HorrorGrain; } break; case FilterType.Pixelate: switch (key) { case "pixelSize": return FilterConfig.PixelSize; case "pixelOutline": return FilterConfig.PixelOutlineStrength; case "ditherAmount": return FilterConfig.PixelDitherAmount; } break; } return null; } private void OnDisable() { FilterConfig.SavePanelPosition(((Rect)(ref panelRect)).x, ((Rect)(ref panelRect)).y); FilterConfig.FlushPendingSave(force: true); } private void OnDestroy() { DestroyTexture(panelBgTex); DestroyTexture(titleBgTex); DestroyTexture(gradSliderBg); DestroyTexture(sliderTrackTex); DestroyTexture(buttonGradTex); DestroyTexture(buttonSelectedTex); DestroyTexture(buttonHoverTex); DestroyTexture(whiteTex); } private void DestroyTexture(Texture2D tex) { if ((Object)(object)tex != (Object)null) { Object.DestroyImmediate((Object)(object)tex); } } } public static class Localization { private static FieldInfo currentLanguageField; private static PropertyInfo currentLanguageProperty; private static bool languageMemberResolved; private static readonly Dictionary EN = new Dictionary { { "title", "Peak Filter" }, { "enabled", "Enabled" }, { "filter", "Filter" }, { "filterSelection", "Filter Selection" }, { "filterParams", "Filter Parameters" }, { "intensity", "Intensity" }, { "reset", "Reset" }, { "none", "None" }, { "sketch", "Hand Drawn" }, { "pencilsketch", "Pencil Sketch" }, { "celshade", "Anime" }, { "toonramp", "Toon Ramp" }, { "horror", "Horror" }, { "pixelate", "Pixelate" }, { "edgeStrength", "Edge Strength" }, { "lineWidth", "Line Width" }, { "paperTexture", "Paper Texture" }, { "pencilDensity", "Pencil Density" }, { "pencilDarkness", "Pencil Darkness" }, { "paperGrain", "Paper Grain" }, { "outlineStrength", "Outline Strength" }, { "colorSharpness", "Color Sharpness" }, { "celTint", "Anime Tint" }, { "rampSteps", "Ramp Steps" }, { "shadowCutoff", "Shadow Cutoff" }, { "inkStrength", "Ink Strength" }, { "fearTint", "Fear Tint" }, { "darkness", "Darkness" }, { "grain", "Grain" }, { "pixelSize", "Pixel Size" }, { "pixelOutline", "Pixel Outline" }, { "ditherAmount", "Dither" }, { "artistic", "Artistic" }, { "painttoon", "Paint & Toon" }, { "effects", "Effects" } }; private static readonly Dictionary CN = new Dictionary { { "title", "PEAK 滤镜" }, { "enabled", "启用" }, { "filter", "滤镜" }, { "filterSelection", "滤镜选择" }, { "filterParams", "滤镜参数" }, { "intensity", "强度" }, { "reset", "重置" }, { "none", "无" }, { "sketch", "手绘" }, { "pencilsketch", "素描" }, { "celshade", "动漫" }, { "toonramp", "三渲二" }, { "horror", "恐怖" }, { "pixelate", "像素风" }, { "edgeStrength", "边缘强度" }, { "lineWidth", "线条宽度" }, { "paperTexture", "纸张纹理" }, { "pencilDensity", "铅笔密度" }, { "pencilDarkness", "铅笔深度" }, { "paperGrain", "纸张颗粒" }, { "outlineStrength", "轮廓强度" }, { "colorSharpness", "色块锐度" }, { "celTint", "动漫着色" }, { "rampSteps", "色阶层数" }, { "shadowCutoff", "阴影分界" }, { "inkStrength", "描边强度" }, { "fearTint", "恐怖色调" }, { "darkness", "压暗程度" }, { "grain", "颗粒噪点" }, { "pixelSize", "像素大小" }, { "pixelOutline", "像素轮廓" }, { "ditherAmount", "抖动量" }, { "artistic", "艺术绘制" }, { "painttoon", "绘画动漫" }, { "effects", "效果风格" } }; public static void Initialize() { ResolveLanguageMember(); } public static string Get(string key) { if (!(IsCurrentLanguageChinese() ? CN : EN).TryGetValue(key, out var value)) { return key; } return value; } private static bool IsCurrentLanguageChinese() { try { object currentGameLanguage = GetCurrentGameLanguage(); if (currentGameLanguage != null) { return currentGameLanguage.ToString().IndexOf("Chinese", StringComparison.OrdinalIgnoreCase) >= 0; } } catch { } try { return Thread.CurrentThread.CurrentUICulture.Name.StartsWith("zh", StringComparison.OrdinalIgnoreCase); } catch { return false; } } private static object GetCurrentGameLanguage() { ResolveLanguageMember(); if (currentLanguageField != null) { return currentLanguageField.GetValue(null); } if (!(currentLanguageProperty != null)) { return null; } return currentLanguageProperty.GetValue(null, null); } private static void ResolveLanguageMember() { if (!languageMemberResolved) { languageMemberResolved = true; Type type = Type.GetType("LocalizedText, Assembly-CSharp"); if (!(type == null)) { currentLanguageField = type.GetField("CURRENT_LANGUAGE", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); currentLanguageProperty = type.GetProperty("CURRENT_LANGUAGE", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); } } } } [BepInPlugin("com.peak.filter", "PeakFilter", "1.1.1")] public class Plugin : BaseUnityPlugin { public const string PluginVersion = "1.1.1"; private FilterManager filterManager; private FilterUI filterUI; private void Awake() { FilterConfig.Initialize(((BaseUnityPlugin)this).Config); Harmony.CreateAndPatchAll(typeof(CursorPatch), (string)null); filterManager = ((Component)this).gameObject.AddComponent(); filterUI = ((Component)this).gameObject.AddComponent(); filterManager.Initialize(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"PeakFilter v1.1.1 loaded successfully."); } private void Update() { if ((Object)(object)filterManager != (Object)null && filterManager.IsInitialized) { filterManager.UpdateFilter(); } FilterConfig.FlushPendingSave(); } private void OnDestroy() { FilterConfig.FlushPendingSave(force: true); if ((Object)(object)filterManager != (Object)null) { Object.Destroy((Object)(object)filterManager); } if ((Object)(object)filterUI != (Object)null) { Object.Destroy((Object)(object)filterUI); } } } }