diff --git a/Glamourer/Gui/Tabs/DesignTab/ModAssociationsTab.cs b/Glamourer/Gui/Tabs/DesignTab/ModAssociationsTab.cs
index dd0d82e..ae2a76c 100644
--- a/Glamourer/Gui/Tabs/DesignTab/ModAssociationsTab.cs
+++ b/Glamourer/Gui/Tabs/DesignTab/ModAssociationsTab.cs
@@ -124,7 +124,7 @@ public class ModAssociationsTab
ImGui.Separator();
var namesDifferent = mod.Name != mod.DirectoryName;
ImGui.Dummy(new Vector2(300 * ImGuiHelpers.GlobalScale, 0));
- using (var group = ImRaii.Group())
+ using (ImRaii.Group())
{
if (namesDifferent)
ImGui.TextUnformatted("Directory Name");
@@ -134,7 +134,7 @@ public class ModAssociationsTab
}
ImGui.SameLine(Math.Max(ImGui.GetItemRectSize().X + 3 * ImGui.GetStyle().ItemSpacing.X, 150 * ImGuiHelpers.GlobalScale));
- using (var group = ImRaii.Group())
+ using (ImRaii.Group())
{
if (namesDifferent)
ImGui.TextUnformatted(mod.DirectoryName);
@@ -211,6 +211,6 @@ public class ModAssociationsTab
_manager.AddMod(_selector.Selected!, _modCombo.CurrentSelection.Mod, _modCombo.CurrentSelection.Settings);
ImGui.TableNextColumn();
_modCombo.Draw("##new", currentName.IsNullOrEmpty() ? "Select new Mod..." : currentName, string.Empty,
- 200 * ImGuiHelpers.GlobalScale, ImGui.GetTextLineHeight());
+ ImGui.GetContentRegionAvail().X, ImGui.GetTextLineHeight());
}
}
diff --git a/Glamourer/Interop/Material/MaterialValueManager.cs b/Glamourer/Interop/Material/MaterialValueManager.cs
index 35b61fc..6714e96 100644
--- a/Glamourer/Interop/Material/MaterialValueManager.cs
+++ b/Glamourer/Interop/Material/MaterialValueManager.cs
@@ -10,7 +10,7 @@ using Penumbra.GameData.Structs;
namespace Glamourer.Interop.Material;
-[JsonConverter(typeof(Converter))]
+/// Values are not squared.
public struct ColorRow(Vector3 diffuse, Vector3 specular, Vector3 emissive, float specularStrength, float glossStrength)
{
public static readonly ColorRow Empty = new(Vector3.Zero, Vector3.Zero, Vector3.Zero, 0, 0);
@@ -22,7 +22,7 @@ public struct ColorRow(Vector3 diffuse, Vector3 specular, Vector3 emissive, floa
public float GlossStrength = glossStrength;
public ColorRow(in MtrlFile.ColorTable.Row row)
- : this(row.Diffuse, row.Specular, row.Emissive, row.SpecularStrength, row.GlossStrength)
+ : this(Root(row.Diffuse), Root(row.Specular), Root(row.Emissive), row.SpecularStrength, row.GlossStrength)
{ }
public readonly bool NearEqual(in ColorRow rhs)
@@ -32,24 +32,39 @@ public struct ColorRow(Vector3 diffuse, Vector3 specular, Vector3 emissive, floa
&& SpecularStrength.NearEqual(rhs.SpecularStrength)
&& GlossStrength.NearEqual(rhs.GlossStrength);
+ private static Vector3 Square(Vector3 value)
+ => new(Square(value.X), Square(value.Y), Square(value.Z));
+
+ private static float Square(float value)
+ => value < 0 ? -value * value : value * value;
+
+ private static Vector3 Root(Vector3 value)
+ => new(Root(value.X), Root(value.Y), Root(value.Z));
+
+ private static float Root(float value)
+ => value < 0 ? MathF.Sqrt(-value) : MathF.Sqrt(value);
+
public readonly bool Apply(ref MtrlFile.ColorTable.Row row)
{
var ret = false;
- if (!row.Diffuse.NearEqual(Diffuse))
+ var d = Square(Diffuse);
+ if (!row.Diffuse.NearEqual(d))
{
- row.Diffuse = Diffuse;
+ row.Diffuse = d;
ret = true;
}
- if (!row.Specular.NearEqual(Specular))
+ var s = Square(Specular);
+ if (!row.Specular.NearEqual(s))
{
- row.Specular = Specular;
+ row.Specular = s;
ret = true;
}
- if (!row.Emissive.NearEqual(Emissive))
+ var e = Square(Emissive);
+ if (!row.Emissive.NearEqual(e))
{
- row.Emissive = Emissive;
+ row.Emissive = e;
ret = true;
}
@@ -67,62 +82,6 @@ public struct ColorRow(Vector3 diffuse, Vector3 specular, Vector3 emissive, floa
return ret;
}
-
- private class Converter : JsonConverter
- {
- public override void WriteJson(JsonWriter writer, ColorRow value, JsonSerializer serializer)
- {
- writer.WriteStartObject();
- writer.WritePropertyName("DiffuseR");
- writer.WriteValue(value.Diffuse.X);
- writer.WritePropertyName("DiffuseG");
- writer.WriteValue(value.Diffuse.Y);
- writer.WritePropertyName("DiffuseB");
- writer.WriteValue(value.Diffuse.Z);
- writer.WritePropertyName("SpecularR");
- writer.WriteValue(value.Specular.X);
- writer.WritePropertyName("SpecularG");
- writer.WriteValue(value.Specular.Y);
- writer.WritePropertyName("SpecularB");
- writer.WriteValue(value.Specular.Z);
- writer.WritePropertyName("SpecularA");
- writer.WriteValue(value.SpecularStrength);
- writer.WritePropertyName("EmissiveR");
- writer.WriteValue(value.Emissive.X);
- writer.WritePropertyName("EmissiveG");
- writer.WriteValue(value.Emissive.Y);
- writer.WritePropertyName("EmissiveB");
- writer.WriteValue(value.Emissive.Z);
- writer.WritePropertyName("Gloss");
- writer.WriteValue(value.GlossStrength);
- writer.WriteEndObject();
- }
-
- public override ColorRow ReadJson(JsonReader reader, Type objectType, ColorRow existingValue, bool hasExistingValue,
- JsonSerializer serializer)
- {
- var obj = JObject.Load(reader);
- Set(ref existingValue.Diffuse.X, obj["DiffuseR"]?.Value());
- Set(ref existingValue.Diffuse.Y, obj["DiffuseG"]?.Value());
- Set(ref existingValue.Diffuse.Z, obj["DiffuseB"]?.Value());
- Set(ref existingValue.Specular.X, obj["SpecularR"]?.Value());
- Set(ref existingValue.Specular.Y, obj["SpecularG"]?.Value());
- Set(ref existingValue.Specular.Z, obj["SpecularB"]?.Value());
- Set(ref existingValue.SpecularStrength, obj["SpecularA"]?.Value());
- Set(ref existingValue.Emissive.X, obj["EmissiveR"]?.Value());
- Set(ref existingValue.Emissive.Y, obj["EmissiveG"]?.Value());
- Set(ref existingValue.Emissive.Z, obj["EmissiveB"]?.Value());
- Set(ref existingValue.GlossStrength, obj["Gloss"]?.Value());
- return existingValue;
-
- static void Set(ref T target, T? value)
- where T : struct
- {
- if (value.HasValue)
- target = value.Value;
- }
- }
- }
}
[JsonConverter(typeof(Converter))]
@@ -137,7 +96,7 @@ public struct MaterialValueDesign(ColorRow value, bool enabled, bool revert)
if (!Enabled)
return false;
- if (revert)
+ if (Revert)
{
if (state.Model.NearEqual(state.Game))
return false;