Fix ColorTable preview with legacy color tables.

This commit is contained in:
Ottermandias 2024-05-28 00:11:54 +02:00
parent f11cefcec1
commit b30de460e7
5 changed files with 23 additions and 19 deletions

@ -1 +1 @@
Subproject commit b8282970ee78a2c085e740f60450fecf7ea58b9c Subproject commit b83ce830919ca56e8b066d48d588c889df3af39b

View file

@ -49,7 +49,7 @@ public class MaterialExporter
private static MaterialBuilder BuildCharacter(Material material, string name) private static MaterialBuilder BuildCharacter(Material material, string name)
{ {
// Build the textures from the color table. // Build the textures from the color table.
var table = material.Mtrl.Table; var table = new LegacyColorTable(material.Mtrl.Table);
var normal = material.Textures[TextureUsage.SamplerNormal]; var normal = material.Textures[TextureUsage.SamplerNormal];
@ -103,7 +103,7 @@ public class MaterialExporter
// TODO: It feels a little silly to request the entire normal here when extracting the normal only needs some of the components. // TODO: It feels a little silly to request the entire normal here when extracting the normal only needs some of the components.
// As a future refactor, it would be neat to accept a single-channel field here, and then do composition of other stuff later. // As a future refactor, it would be neat to accept a single-channel field here, and then do composition of other stuff later.
private readonly struct ProcessCharacterNormalOperation(Image<Rgba32> normal, ColorTable table) : IRowOperation private readonly struct ProcessCharacterNormalOperation(Image<Rgba32> normal, LegacyColorTable table) : IRowOperation
{ {
public Image<Rgba32> Normal { get; } = normal.Clone(); public Image<Rgba32> Normal { get; } = normal.Clone();
public Image<Rgba32> BaseColor { get; } = new(normal.Width, normal.Height); public Image<Rgba32> BaseColor { get; } = new(normal.Width, normal.Height);

View file

@ -8,7 +8,7 @@ namespace Penumbra.Interop.MaterialPreview;
public sealed unsafe class LiveColorTablePreviewer : LiveMaterialPreviewerBase public sealed unsafe class LiveColorTablePreviewer : LiveMaterialPreviewerBase
{ {
public const int TextureWidth = 4; public const int TextureWidth = 4;
public const int TextureHeight = GameData.Files.MaterialStructs.ColorTable.NumUsedRows; public const int TextureHeight = GameData.Files.MaterialStructs.LegacyColorTable.NumUsedRows;
public const int TextureLength = TextureWidth * TextureHeight * 4; public const int TextureLength = TextureWidth * TextureHeight * 4;
private readonly IFramework _framework; private readonly IFramework _framework;

View file

@ -116,7 +116,7 @@ public partial class ModEditWindow
{ {
var ret = false; var ret = false;
if (tab.Mtrl.HasDyeTable) if (tab.Mtrl.HasDyeTable)
for (var i = 0; i < ColorTable.NumUsedRows; ++i) for (var i = 0; i < LegacyColorTable.NumUsedRows; ++i)
ret |= tab.Mtrl.ApplyDyeTemplate(_stainService.StmFile, i, dyeId, 0); ret |= tab.Mtrl.ApplyDyeTemplate(_stainService.StmFile, i, dyeId, 0);
tab.UpdateColorTablePreview(); tab.UpdateColorTablePreview();
@ -170,6 +170,7 @@ public partial class ModEditWindow
} }
} }
[SkipLocalsInit]
private static unsafe void ColorTableCopyClipboardButton(ColorTable.Row row, ColorDyeTable.Row dye) private static unsafe void ColorTableCopyClipboardButton(ColorTable.Row row, ColorDyeTable.Row dye)
{ {
if (!ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.Clipboard.ToIconString(), ImGui.GetFrameHeight() * Vector2.One, if (!ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.Clipboard.ToIconString(), ImGui.GetFrameHeight() * Vector2.One,
@ -178,11 +179,11 @@ public partial class ModEditWindow
try try
{ {
var data = new byte[ColorTable.Row.Size + 2]; Span<byte> data = stackalloc byte[ColorTable.Row.Size + ColorDyeTable.Row.Size];
fixed (byte* ptr = data) fixed (byte* ptr = data)
{ {
MemoryUtility.MemCpyUnchecked(ptr, &row, ColorTable.Row.Size); MemoryUtility.MemCpyUnchecked(ptr, &row, ColorTable.Row.Size);
MemoryUtility.MemCpyUnchecked(ptr + ColorTable.Row.Size, &dye, 2); MemoryUtility.MemCpyUnchecked(ptr + ColorTable.Row.Size, &dye, ColorDyeTable.Row.Size);
} }
var text = Convert.ToBase64String(data); var text = Convert.ToBase64String(data);
@ -218,7 +219,7 @@ public partial class ModEditWindow
{ {
var text = ImGui.GetClipboardText(); var text = ImGui.GetClipboardText();
var data = Convert.FromBase64String(text); var data = Convert.FromBase64String(text);
if (data.Length != ColorTable.Row.Size + 2 if (data.Length != ColorTable.Row.Size + ColorDyeTable.Row.Size
|| !tab.Mtrl.HasTable) || !tab.Mtrl.HasTable)
return false; return false;
@ -349,7 +350,7 @@ public partial class ModEditWindow
ImGui.TableNextColumn(); ImGui.TableNextColumn();
tmpFloat = row.GlossStrength; tmpFloat = row.GlossStrength;
ImGui.SetNextItemWidth(floatSize); ImGui.SetNextItemWidth(floatSize);
float glossStrengthMin = ImGui.GetIO().KeyCtrl ? 0.0f : HalfEpsilon; var glossStrengthMin = ImGui.GetIO().KeyCtrl ? 0.0f : HalfEpsilon;
if (ImGui.DragFloat("##GlossStrength", ref tmpFloat, Math.Max(0.1f, tmpFloat * 0.025f), glossStrengthMin, HalfMaxValue, "%.1f") if (ImGui.DragFloat("##GlossStrength", ref tmpFloat, Math.Max(0.1f, tmpFloat * 0.025f), glossStrengthMin, HalfMaxValue, "%.1f")
&& FixFloat(ref tmpFloat, row.GlossStrength)) && FixFloat(ref tmpFloat, row.GlossStrength))
{ {

View file

@ -455,7 +455,8 @@ public partial class ModEditWindow
{ {
UnbindFromMaterialInstances(); UnbindFromMaterialInstances();
var instances = MaterialInfo.FindMaterials(_edit._resourceTreeFactory.GetLocalPlayerRelatedCharacters().Select(ch => ch.Address), FilePath); var instances = MaterialInfo.FindMaterials(_edit._resourceTreeFactory.GetLocalPlayerRelatedCharacters().Select(ch => ch.Address),
FilePath);
var foundMaterials = new HashSet<nint>(); var foundMaterials = new HashSet<nint>();
foreach (var materialInfo in instances) foreach (var materialInfo in instances)
@ -596,13 +597,13 @@ public partial class ModEditWindow
if (!Mtrl.HasTable) if (!Mtrl.HasTable)
return; return;
var row = Mtrl.Table[rowIdx]; var row = new LegacyColorTable.Row(Mtrl.Table[rowIdx]);
if (Mtrl.HasDyeTable) if (Mtrl.HasDyeTable)
{ {
var stm = _edit._stainService.StmFile; var stm = _edit._stainService.StmFile;
var dye = Mtrl.DyeTable[rowIdx]; var dye = new LegacyColorDyeTable.Row(Mtrl.DyeTable[rowIdx]);
if (stm.TryGetValue(dye.Template, _edit._stainService.StainCombo.CurrentSelection.Key, out var dyes)) if (stm.TryGetValue(dye.Template, _edit._stainService.StainCombo.CurrentSelection.Key, out var dyes))
row.ApplyDyeTemplate(dye, dyes, default); row.ApplyDyeTemplate(dye, dyes);
} }
if (HighlightedColorTableRow == rowIdx) if (HighlightedColorTableRow == rowIdx)
@ -624,17 +625,18 @@ public partial class ModEditWindow
if (!Mtrl.HasTable) if (!Mtrl.HasTable)
return; return;
var rows = Mtrl.Table; var rows = new LegacyColorTable(Mtrl.Table);
var dyeRows = new LegacyColorDyeTable(Mtrl.DyeTable);
if (Mtrl.HasDyeTable) if (Mtrl.HasDyeTable)
{ {
var stm = _edit._stainService.StmFile; var stm = _edit._stainService.StmFile;
var stainId = (StainId)_edit._stainService.StainCombo.CurrentSelection.Key; var stainId = (StainId)_edit._stainService.StainCombo.CurrentSelection.Key;
for (var i = 0; i < ColorTable.NumUsedRows; ++i) for (var i = 0; i < LegacyColorTable.NumUsedRows; ++i)
{ {
ref var row = ref rows[i]; ref var row = ref rows[i];
var dye = Mtrl.DyeTable[i]; var dye = dyeRows[i];
if (stm.TryGetValue(dye.Template, stainId, out var dyes)) if (stm.TryGetValue(dye.Template, stainId, out var dyes))
row.ApplyDyeTemplate(dye, dyes, default); row.ApplyDyeTemplate(dye, dyes);
} }
} }
@ -643,12 +645,13 @@ public partial class ModEditWindow
foreach (var previewer in ColorTablePreviewers) foreach (var previewer in ColorTablePreviewers)
{ {
// TODO: Dawntrail
rows.AsHalves().CopyTo(previewer.ColorTable); rows.AsHalves().CopyTo(previewer.ColorTable);
previewer.ScheduleUpdate(); previewer.ScheduleUpdate();
} }
} }
private static void ApplyHighlight(ref ColorTable.Row row, float time) private static void ApplyHighlight(ref LegacyColorTable.Row row, float time)
{ {
var level = (MathF.Sin(time * 2.0f * MathF.PI) + 2.0f) / 3.0f / 255.0f; var level = (MathF.Sin(time * 2.0f * MathF.PI) + 2.0f) / 3.0f / 255.0f;
var baseColor = ColorId.InGameHighlight.Value(); var baseColor = ColorId.InGameHighlight.Value();