Skip to content

Commit

Permalink
gui
Browse files Browse the repository at this point in the history
  • Loading branch information
4sval committed Nov 1, 2022
1 parent 321b82b commit 525718d
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 42 deletions.
4 changes: 4 additions & 0 deletions FModel/Views/Snooper/Material.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public class Material : IDisposable

public readonly CMaterialParams2 Parameters;
public readonly int UvNumber;
public string Name;
public int SelectedChannel;
public bool IsUsed;

public Texture[] Diffuse;
Expand All @@ -31,6 +33,7 @@ public Material(int numUvs)
{
Parameters = new CMaterialParams2();
UvNumber = numUvs;
Name = "";
IsUsed = false;

Diffuse = Array.Empty<Texture>();
Expand All @@ -53,6 +56,7 @@ public Material(int numUvs, UMaterialInterface unrealMaterial) : this(numUvs)

public void SwapMaterial(UMaterialInterface unrealMaterial)
{
Name = unrealMaterial.Name;
unrealMaterial.GetParams(Parameters);
}

Expand Down
163 changes: 121 additions & 42 deletions FModel/Views/Snooper/SnimGui.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,14 @@ public void Render(Snooper s)
ImGui.End();
ImGui.Begin("World");
ImGui.End();
ImGui.Begin("UV Channels");
ImGui.End();
ImGui.Begin("Timeline");
ImGui.End();
ImGui.Begin("Materials");
ImGui.End();
ImGui.Begin("Textures");
ImGui.End();

DrawUvChannels(s);
DrawTransform(s);
DrawDetails(s);
DrawOuliner(s);
Expand Down Expand Up @@ -128,53 +127,53 @@ private void DrawNavbar()

private void DrawOuliner(Snooper s)
{
ImGui.Begin("Outliner");

PushStyleCompact();
if (ImGui.BeginTable("Items", 2, ImGuiTableFlags.Borders | ImGuiTableFlags.Resizable))
if (ImGui.Begin("Outliner"))
{
ImGui.TableSetupColumn("Count", ImGuiTableColumnFlags.NoHeaderWidth | ImGuiTableColumnFlags.WidthFixed);
ImGui.TableSetupColumn("Name");
ImGui.TableHeadersRow();
PushStyleCompact();

var i = 0;
foreach ((FGuid guid, Model model) in s.Renderer.Cache.Models)
if (ImGui.BeginTable("Items", 2, ImGuiTableFlags.Borders | ImGuiTableFlags.Resizable))
{
ImGui.PushID(i);
ImGui.TableNextRow();
ImGui.TableNextColumn();
if (!model.Show)
ImGui.TableSetBgColor(ImGuiTableBgTarget.RowBg0, ImGui.GetColorU32(new Vector4(1, 0, 0, .5f)));
ImGui.Text(model.TransformsCount.ToString("D"));
ImGui.TableNextColumn();
model.IsSelected = s.Renderer.Settings.SelectedModel == guid;
if (ImGui.Selectable(model.Name, model.IsSelected, ImGuiSelectableFlags.SpanAllColumns))
{
s.Renderer.Settings.SelectModel(guid);
}
if (ImGui.BeginPopupContextItem())
ImGui.TableSetupColumn("Count", ImGuiTableColumnFlags.NoHeaderWidth | ImGuiTableColumnFlags.WidthFixed);
ImGui.TableSetupColumn("Name");
ImGui.TableHeadersRow();

var i = 0;
foreach ((FGuid guid, Model model) in s.Renderer.Cache.Models)
{
s.Renderer.Settings.SelectModel(guid);
if (ImGui.Selectable("Deselect"))
s.Renderer.Settings.SelectModel(Guid.Empty);
if (ImGui.Selectable("Delete"))
s.Renderer.Cache.Models.Remove(guid);
if (ImGui.Selectable("Copy Name to Clipboard"))
Application.Current.Dispatcher.Invoke(delegate
{
Clipboard.SetText(model.Name);
});
ImGui.EndPopup();
ImGui.PushID(i);
ImGui.TableNextRow();
ImGui.TableNextColumn();
if (!model.Show)
{
ImGui.TableSetBgColor(ImGuiTableBgTarget.RowBg0, ImGui.GetColorU32(new Vector4(1, 0, 0, .5f)));
}

ImGui.Text(model.TransformsCount.ToString("D"));
ImGui.TableNextColumn();
model.IsSelected = s.Renderer.Settings.SelectedModel == guid;
if (ImGui.Selectable(model.Name, model.IsSelected, ImGuiSelectableFlags.SpanAllColumns))
{
s.Renderer.Settings.SelectModel(guid);
}
if (ImGui.BeginPopupContextItem())
{
s.Renderer.Settings.SelectModel(guid);
if (ImGui.Selectable("Delete")) s.Renderer.Cache.Models.Remove(guid);
if (ImGui.Selectable("Deselect")) s.Renderer.Settings.SelectModel(Guid.Empty);
if (ImGui.Selectable("Copy Name to Clipboard")) Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(model.Name));
ImGui.EndPopup();
}
ImGui.PopID();
i++;
}
ImGui.PopID();
i++;

ImGui.EndTable();
}

ImGui.EndTable();
}
PopStyleCompact();
PopStyleCompact();

ImGui.End();
ImGui.End();
}
}

