mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-13 12:14:17 +01:00
Fix texture writing.
This commit is contained in:
parent
1be75444cd
commit
380dd0cffb
4 changed files with 125 additions and 5 deletions
|
|
@ -79,8 +79,8 @@ public static class TexFileParser
|
|||
w.Write(header.Width);
|
||||
w.Write(header.Height);
|
||||
w.Write(header.Depth);
|
||||
w.Write(header.MipCount);
|
||||
w.Write(header.MipUnknownFlag); // TODO Lumina Update
|
||||
w.Write((byte)(header.MipCount | (header.MipUnknownFlag ? 0x80 : 0)));
|
||||
w.Write(header.ArraySize);
|
||||
unsafe
|
||||
{
|
||||
w.Write(header.LodOffset[0]);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ using Microsoft.Extensions.DependencyInjection;
|
|||
using OtterGui;
|
||||
using OtterGui.Classes;
|
||||
using OtterGui.Services;
|
||||
using OtterGui.Text;
|
||||
using OtterGui.Widgets;
|
||||
using Penumbra.Api;
|
||||
using Penumbra.Collections.Manager;
|
||||
|
|
@ -96,6 +95,7 @@ public class DebugTab : Window, ITab, IUiService
|
|||
private readonly IClientState _clientState;
|
||||
private readonly IpcTester _ipcTester;
|
||||
private readonly CrashHandlerPanel _crashHandlerPanel;
|
||||
private readonly TexHeaderDrawer _texHeaderDrawer;
|
||||
|
||||
public DebugTab(PerformanceTracker performance, Configuration config, CollectionManager collectionManager, ObjectManager objects,
|
||||
IClientState clientState,
|
||||
|
|
@ -105,7 +105,7 @@ public class DebugTab : Window, ITab, IUiService
|
|||
DrawObjectState drawObjectState, PathState pathState, SubfileHelper subfileHelper, IdentifiedCollectionCache identifiedCollectionCache,
|
||||
CutsceneService cutsceneService, ModImportManager modImporter, ImportPopup importPopup, FrameworkManager framework,
|
||||
TextureManager textureManager, ShaderReplacementFixer shaderReplacementFixer, RedrawService redraws, DictEmote emotes,
|
||||
Diagnostics diagnostics, IpcTester ipcTester, CrashHandlerPanel crashHandlerPanel)
|
||||
Diagnostics diagnostics, IpcTester ipcTester, CrashHandlerPanel crashHandlerPanel, TexHeaderDrawer texHeaderDrawer)
|
||||
: base("Penumbra Debug Window", ImGuiWindowFlags.NoCollapse)
|
||||
{
|
||||
IsOpen = true;
|
||||
|
|
@ -141,6 +141,7 @@ public class DebugTab : Window, ITab, IUiService
|
|||
_diagnostics = diagnostics;
|
||||
_ipcTester = ipcTester;
|
||||
_crashHandlerPanel = crashHandlerPanel;
|
||||
_texHeaderDrawer = texHeaderDrawer;
|
||||
_objects = objects;
|
||||
_clientState = clientState;
|
||||
}
|
||||
|
|
@ -176,6 +177,8 @@ public class DebugTab : Window, ITab, IUiService
|
|||
ImGui.NewLine();
|
||||
DrawCollectionCaches();
|
||||
ImGui.NewLine();
|
||||
_texHeaderDrawer.Draw();
|
||||
ImGui.NewLine();
|
||||
DrawDebugCharacterUtility();
|
||||
ImGui.NewLine();
|
||||
DrawShaderReplacementFixer();
|
||||
|
|
|
|||
117
Penumbra/UI/Tabs/Debug/TexHeaderDrawer.cs
Normal file
117
Penumbra/UI/Tabs/Debug/TexHeaderDrawer.cs
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
using Dalamud.Interface.DragDrop;
|
||||
using Dalamud.Interface.Utility.Raii;
|
||||
using ImGuiNET;
|
||||
using Lumina.Data.Files;
|
||||
using OtterGui.Services;
|
||||
using OtterGui.Text;
|
||||
using Penumbra.UI.Classes;
|
||||
|
||||
namespace Penumbra.UI.Tabs.Debug;
|
||||
|
||||
public class TexHeaderDrawer(IDragDropManager dragDrop) : IUiService
|
||||
{
|
||||
private string? _path;
|
||||
private TexFile.TexHeader _header;
|
||||
private byte[]? _tex;
|
||||
private Exception? _exception;
|
||||
|
||||
public void Draw()
|
||||
{
|
||||
using var header = ImUtf8.CollapsingHeaderId("Tex Header"u8);
|
||||
if (!header)
|
||||
return;
|
||||
|
||||
DrawDragDrop();
|
||||
DrawData();
|
||||
}
|
||||
|
||||
private void DrawDragDrop()
|
||||
{
|
||||
dragDrop.CreateImGuiSource("TexFileDragDrop", m => m.Files.Count == 1 && m.Extensions.Contains(".tex"), m =>
|
||||
{
|
||||
ImUtf8.Text($"Dragging {m.Files[0]}...");
|
||||
return true;
|
||||
});
|
||||
|
||||
ImUtf8.Button("Drag .tex here...");
|
||||
if (dragDrop.CreateImGuiTarget("TexFileDragDrop", out var files, out _))
|
||||
ReadTex(files[0]);
|
||||
}
|
||||
|
||||
private void DrawData()
|
||||
{
|
||||
if (_path == null)
|
||||
return;
|
||||
|
||||
ImUtf8.TextFramed(_path, 0, borderColor: 0xFFFFFFFF);
|
||||
|
||||
|
||||
if (_exception != null)
|
||||
{
|
||||
using var color = ImRaii.PushColor(ImGuiCol.Text, Colors.RegexWarningBorder);
|
||||
ImUtf8.TextWrapped($"Failure to load file:\n{_exception}");
|
||||
}
|
||||
else if (_tex != null)
|
||||
{
|
||||
using var table = ImRaii.Table("table", 2, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.RowBg);
|
||||
if (!table)
|
||||
return;
|
||||
|
||||
TableLine("Format"u8, _header.Format);
|
||||
TableLine("Width"u8, _header.Width);
|
||||
TableLine("Height"u8, _header.Height);
|
||||
TableLine("Depth"u8, _header.Depth);
|
||||
TableLine("Mip Levels"u8, _header.MipCount);
|
||||
TableLine("Array Size"u8, _header.ArraySize);
|
||||
TableLine("Type"u8, _header.Type);
|
||||
TableLine("Mip Flag"u8, _header.MipUnknownFlag);
|
||||
TableLine("Byte Size"u8, _tex.Length);
|
||||
unsafe
|
||||
{
|
||||
TableLine("LoD Offset 0"u8, _header.LodOffset[0]);
|
||||
TableLine("LoD Offset 1"u8, _header.LodOffset[1]);
|
||||
TableLine("LoD Offset 2"u8, _header.LodOffset[2]);
|
||||
TableLine("LoD Offset 0"u8, _header.OffsetToSurface[0]);
|
||||
TableLine("LoD Offset 1"u8, _header.OffsetToSurface[1]);
|
||||
TableLine("LoD Offset 2"u8, _header.OffsetToSurface[2]);
|
||||
TableLine("LoD Offset 3"u8, _header.OffsetToSurface[3]);
|
||||
TableLine("LoD Offset 4"u8, _header.OffsetToSurface[4]);
|
||||
TableLine("LoD Offset 5"u8, _header.OffsetToSurface[5]);
|
||||
TableLine("LoD Offset 6"u8, _header.OffsetToSurface[6]);
|
||||
TableLine("LoD Offset 7"u8, _header.OffsetToSurface[7]);
|
||||
TableLine("LoD Offset 8"u8, _header.OffsetToSurface[8]);
|
||||
TableLine("LoD Offset 9"u8, _header.OffsetToSurface[9]);
|
||||
TableLine("LoD Offset 10"u8, _header.OffsetToSurface[10]);
|
||||
TableLine("LoD Offset 11"u8, _header.OffsetToSurface[11]);
|
||||
TableLine("LoD Offset 12"u8, _header.OffsetToSurface[12]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void TableLine<T>(ReadOnlySpan<byte> text, T value)
|
||||
{
|
||||
ImGui.TableNextColumn();
|
||||
ImUtf8.Text(text);
|
||||
ImGui.TableNextColumn();
|
||||
ImUtf8.Text($"{value}");
|
||||
}
|
||||
|
||||
private unsafe void ReadTex(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
_path = path;
|
||||
_tex = File.ReadAllBytes(_path);
|
||||
if (_tex.Length < sizeof(TexFile.TexHeader))
|
||||
throw new Exception($"Size {_tex.Length} does not include a header.");
|
||||
|
||||
_header = MemoryMarshal.Read<TexFile.TexHeader>(_tex);
|
||||
_exception = null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_tex = null;
|
||||
_exception = ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -26,7 +26,7 @@ public class EffectiveTab(CollectionManager collectionManager, CollectionSelectH
|
|||
SetupEffectiveSizes();
|
||||
collectionHeader.Draw(true);
|
||||
DrawFilters();
|
||||
using var child = ImRaii.Child("##EffectiveChangesTab", -Vector2.One, false);
|
||||
using var child = ImRaii.Child("##EffectiveChangesTab", ImGui.GetContentRegionAvail(), false);
|
||||
if (!child)
|
||||
return;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue