Add experimental CT conversion, tighten CT field bounds

This commit is contained in:
Exter-N 2024-08-25 07:40:37 +02:00
parent 8558d59217
commit 1f8d4c39a1
4 changed files with 52 additions and 11 deletions

@ -1 +1 @@
Subproject commit 2946073ad67f2d9ddac4ef6135660f7607542300 Subproject commit 6c02858d5a3d20100377dd127d1b85dbe82a4c44

View file

@ -456,8 +456,8 @@ public partial class MtrlTab
var dye = dyeTable?[rowIdx] ?? default; var dye = dyeTable?[rowIdx] ?? default;
ImGui.SetNextItemWidth(scalarSize); ImGui.SetNextItemWidth(scalarSize);
ret |= CtDragScalar("Roughness"u8, default, (float)row.Roughness * 100.0f, "%.0f%%"u8, HalfMinValue * 100.0f, HalfMaxValue * 100.0f, ret |= CtDragScalar("Roughness"u8, default, (float)row.Roughness * 100.0f, "%.0f%%"u8, 0.0f, 100.0f,
1.0f, 0.25f,
v => table[rowIdx].Roughness = (Half)(v * 0.01f)); v => table[rowIdx].Roughness = (Half)(v * 0.01f));
if (dyeTable != null) if (dyeTable != null)
{ {
@ -471,8 +471,8 @@ public partial class MtrlTab
ImGui.SameLine(subColWidth); ImGui.SameLine(subColWidth);
ImGui.SetNextItemWidth(scalarSize); ImGui.SetNextItemWidth(scalarSize);
ret |= CtDragScalar("Metalness"u8, default, (float)row.Metalness * 100.0f, "%.0f%%"u8, HalfMinValue * 100.0f, HalfMaxValue * 100.0f, ret |= CtDragScalar("Metalness"u8, default, (float)row.Metalness * 100.0f, "%.0f%%"u8, 0.0f, 100.0f,
1.0f, 0.25f,
v => table[rowIdx].Metalness = (Half)(v * 0.01f)); v => table[rowIdx].Metalness = (Half)(v * 0.01f));
if (dyeTable != null) if (dyeTable != null)
{ {

View file

@ -9,6 +9,8 @@ namespace Penumbra.UI.AdvancedWindow.Materials;
public partial class MtrlTab public partial class MtrlTab
{ {
private static readonly float EffectiveMaxShininess = (float)LegacyColorTableRow.EffectiveMaxShininess;
private bool DrawLegacyColorTable<TRow, TDyeRow>(IColorTable<TRow> table, IColorDyeTable<TDyeRow>? dyeTable, bool disabled, MtrlTabUiState uiState) private bool DrawLegacyColorTable<TRow, TDyeRow>(IColorTable<TRow> table, IColorDyeTable<TDyeRow>? dyeTable, bool disabled, MtrlTabUiState uiState)
where TRow : unmanaged, ILegacyColorRow where TDyeRow : unmanaged, ILegacyColorDyeRow where TRow : unmanaged, ILegacyColorRow where TDyeRow : unmanaged, ILegacyColorDyeRow
{ {
@ -147,7 +149,7 @@ public partial class MtrlTab
ImGui.SameLine(subColWidth); ImGui.SameLine(subColWidth);
ImGui.SetNextItemWidth(scalarSize); ImGui.SetNextItemWidth(scalarSize);
var shininessMin = ImGui.GetIO().KeyCtrl ? 0.0f : HalfEpsilon; var shininessMin = ImGui.GetIO().KeyCtrl ? 0.0f : HalfEpsilon;
ret |= CtDragHalf("Gloss"u8, default, row.Shininess, "%.1f"u8, shininessMin, HalfMaxValue, ret |= CtDragHalf("Gloss"u8, default, row.Shininess, "%.1f"u8, shininessMin, EffectiveMaxShininess,
Math.Max(0.1f, (float)row.Shininess * 0.025f), Math.Max(0.1f, (float)row.Shininess * 0.025f),
v => table[rowIdx].Shininess = v); v => table[rowIdx].Shininess = v);
if (dyeTable != null) if (dyeTable != null)

View file

@ -1,5 +1,6 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.ImGuiNotification; using Dalamud.Interface.ImGuiNotification;
using FFXIVClientStructs.FFXIV.Common.Lua;
using ImGuiNET; using ImGuiNET;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using OtterGui; using OtterGui;
@ -9,6 +10,7 @@ using OtterGui.Text;
using Penumbra.GameData; using Penumbra.GameData;
using Penumbra.GameData.Data; using Penumbra.GameData.Data;
using Penumbra.GameData.Files; using Penumbra.GameData.Files;
using Penumbra.GameData.Files.MaterialStructs;
using Penumbra.GameData.Files.ShaderStructs; using Penumbra.GameData.Files.ShaderStructs;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using static Penumbra.GameData.Files.ShpkFile; using static Penumbra.GameData.Files.ShpkFile;
@ -327,6 +329,7 @@ public partial class MtrlTab
DrawCustomAssociations(); DrawCustomAssociations();
ret |= DrawMaterialShaderKeys(disabled); ret |= DrawMaterialShaderKeys(disabled);
DrawMaterialShaders(); DrawMaterialShaders();
ret |= DrawShaderQuickActions(disabled);
} }
if (!_shpkLoading && (_associatedShpk == null || _associatedShpkDevkit == null)) if (!_shpkLoading && (_associatedShpk == null || _associatedShpkDevkit == null))
@ -362,16 +365,21 @@ public partial class MtrlTab
if (!ImGui.Selectable(value, value == Mtrl.ShaderPackage.Name)) if (!ImGui.Selectable(value, value == Mtrl.ShaderPackage.Name))
continue; continue;
Mtrl.ShaderPackage.Name = value; ret = true;
ret = true; SwitchToShaderPackage(value);
_associatedShpk = null;
_loadedShpkPath = FullPath.Empty;
LoadShpk(FindAssociatedShpk(out _, out _));
} }
return ret; return ret;
} }
private void SwitchToShaderPackage(string shPkName)
{
Mtrl.ShaderPackage.Name = shPkName;
_associatedShpk = null;
_loadedShpkPath = FullPath.Empty;
LoadShpk(FindAssociatedShpk(out _, out _));
}
private bool DrawShaderFlagsInput(bool disabled) private bool DrawShaderFlagsInput(bool disabled)
{ {
var shpkFlags = (int)Mtrl.ShaderPackage.Flags; var shpkFlags = (int)Mtrl.ShaderPackage.Flags;
@ -504,4 +512,35 @@ public partial class MtrlTab
ImUtf8.Text(_shaderComment); ImUtf8.Text(_shaderComment);
} }
} }
private bool DrawShaderQuickActions(bool disabled)
{
if (disabled)
return false;
var ret = false;
if (Mtrl.ShaderPackage.Name is "characterlegacy.shpk")
{
using var _ = ImRaii.Disabled(!ImGui.GetIO().KeyCtrl);
if (ImUtf8.Button("[Experimental] Convert to New character.shpk"u8))
ret |= ConvertToNewCharacterShader();
ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, "This operation will switch this material to character.shpk and convert its color table accordingly.\nThis conversion is experimental and will require further manual edits to this material, and may also require edits to the model and/or textures.\n\nHold Ctrl to unlock."u8);
}
return ret;
}
private bool ConvertToNewCharacterShader()
{
if (Mtrl.ShaderPackage.Name is not "characterlegacy.shpk")
return false;
SwitchToShaderPackage("character.shpk");
if (Mtrl.Table is ColorTable colorTable)
colorTable.ConvertFromCharacterLegacy();
if (Mtrl.DyeTable is ColorDyeTable colorDyeTable)
colorDyeTable.ConvertFromCharacterLegacy();
return true;
}
} }