private void DrawDetails(Snooper s)
Expand All @@ -198,9 +197,53 @@ private void DrawDetails(Snooper s)
ImGui.NextColumn(); ImGui.BeginDisabled(!model.HasVertexColors); ImGui.Checkbox("Colors", ref model.DisplayVertexColors); ImGui.EndDisabled();
ImGui.NextColumn(); ImGui.BeginDisabled(!model.HasBones); ImGui.Checkbox("Bones", ref model.DisplayBones); ImGui.EndDisabled();
ImGui.Columns(1);
PopStyleCompact();

ImGui.Spacing();
ImGui.Separator();
ImGui.Spacing();

if (ImGui.BeginTable("Sections", 3, ImGuiTableFlags.Borders | ImGuiTableFlags.Resizable))
{
ImGui.TableSetupColumn("Index", ImGuiTableColumnFlags.WidthFixed);
ImGui.TableSetupColumn("Channels", ImGuiTableColumnFlags.WidthFixed);
ImGui.TableSetupColumn("Material");
ImGui.TableHeadersRow();

for (var i = 0; i < model.Sections.Length; i++)
{
var section = model.Sections[i];
var material = model.Materials[section.MaterialIndex];

ImGui.PushID(i);
ImGui.TableNextRow();
ImGui.TableNextColumn();
if (!section.Show)
{
ImGui.TableSetBgColor(ImGuiTableBgTarget.RowBg0, ImGui.GetColorU32(new Vector4(1, 0, 0, .5f)));
}

ImGui.Text(section.MaterialIndex.ToString("D"));
ImGui.TableNextColumn();
ImGui.Text(material.UvNumber.ToString("D"));
ImGui.TableNextColumn();
if (ImGui.Selectable(material.Name, s.Renderer.Settings.SelectedSection == i, ImGuiSelectableFlags.SpanAllColumns))
{
s.Renderer.Settings.SelectSection(i);
}
if (ImGui.BeginPopupContextItem())
{
s.Renderer.Settings.SelectSection(i);
if (ImGui.Selectable("Swap")) s.Renderer.Settings.SwapMaterial(true);
if (ImGui.Selectable("Copy Name to Clipboard")) Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(material.Name));
ImGui.EndPopup();
}
ImGui.PopID();
}

ImGui.EndTable();
}

PopStyleCompact();
}

ImGui.End();
Expand Down Expand Up @@ -280,6 +323,39 @@ private void DrawTransform(Snooper s)
}
}

private void DrawUvChannels(Snooper s)
{
if (ImGui.Begin("UV Channels"))
{
if (s.Renderer.Cache.Models.TryGetValue(s.Renderer.Settings.SelectedModel, out var model) &&
s.Renderer.Settings.TryGetSection(model, out var section))
{
var width = ImGui.GetContentRegionAvail().X;
var material = model.Materials[section.MaterialIndex];

PushStyleCompact();
ImGui.PushID(0); ImGui.BeginDisabled(material.UvNumber < 2);
ImGui.SetNextItemWidth(width);
ImGui.SliderInt("", ref material.SelectedChannel, 0, material.UvNumber - 1, "Channel %i", ImGuiSliderFlags.AlwaysClamp);
ImGui.EndDisabled(); ImGui.PopID();

ImGui.SetNextItemOpen(true, ImGuiCond.Appearing);
if (ImGui.TreeNode("Textures"))
{
var size = new Vector2(ImGui.GetContentRegionAvail().X / 4.75f);
DrawSquareTexture(material.Diffuse[material.SelectedChannel], size); ImGui.SameLine();
DrawSquareTexture(material.Normals[material.SelectedChannel], size); ImGui.SameLine();
DrawSquareTexture(material.SpecularMasks[material.SelectedChannel], size); ImGui.SameLine();
DrawSquareTexture(material.Emissive[material.SelectedChannel], size); ImGui.SameLine();
}

PopStyleCompact();
}

ImGui.End();
}
}

private void Draw3DViewport(Snooper s)
{
const float lookSensitivity = 0.1f;
Expand Down Expand Up @@ -350,6 +426,9 @@ private void PushStyleCompact()

private void PopStyleCompact() => ImGui.PopStyleVar(2);

private void DrawSquareTexture(Texture texture, Vector2 size) =>
ImGui.Image(texture?.GetPointer() ?? IntPtr.Zero, size, Vector2.Zero, Vector2.One, Vector4.One, new Vector4(1, 1, 1, .5f));

private void Theme(ImGuiStylePtr style)
{
var io = ImGui.GetIO();
Expand Down

0 comments on commit 525718d

Please sign in to comment.