From 06363637d2c291b405fa83ecdaa8780858bc255f Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Thu, 18 Jun 2026 21:16:33 -0400 Subject: Add Global presets Signed-off-by: Andrew Opalach --- Plugin.cs | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 172 insertions(+), 35 deletions(-) (limited to 'Plugin.cs') diff --git a/Plugin.cs b/Plugin.cs index 8fb361b..e76d724 100755 --- a/Plugin.cs +++ b/Plugin.cs @@ -2,6 +2,7 @@ //#define OVERSIZED_SHADOW_MAP //#define SHADER_FEATURES //#define RESOURCE_ADJUSTMENT +//#define DO_COMMON using System.Numerics; using System.Globalization; @@ -141,9 +142,70 @@ namespace WorldTuningTool return ConfigManager.GetConfig(Instance!); } - static void saveConfig() +#if DO_COMMON + private static bool overridesContainsCommon(IEnumerable overrides, Override ovR) { + foreach (Override ov in overrides) + { + if (ov.Equals(ovR)) + { + return true; + } + } + return false; + } + + private static Override? removeIfOverridesContainsParam(IList overrides, Parameter param) + { + for (int i = 0; i < overrides.Count; i++) + { + Override ov = overrides[i]; + if (ov.Param == param) + { + overrides.RemoveAt(i); + return ov; + } + } + return null; + } +#endif + + static void saveConfig(Config config) + { + config.Overrides.Remove(globalStage); +#if DO_COMMON + config.CommonGlobals.Clear(); + foreach (Override ov in config.Globals[selectedGlobal]) + { + bool common = true; + foreach ((string name, List overrides) in config.Globals) + { + if (!overridesContainsCommon(overrides, ov)) + { + common = false; + } + } + if (common) config.CommonGlobals.Add(ov); + } + Dictionary> allRemoved = new Dictionary>(); + foreach ((string name, List overrides) in config.Globals) + { + List removed = new List(); + foreach (Override ovC in config.CommonGlobals) + { + removed.Add(removeIfOverridesContainsParam(overrides, ovC.Param!)!); + } + allRemoved[name] = removed; + } +#endif ConfigManager.SaveConfig(Instance!); +#if DO_COMMON + foreach ((string name, List overrides) in config.Globals) + { + overrides.InsertRange(0, allRemoved[name]); + } +#endif + config.Overrides[globalStage] = config.Globals[selectedGlobal]; selectedOrderChanged = false; setOrderChanged = false; } @@ -167,6 +229,8 @@ namespace WorldTuningTool private static StageExt previousStage = selectedStage; private static bool selectedOrderChanged = false; + private static string selectedGlobal = ""; + private static string selectedSet = ""; private static bool setOrderChanged = false; private static bool renamingSet = false; @@ -1142,6 +1206,20 @@ namespace WorldTuningTool valueInt = i1; Save(); } +#if DO_COMMON + public Override(Override c) + { + Param = c.Param; + valueV = c.valueV; + valueInt = c.valueInt; + Save(); + } + + public bool Equals(Override r) + { + return r.Param == Param && (r.sValueV, r.sValueInt) == (sValueV, sValueInt); + } +#endif public void Save() { @@ -2260,6 +2338,25 @@ namespace WorldTuningTool { config.Overrides.Add(globalStage, new List()); } + if (config.SelectedGlobal == "") + { + config.SelectedGlobal = "Base"; + } + selectedGlobal = config.SelectedGlobal; + if (!config.Globals.ContainsKey(selectedGlobal)) + { + config.Globals[selectedGlobal] = new List(); + } +#if DO_COMMON + foreach ((string name, List overrides) in config.Globals) + { + foreach (Override ov in config.CommonGlobals) + { + overrides.Insert(0, new Override(ov)); + } + } +#endif + config.Overrides[globalStage] = config.Globals[selectedGlobal]; foreach (StageExt area in Config.OrderedStages) { if (!config.Overrides.ContainsKey(area)) @@ -2267,7 +2364,6 @@ namespace WorldTuningTool config.Overrides.Add(area, new List()); } } - BeginTransition(); List globalOverrides = config.Overrides[globalStage]; foreach (Override ovG in globalOverrides) { @@ -2281,17 +2377,7 @@ namespace WorldTuningTool break; } } - if (!config.Sets.ContainsKey(config.SelectedPreset)) - { - config.SelectedPreset = ""; - } - selectedSet = config.SelectedPreset; - if (selectedSet != "") - { - HandleSetChange("", globalOverrides, maybeGetStageOverrides(config)); - } - EndTransition(); - saveConfig(); + saveConfig(config); } // It's hard to test, but I'm pretty sure just updating stepTime isn't enough for a higher rate to look right. @@ -2821,6 +2907,32 @@ namespace WorldTuningTool } } + private List HandleGlobalChange() + { + Config config = getConfig(); + List? stageOverrides = maybeGetStageOverrides(config); + List globalOverrides = config.Overrides[globalStage]; + foreach (Override ovG in globalOverrides) + { + bool superseded = selectedOverrideSuperseded(config, null, stageOverrides, ovG.Param); + if (!superseded) + { + ovG.Unset(); + } + } + config.Overrides[globalStage] = config.Globals[selectedGlobal]; + globalOverrides = config.Overrides[globalStage]; + foreach (Override ovG in globalOverrides) + { + bool superseded = selectedOverrideSuperseded(config, null, stageOverrides, ovG.Param); + if (!superseded) + { + ovG.Set(); + } + } + return globalOverrides; + } + private void HandleAreaChange(StageExt stage) { Config config = getConfig(); @@ -2899,6 +3011,11 @@ namespace WorldTuningTool ImGui.EndCombo(); } ImGui.SameLine(); + if (ImGui.Button("Global")) + { + selectedStage = globalStage; + } + ImGui.SameLine(); Config config = getConfig(); bool invalidStage = !config.Overrides.ContainsKey(currentStage); if (invalidStage) @@ -2915,27 +3032,51 @@ namespace WorldTuningTool ImGui.PopStyleVar(); ImGui.PopItemFlag(); } - ImGui.SameLine(); - if (ImGui.Button("Global")) + + List selectedOverrides = config.Overrides[selectedStage]; + if (ImGui.Button("Add override")) { - selectedStage = globalStage; + Override ov = new Override(); + if (selectedStage == currentStage || selectedStage == globalStage) + { + ov.Set(); // Empty override never superseded. + } + selectedOverrides.Add(ov); + selectedOrderChanged = true; } - List selectedOverrides = config.Overrides[selectedStage]; List? stageOverrides = maybeGetStageOverrides(config); List? globalOverrides = null; if (selectedStage != globalStage) { globalOverrides = config.Overrides[globalStage]; } - if (ImGui.Button("Add override")) + else { - Override ov = new Override(); - if (selectedStage == currentStage || selectedStage == globalStage) + ImGui.SameLine(); + string prevGlobal = selectedGlobal; + ImGui.Text("Preset:"); + ImGui.SameLine(); + ImGui.SetCursorPos(ImGui.GetCursorPos() - new Vector2(5.0f, 0.0f)); + if (ImGui.BeginCombo("##Preset", selectedGlobal)) { - ov.Set(); // Empty override never superseded. + foreach ((string name, List overrides) in config.Globals) + { + bool isSelected = name == selectedGlobal; + if (ImGui.Selectable(name, isSelected)) + { + selectedGlobal = name; + } + } + ImGui.EndCombo(); + } + if (prevGlobal != selectedGlobal) + { + BeginTransition(); + selectedOverrides = HandleGlobalChange(); + EndTransition(); + config.SelectedGlobal = selectedGlobal; + saveConfig(config); } - selectedOverrides.Add(ov); - selectedOrderChanged = true; } ImGui.PopItemWidth(); for (int i = 0; i < selectedOverrides.Count; i++) @@ -2991,7 +3132,7 @@ namespace WorldTuningTool } ovS.Save(); } - saveConfig(); + saveConfig(config); } if (selectedOrderChanged) { @@ -3028,7 +3169,7 @@ namespace WorldTuningTool ImGui.PushItemFlag(ImGuiItemFlags.Disabled, true); ImGui.PushStyleVar(ImGuiStyleVar.Alpha, ImGui.GetStyle().Alpha * 0.5f); } - if (ImGui.BeginCombo("##Sets", selectedSet)) + if (ImGui.BeginCombo("##Set", selectedSet)) { if (ImGui.Selectable("(None)", false)) { @@ -3049,8 +3190,6 @@ namespace WorldTuningTool BeginTransition(); HandleSetChange(prevSet, globalOverrides, stageOverrides); EndTransition(); - config.SelectedPreset = selectedSet; - saveConfig(); } if (renamingSet) { @@ -3086,8 +3225,6 @@ namespace WorldTuningTool config.Sets.Remove(selectedSet); config.Sets[setName] = tmpOverrides; selectedSet = setName; - config.SelectedPreset = selectedSet; - saveConfig(); } renamingSet = false; } @@ -3167,7 +3304,7 @@ namespace WorldTuningTool } ovP.Save(); } - saveConfig(); + saveConfig(config); } if (setOrderChanged) { @@ -3207,7 +3344,7 @@ namespace WorldTuningTool } patches.FullResolutionVolumeBlur = fullResVolumeBlur; config.Patches = patches; - saveConfig(); + saveConfig(config); } if (ImGui.BeginItemTooltip()) { @@ -3227,7 +3364,7 @@ namespace WorldTuningTool } patches.HigherThanHighestVolumeRendering = higherVolumeQuality; config.Patches = patches; - saveConfig(); + saveConfig(config); } if (ImGui.BeginItemTooltip()) { @@ -3247,7 +3384,7 @@ namespace WorldTuningTool } patches.DisableLODLimits = disableLODLimits; config.Patches = patches; - saveConfig(); + saveConfig(config); } if (ImGui.BeginItemTooltip()) { @@ -3267,7 +3404,7 @@ namespace WorldTuningTool } patches.LargerFoliageSwayRange = largerFoliageSwayRange; config.Patches = patches; - saveConfig(); + saveConfig(config); } if (ImGui.BeginItemTooltip()) { @@ -3287,7 +3424,7 @@ namespace WorldTuningTool } patches.DisableReducedRateAnimations = disableReducedRateAnimations; config.Patches = patches; - saveConfig(); + saveConfig(config); } if (ImGui.BeginItemTooltip()) { -- cgit v1.2.3-101-g0448