0
mirror of https://github.com/sampletext32/ParkanPlayground.git synced 2025-05-18 19:31:17 +03:00
ParkanPlayground/NResUI/ImGuiUI/TexmExplorer.cs

199 lines
8.2 KiB
C#
Raw Normal View History

2024-11-19 02:13:14 +03:00
using System.Numerics;
using ImGuiNET;
2024-11-18 23:48:42 +03:00
using NResUI.Abstractions;
using NResUI.Models;
2024-11-19 02:13:14 +03:00
using Silk.NET.OpenGL;
2024-11-18 23:48:42 +03:00
namespace NResUI.ImGuiUI;
public class TexmExplorer : IImGuiPanel
{
private readonly TexmExplorerViewModel _viewModel;
2024-11-19 02:13:14 +03:00
private readonly GL _openGl;
2024-11-18 23:48:42 +03:00
2024-11-19 02:13:14 +03:00
public TexmExplorer(TexmExplorerViewModel viewModel, GL openGl)
2024-11-18 23:48:42 +03:00
{
_viewModel = viewModel;
2024-11-19 02:13:14 +03:00
_openGl = openGl;
2024-11-18 23:48:42 +03:00
}
public void OnImGuiRender()
{
if (ImGui.Begin("TEXM Explorer"))
{
if (!_viewModel.HasFile)
{
ImGui.Text("No TEXM opened");
}
else
{
if (_viewModel.TexmFile is not null)
{
ImGui.Text("File: ");
ImGui.SameLine();
ImGui.Text(_viewModel.Path);
ImGui.Text("Header: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.TexmAscii);
ImGui.Text("Width: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.Width.ToString());
ImGui.Text("Height: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.Height.ToString());
ImGui.Text("MipMap Count: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.MipmapCount.ToString());
ImGui.Text("Stride: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.Stride.ToString());
2024-11-19 02:13:14 +03:00
ImGui.Text("Magic1 (possibly ddsCaps): ");
2024-11-18 23:48:42 +03:00
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.Magic1.ToString());
ImGui.Text("Magic2: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.Magic2.ToString());
ImGui.Text("Format: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Header.Format.ToString());
ImGui.Text("IsIndexed: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.IsIndexed.ToString());
2024-11-19 02:13:14 +03:00
2024-11-19 03:07:58 +03:00
if (_viewModel.TexmFile.Pages is not null)
{
ImGui.Text("Page Section: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Pages.Page);
ImGui.Text("Page Count: ");
ImGui.SameLine();
ImGui.Text(_viewModel.TexmFile.Pages.Count.ToString());
if (ImGui.TreeNodeEx("Показать координаты атласа"))
{
if (ImGui.BeginTable("pages-table", 4, ImGuiTableFlags.Borders | ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.NoHostExtendX))
{
ImGui.TableSetupColumn("X");
ImGui.TableSetupColumn("Ширина");
ImGui.TableSetupColumn("Y");
ImGui.TableSetupColumn("Height");
ImGui.TableHeadersRow();
for (int i = 0; i < _viewModel.TexmFile.Pages.Count; i++)
{
ImGui.TableNextRow();
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.TexmFile.Pages.Items[i]
.X.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.TexmFile.Pages.Items[i]
.Width.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.TexmFile.Pages.Items[i]
.Y.ToString()
);
ImGui.TableNextColumn();
ImGui.Text(
_viewModel.TexmFile.Pages.Items[i]
.Height.ToString()
);
}
ImGui.EndTable();
}
ImGui.TreePop();
2024-11-19 03:07:58 +03:00
}
}
2024-11-19 02:13:14 +03:00
ImGui.Checkbox("Включить чёрный фон", ref _viewModel.IsBlackBgEnabled);
2024-11-19 02:28:49 +03:00
ImGui.SameLine();
2024-11-19 02:13:14 +03:00
ImGui.Checkbox("Включить белый фон", ref _viewModel.IsWhiteBgEnabled);
2024-11-19 02:28:49 +03:00
ImGui.SameLine();
ImGui.Checkbox("Увеличить в 2 раза", ref _viewModel.DoubleSize);
2024-11-19 02:13:14 +03:00
2024-11-19 03:07:58 +03:00
if (_viewModel.TexmFile.Pages is not null)
{
ImGui.SameLine();
ImGui.Checkbox("Отображать атлас", ref _viewModel.ViewPages);
}
2024-11-19 02:28:49 +03:00
if (_viewModel is {IsWhiteBgEnabled: true, IsBlackBgEnabled: true})
2024-11-19 02:13:14 +03:00
{
_viewModel.IsBlackBgEnabled = false;
_viewModel.IsWhiteBgEnabled = false;
}
2024-11-19 03:07:58 +03:00
2024-11-19 02:13:14 +03:00
_viewModel.GenerateGlTextures(_openGl);
var drawList = ImGui.GetWindowDrawList();
for (var index = 0; index < _viewModel.GlTextures.Count; index++)
{
var glTexture = _viewModel.GlTextures[index];
var screenPos = ImGui.GetCursorScreenPos();
2024-11-19 02:28:49 +03:00
Vector2 imageSize = new Vector2(glTexture.Width, glTexture.Height);
if (_viewModel.DoubleSize)
{
imageSize *= 2;
}
2024-11-19 02:13:14 +03:00
if (_viewModel.IsBlackBgEnabled)
{
2024-11-19 02:28:49 +03:00
drawList.AddRectFilled(screenPos, screenPos + imageSize, 0xFF000000);
2024-11-19 02:13:14 +03:00
}
else if (_viewModel.IsWhiteBgEnabled)
{
2024-11-19 02:28:49 +03:00
drawList.AddRectFilled(screenPos, screenPos + imageSize, 0xFFFFFFFF);
2024-11-19 02:13:14 +03:00
}
2024-11-19 02:28:49 +03:00
ImGui.Image((IntPtr) glTexture.GlTexture, imageSize);
2024-11-19 02:13:14 +03:00
ImGui.SameLine();
2024-11-19 03:07:58 +03:00
if (_viewModel.ViewPages && _viewModel.TexmFile.Pages is not null)
{
for (int i = 0; i < _viewModel.TexmFile.Pages.Items.Count; i++)
{
var page = _viewModel.TexmFile.Pages.Items[i];
drawList.AddRect(
screenPos + (new Vector2(page.X, page.Y) * (_viewModel.DoubleSize ? 2 : 1) / (int)Math.Pow(2, index)),
screenPos + (new Vector2(page.X + page.Width, page.Y + page.Height) * (_viewModel.DoubleSize ? 2 : 1) / (int)Math.Pow(2, index)),
0xFF0000FF
);
}
}
2024-11-19 02:13:14 +03:00
if (ImGui.IsItemHovered())
{
var mousePos = ImGui.GetMousePos();
2024-11-19 03:07:58 +03:00
var relativePos = (mousePos - screenPos) / (_viewModel.DoubleSize
? 2
: 1);
2024-11-19 02:13:14 +03:00
ImGui.Text("Hovering over: ");
ImGui.SameLine();
ImGui.Text(relativePos.ToString());
}
}
2024-11-18 23:48:42 +03:00
}
}
ImGui.End();
}
}
}