diff --git a/Glamourer/Automation/AutoDesignApplier.cs b/Glamourer/Automation/AutoDesignApplier.cs index 22048a8..0e30244 100644 --- a/Glamourer/Automation/AutoDesignApplier.cs +++ b/Glamourer/Automation/AutoDesignApplier.cs @@ -154,7 +154,7 @@ public sealed class AutoDesignApplier : IDisposable { Reduce(data.Objects[0], state, newSet, _config.RespectManualOnAutomationUpdate, false, out var forcedRedraw); foreach (var actor in data.Objects) - _state.ReapplyState(actor, forcedRedraw,StateSource.Fixed); + _state.ReapplyState(actor, forcedRedraw, StateSource.Fixed); } } else if (_objects.TryGetValueAllWorld(id, out data) || _objects.TryGetValueNonOwned(id, out data)) @@ -286,7 +286,9 @@ public sealed class AutoDesignApplier : IDisposable var mergedDesign = _designMerger.Merge( set.Designs.Where(d => d.IsActive(actor)).SelectMany(d => d.Design.AllLinks.Select(l => (l.Design, l.Flags & d.Type, d.Jobs.Flags))), state.ModelData.Customize, state.BaseData, true, _config.AlwaysApplyAssociatedMods); - _state.ApplyDesign(state, mergedDesign, new ApplySettings(0, StateSource.Fixed, respectManual, fromJobChange, false, false, false)); + + var resetMaterials = mergedDesign.ResetMaterials; + _state.ApplyDesign(state, mergedDesign, new ApplySettings(0, StateSource.Fixed, respectManual, fromJobChange, false, false, resetMaterials)); forcedRedraw = mergedDesign.ForcedRedraw; } diff --git a/Glamourer/Designs/Design.cs b/Glamourer/Designs/Design.cs index fb18873..2add91c 100644 --- a/Glamourer/Designs/Design.cs +++ b/Glamourer/Designs/Design.cs @@ -45,6 +45,7 @@ public sealed class Design : DesignBase, ISavable, IDesignStandIn public string[] Tags { get; internal set; } = []; public int Index { get; internal set; } public bool ForcedRedraw { get; internal set; } + public bool ResetMaterials { get; internal set; } public bool QuickDesign { get; internal set; } = true; public string Color { get; internal set; } = string.Empty; public SortedList AssociatedMods { get; private set; } = []; @@ -102,6 +103,7 @@ public sealed class Design : DesignBase, ISavable, IDesignStandIn ["Name"] = Name.Text, ["Description"] = Description, ["ForcedRedraw"] = ForcedRedraw, + ["ResetMaterials"] = ResetMaterials, ["Color"] = Color, ["QuickDesign"] = QuickDesign, ["Tags"] = JArray.FromObject(Tags), @@ -244,6 +246,7 @@ public sealed class Design : DesignBase, ISavable, IDesignStandIn LoadLinks(linkLoader, json["Links"], design); design.Color = json["Color"]?.ToObject() ?? string.Empty; design.ForcedRedraw = json["ForcedRedraw"]?.ToObject() ?? false; + design.ResetMaterials = json["ResetMaterials"]?.ToObject() ?? false; return design; static string[] ParseTags(JObject json) diff --git a/Glamourer/Designs/DesignManager.cs b/Glamourer/Designs/DesignManager.cs index 63c98c0..8342898 100644 --- a/Glamourer/Designs/DesignManager.cs +++ b/Glamourer/Designs/DesignManager.cs @@ -334,6 +334,17 @@ public sealed class DesignManager : DesignEditor DesignChanged.Invoke(DesignChanged.Type.ForceRedraw, design, null); } + public void ChangeResetMaterials(Design design, bool resetMaterials) + { + if (design.ResetMaterials == resetMaterials) + return; + + design.ResetMaterials = resetMaterials; + SaveService.QueueSave(design); + Glamourer.Log.Debug($"Set {design.Identifier} to {(resetMaterials ? "not" : string.Empty)} reset materials."); + DesignChanged.Invoke(DesignChanged.Type.ResetMaterials, design, null); + } + /// Change whether to apply a specific customize value. public void ChangeApplyCustomize(Design design, CustomizeIndex idx, bool value) { diff --git a/Glamourer/Designs/IDesignStandIn.cs b/Glamourer/Designs/IDesignStandIn.cs index 492bc6b..73a4863 100644 --- a/Glamourer/Designs/IDesignStandIn.cs +++ b/Glamourer/Designs/IDesignStandIn.cs @@ -25,4 +25,6 @@ public interface IDesignStandIn : IEquatable public bool ChangeData(object data); public bool ForcedRedraw { get; } + + public bool ResetMaterials { get; } } diff --git a/Glamourer/Designs/Links/DesignMerger.cs b/Glamourer/Designs/Links/DesignMerger.cs index 9832ead..73e94c7 100644 --- a/Glamourer/Designs/Links/DesignMerger.cs +++ b/Glamourer/Designs/Links/DesignMerger.cs @@ -56,6 +56,8 @@ public class DesignMerger( ReduceMaterials(design, ret); if (design.ForcedRedraw) ret.ForcedRedraw = true; + if (design.ResetMaterials) + ret.ResetMaterials = true; } ApplyFixFlags(ret, fixFlags); diff --git a/Glamourer/Designs/Links/MergedDesign.cs b/Glamourer/Designs/Links/MergedDesign.cs index da6cb54..0fa148a 100644 --- a/Glamourer/Designs/Links/MergedDesign.cs +++ b/Glamourer/Designs/Links/MergedDesign.cs @@ -100,4 +100,5 @@ public sealed class MergedDesign public readonly SortedList AssociatedMods = []; public StateSources Sources = new(); public bool ForcedRedraw; + public bool ResetMaterials; } diff --git a/Glamourer/Designs/Special/QuickSelectedDesign.cs b/Glamourer/Designs/Special/QuickSelectedDesign.cs index c506f0a..476bd62 100644 --- a/Glamourer/Designs/Special/QuickSelectedDesign.cs +++ b/Glamourer/Designs/Special/QuickSelectedDesign.cs @@ -53,4 +53,7 @@ public class QuickSelectedDesign(QuickDesignCombo combo) : IDesignStandIn, IServ public bool ForcedRedraw => combo.Design?.ForcedRedraw ?? false; + + public bool ResetMaterials + => combo.Design?.ResetMaterials ?? false; } diff --git a/Glamourer/Designs/Special/RandomDesign.cs b/Glamourer/Designs/Special/RandomDesign.cs index 5fac61b..54ab4ab 100644 --- a/Glamourer/Designs/Special/RandomDesign.cs +++ b/Glamourer/Designs/Special/RandomDesign.cs @@ -81,4 +81,7 @@ public class RandomDesign(RandomDesignGenerator rng) : IDesignStandIn public bool ForcedRedraw => false; + + public bool ResetMaterials + => false; } diff --git a/Glamourer/Designs/Special/RevertDesign.cs b/Glamourer/Designs/Special/RevertDesign.cs index 023d5eb..affa203 100644 --- a/Glamourer/Designs/Special/RevertDesign.cs +++ b/Glamourer/Designs/Special/RevertDesign.cs @@ -45,4 +45,7 @@ public class RevertDesign : IDesignStandIn public bool ForcedRedraw => false; + + public bool ResetMaterials + => false; } diff --git a/Glamourer/Events/DesignChanged.cs b/Glamourer/Events/DesignChanged.cs index 6c2ba8a..22169c8 100644 --- a/Glamourer/Events/DesignChanged.cs +++ b/Glamourer/Events/DesignChanged.cs @@ -90,6 +90,9 @@ public sealed class DesignChanged() /// An existing design had changed whether it always forces a redraw or not. ForceRedraw, + /// An existing design had changed whether it always reset materials or not. + ResetMaterials, + /// An existing design changed whether a specific customization is applied. ApplyCustomize, diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignDetailTab.cs b/Glamourer/Gui/Tabs/DesignTab/DesignDetailTab.cs index e9fbcf4..fddf8a2 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignDetailTab.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignDetailTab.cs @@ -143,6 +143,13 @@ public class DesignDetailTab _manager.ChangeForcedRedraw(_selector.Selected!, forceRedraw); ImGuiUtil.HoverTooltip("Set this design to always force a redraw when it is applied through any means."); + var resetMaterials = _selector.Selected!.ResetMaterials; + ImGuiUtil.DrawFrameColumn("Reset Materials"); + ImGui.TableNextColumn(); + if (ImGui.Checkbox("##ResetMaterials", ref resetMaterials)) + _manager.ChangeResetMaterials(_selector.Selected!, resetMaterials); + ImGuiUtil.HoverTooltip("Set this design to reset materials when it is applied through any means."); + ImGuiUtil.DrawFrameColumn("Color"); var colorName = _selector.Selected!.Color.Length == 0 ? DesignColors.AutomaticName : _selector.Selected!.Color; ImGui.TableNextColumn();