mirror of
https://github.com/4sval/FModel.git
synced 2026-09-13 03:56:43 -05:00
fixed layout
This commit is contained in:
@@ -79,7 +79,7 @@ public partial class MainWindow
|
||||
#if DEBUG
|
||||
await _threadWorkerView.Begin(_ =>
|
||||
_applicationView.CUE4Parse.Extract(
|
||||
"Engine/Content/BasicShapes/Cube.uasset"));
|
||||
"FortniteGame/Content/Environments/Props/Winter/Meshes/SM_ChristmasTree_Llama.uasset"));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using CUE4Parse_Conversion.Meshes.PSK;
|
||||
using ImGuiNET;
|
||||
using Silk.NET.OpenGL;
|
||||
|
||||
namespace FModel.Views.Snooper;
|
||||
@@ -28,13 +26,13 @@ public class Model : IDisposable
|
||||
public readonly float[] Vertices;
|
||||
public readonly Section[] Sections;
|
||||
|
||||
private string[] _transforms = {
|
||||
public Transform Transforms = Transform.Identity;
|
||||
public readonly string[] TransformsLabels = {
|
||||
"X Location", "Y", "Z",
|
||||
"X Rotation", "Y", "Z",
|
||||
"X Scale", "Y", "Z"
|
||||
};
|
||||
private bool _display_vertex_colors;
|
||||
private Transform _transform = Transform.Identity;
|
||||
public bool DisplayVertexColors;
|
||||
|
||||
public Model(string name, CBaseMeshLod lod, CMeshVertex[] vertices)
|
||||
{
|
||||
@@ -113,7 +111,7 @@ public class Model : IDisposable
|
||||
|
||||
_shader.Use();
|
||||
|
||||
_shader.SetUniform("uModel", _transform.Matrix);
|
||||
_shader.SetUniform("uModel", Transforms.Matrix);
|
||||
_shader.SetUniform("uView", camera.GetViewMatrix());
|
||||
_shader.SetUniform("uProjection", camera.GetProjectionMatrix());
|
||||
_shader.SetUniform("viewPos", camera.Position);
|
||||
@@ -125,59 +123,7 @@ public class Model : IDisposable
|
||||
|
||||
_shader.SetUniform("light.position", camera.Position);
|
||||
|
||||
_shader.SetUniform("display_vertex_colors", _display_vertex_colors);
|
||||
|
||||
ImGui.Text($"Entity: {Name}");
|
||||
if (ImGui.TreeNode("Transform"))
|
||||
{
|
||||
const int width = 100;
|
||||
var speed = camera.Speed / 100;
|
||||
var index = 0;
|
||||
|
||||
ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Position.X, speed, 0f, 0f, "%.2f m");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Position.Z, speed, 0f, 0f, "%.2f m");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Position.Y, speed, 0f, 0f, "%.2f m");
|
||||
ImGui.PopID();
|
||||
|
||||
ImGui.Spacing();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Rotation.X, 1f, 0f, 0f, "%.1f°");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Rotation.Z, 1f, 0f, 0f, "%.1f°");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Rotation.Y, 1f, 0f, 0f, "%.1f°");
|
||||
ImGui.PopID();
|
||||
|
||||
ImGui.Spacing();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Scale.X, speed, 0f, 0f, "%.3f");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Scale.Z, speed, 0f, 0f, "%.3f");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(_transforms[index], ref _transform.Scale.Y, speed, 0f, 0f, "%.3f");
|
||||
ImGui.PopID();
|
||||
|
||||
ImGui.TreePop();
|
||||
}
|
||||
if (HasVertexColors) ImGui.Checkbox("Display Vertex Colors", ref _display_vertex_colors);
|
||||
ImGui.Separator();
|
||||
_shader.SetUniform("display_vertex_colors", DisplayVertexColors);
|
||||
|
||||
for (int section = 0; section < Sections.Length; section++)
|
||||
{
|
||||
|
||||
@@ -250,7 +250,7 @@ public class Section : IDisposable
|
||||
// ImGui.EndTooltip();
|
||||
// }
|
||||
|
||||
DrawImGui(index);
|
||||
// DrawImGui(index);
|
||||
|
||||
_diffuseMap?.Bind(TextureUnit.Texture0);
|
||||
_normalMap?.Bind(TextureUnit.Texture1);
|
||||
|
||||
@@ -1,18 +1,66 @@
|
||||
using System.Numerics;
|
||||
using FModel.Views.Snooper;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Numerics;
|
||||
using ImGuiNET;
|
||||
using Silk.NET.Input;
|
||||
using Silk.NET.Maths;
|
||||
using Silk.NET.OpenGL;
|
||||
using Silk.NET.OpenGL.Extensions.ImGui;
|
||||
using Silk.NET.Windowing;
|
||||
|
||||
namespace FModel.Extensions;
|
||||
namespace FModel.Views.Snooper;
|
||||
|
||||
public static class ImGuiExtensions
|
||||
public class SnimGui : IDisposable
|
||||
{
|
||||
public const uint DockspaceId = 1337;
|
||||
private readonly ImGuiController _controller;
|
||||
|
||||
private static bool _viewportFocus;
|
||||
private readonly Vector2 _outlinerSize;
|
||||
private readonly Vector2 _outlinerPosition;
|
||||
private readonly Vector2 _propertiesSize;
|
||||
private readonly Vector2 _propertiesPosition;
|
||||
private readonly Vector2 _viewportSize;
|
||||
private readonly Vector2 _viewportPosition;
|
||||
private bool _viewportFocus;
|
||||
private int _selectedModel;
|
||||
|
||||
public static void DrawDockSpace(Vector2D<int> size)
|
||||
private const ImGuiWindowFlags _noResize = ImGuiWindowFlags.NoResize; // delete once we have a proper docking branch
|
||||
private const ImGuiCond _firstUse = ImGuiCond.Appearing; // switch to FirstUseEver once the docking branch will not be useful anymore...
|
||||
private const uint _dockspaceId = 1337;
|
||||
|
||||
public SnimGui(GL gl, IWindow window, IInputContext input)
|
||||
{
|
||||
var fontConfig = new ImGuiFontConfig("C:\\Windows\\Fonts\\segoeui.ttf", 16);
|
||||
_controller = new ImGuiController(gl, window, input, fontConfig);
|
||||
|
||||
var style = ImGui.GetStyle();
|
||||
var viewport = ImGui.GetMainViewport();
|
||||
var titleBarHeight = ImGui.GetFontSize() + style.FramePadding.Y * 2;
|
||||
|
||||
_outlinerSize = new Vector2(300, 350);
|
||||
_outlinerPosition = new Vector2(viewport.WorkSize.X - _outlinerSize.X, titleBarHeight);
|
||||
_propertiesSize = _outlinerSize with { Y = viewport.WorkSize.Y - _outlinerSize.Y - titleBarHeight };
|
||||
_propertiesPosition = new Vector2(viewport.WorkSize.X - _propertiesSize.X, _outlinerPosition.Y + _outlinerSize.Y);
|
||||
_viewportSize = _outlinerPosition with { Y = viewport.WorkSize.Y - titleBarHeight };
|
||||
_viewportPosition = new Vector2(0, titleBarHeight);
|
||||
_selectedModel = 0;
|
||||
|
||||
Theme(style);
|
||||
}
|
||||
|
||||
public void Construct(Vector2D<int> size, FramebufferObject framebuffer, Camera camera, IMouse mouse, IList<Model> models)
|
||||
{
|
||||
DrawDockSpace(size);
|
||||
DrawNavbar();
|
||||
|
||||
DrawOuliner(camera, models);
|
||||
DrawProperties(camera, models);
|
||||
Draw3DViewport(framebuffer, camera, mouse);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// absolutely useless at the moment since ImGui.NET lacks DockerBuilder bindinds
|
||||
/// </summary>
|
||||
private void DrawDockSpace(Vector2D<int> size)
|
||||
{
|
||||
const ImGuiWindowFlags flags =
|
||||
ImGuiWindowFlags.MenuBar | ImGuiWindowFlags.NoDocking |
|
||||
@@ -23,10 +71,10 @@ public static class ImGuiExtensions
|
||||
ImGui.SetNextWindowPos(new Vector2(0, 0));
|
||||
ImGui.SetNextWindowSize(new Vector2(size.X, size.Y));
|
||||
ImGui.Begin("Snooper", flags);
|
||||
ImGui.DockSpace(DockspaceId);
|
||||
ImGui.DockSpace(_dockspaceId);
|
||||
}
|
||||
|
||||
public static void DrawNavbar()
|
||||
private void DrawNavbar()
|
||||
{
|
||||
if (!ImGui.BeginMainMenuBar()) return;
|
||||
|
||||
@@ -54,14 +102,118 @@ public static class ImGuiExtensions
|
||||
ImGui.EndMainMenuBar();
|
||||
}
|
||||
|
||||
public static void DrawViewport(FramebufferObject framebuffer, Camera camera, IMouse mouse)
|
||||
private void DrawOuliner(Camera camera, IList<Model> models)
|
||||
{
|
||||
ImGui.SetNextWindowSize(_outlinerSize, _firstUse);
|
||||
ImGui.SetNextWindowPos(_outlinerPosition, _firstUse);
|
||||
ImGui.Begin("Scene", _noResize | ImGuiWindowFlags.NoCollapse);
|
||||
|
||||
ImGui.SetNextItemOpen(true, ImGuiCond.Appearing);
|
||||
if (ImGui.TreeNode("Collection"))
|
||||
{
|
||||
for (var i = 0; i < models.Count; i++)
|
||||
{
|
||||
var model = models[i];
|
||||
if (ImGui.Selectable(model.Name, _selectedModel == i))
|
||||
_selectedModel = i;
|
||||
}
|
||||
ImGui.TreePop();
|
||||
}
|
||||
|
||||
if (ImGui.TreeNode("Camera"))
|
||||
{
|
||||
ImGui.Text($"Position: {camera.Position}");
|
||||
ImGui.Text($"Direction: {camera.Direction}");
|
||||
ImGui.Text($"Speed: {camera.Speed}");
|
||||
ImGui.Text($"Far: {camera.Far}");
|
||||
ImGui.Text($"Near: {camera.Near}");
|
||||
ImGui.Text($"Zoom: {camera.Zoom}");
|
||||
ImGui.TreePop();
|
||||
}
|
||||
|
||||
ImGui.Text($"Position: {_viewportPosition}");
|
||||
ImGui.Text($"Size: {_viewportSize}");
|
||||
|
||||
ImGui.End();
|
||||
}
|
||||
|
||||
private void DrawProperties(Camera camera, IList<Model> models)
|
||||
{
|
||||
ImGui.SetNextWindowSize(_propertiesSize, _firstUse);
|
||||
ImGui.SetNextWindowPos(_propertiesPosition, _firstUse);
|
||||
ImGui.Begin("Properties", _noResize | ImGuiWindowFlags.NoCollapse);
|
||||
|
||||
var model = models[_selectedModel];
|
||||
ImGui.Text($"Entity: {model.Name}");
|
||||
ImGui.BeginDisabled(!model.HasVertexColors);
|
||||
ImGui.Checkbox("Vertex Colors", ref model.DisplayVertexColors);
|
||||
ImGui.EndDisabled();
|
||||
|
||||
ImGui.SetNextItemOpen(true, ImGuiCond.Appearing);
|
||||
if (ImGui.TreeNode("Transform"))
|
||||
{
|
||||
const int width = 100;
|
||||
var speed = camera.Speed / 100;
|
||||
var index = 0;
|
||||
|
||||
ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Position.X, speed, 0f, 0f, "%.2f m");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Position.Z, speed, 0f, 0f, "%.2f m");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Position.Y, speed, 0f, 0f, "%.2f m");
|
||||
ImGui.PopID();
|
||||
|
||||
ImGui.Spacing();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Rotation.X, 1f, 0f, 0f, "%.1f°");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Rotation.Z, 1f, 0f, 0f, "%.1f°");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Rotation.Y, 1f, 0f, 0f, "%.1f°");
|
||||
ImGui.PopID();
|
||||
|
||||
ImGui.Spacing();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Scale.X, speed, 0f, 0f, "%.3f");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Scale.Z, speed, 0f, 0f, "%.3f");
|
||||
ImGui.PopID();
|
||||
|
||||
index++; ImGui.SetNextItemWidth(width); ImGui.PushID(index);
|
||||
ImGui.DragFloat(model.TransformsLabels[index], ref model.Transforms.Scale.Y, speed, 0f, 0f, "%.3f");
|
||||
ImGui.PopID();
|
||||
|
||||
ImGui.TreePop();
|
||||
}
|
||||
|
||||
ImGui.End();
|
||||
}
|
||||
|
||||
private void Draw3DViewport(FramebufferObject framebuffer, Camera camera, IMouse mouse)
|
||||
{
|
||||
const float lookSensitivity = 0.1f;
|
||||
const ImGuiWindowFlags flags =
|
||||
ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollWithMouse |
|
||||
ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.AlwaysUseWindowPadding;
|
||||
|
||||
ImGui.Begin("Viewport", flags);
|
||||
ImGui.SetNextWindowSize(_viewportSize, _firstUse);
|
||||
ImGui.SetNextWindowPos(_viewportPosition, _firstUse);
|
||||
ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, Vector2.Zero);
|
||||
ImGui.Begin("Viewport", _noResize | flags);
|
||||
ImGui.PopStyleVar();
|
||||
|
||||
var largest = ImGui.GetContentRegionAvail();
|
||||
largest.X -= ImGui.GetScrollX();
|
||||
@@ -120,7 +272,7 @@ public static class ImGuiExtensions
|
||||
ImGui.End();
|
||||
}
|
||||
|
||||
public static void Theme()
|
||||
private void Theme(ImGuiStylePtr style)
|
||||
{
|
||||
var io = ImGui.GetIO();
|
||||
io.ConfigFlags |= ImGuiConfigFlags.DockingEnable;
|
||||
@@ -128,8 +280,7 @@ public static class ImGuiExtensions
|
||||
io.ConfigWindowsMoveFromTitleBarOnly = true;
|
||||
io.ConfigDockingWithShift = true;
|
||||
|
||||
var style = ImGui.GetStyle();
|
||||
style.WindowPadding = Vector2.Zero;
|
||||
// style.WindowPadding = Vector2.Zero;
|
||||
// style.Colors[(int) ImGuiCol.Text] = new Vector4(0.95f, 0.96f, 0.98f, 1.00f);
|
||||
// style.Colors[(int) ImGuiCol.TextDisabled] = new Vector4(0.36f, 0.42f, 0.47f, 1.00f);
|
||||
// style.Colors[(int) ImGuiCol.WindowBg] = new Vector4(0.149f, 0.149f, 0.188f, 0.35f);
|
||||
@@ -179,4 +330,8 @@ public static class ImGuiExtensions
|
||||
// style.Colors[(int) ImGuiCol.NavWindowingDimBg] = new Vector4(0.80f, 0.80f, 0.80f, 0.20f);
|
||||
// style.Colors[(int) ImGuiCol.ModalWindowDimBg] = new Vector4(0.80f, 0.80f, 0.80f, 0.35f);
|
||||
}
|
||||
|
||||
public void Update(float deltaTime) => _controller.Update(deltaTime);
|
||||
public void Render() => _controller.Render();
|
||||
public void Dispose() => _controller.Dispose();
|
||||
}
|
||||
@@ -8,13 +8,11 @@ using CUE4Parse.UE4.Assets.Exports.SkeletalMesh;
|
||||
using CUE4Parse.UE4.Assets.Exports.StaticMesh;
|
||||
using CUE4Parse.UE4.Objects.Core.Math;
|
||||
using CUE4Parse_Conversion.Meshes;
|
||||
using FModel.Extensions;
|
||||
using ImGuiNET;
|
||||
using Silk.NET.Core;
|
||||
using Silk.NET.Input;
|
||||
using Silk.NET.Maths;
|
||||
using Silk.NET.OpenGL;
|
||||
using Silk.NET.OpenGL.Extensions.ImGui;
|
||||
using Silk.NET.Windowing;
|
||||
using SixLabors.ImageSharp;
|
||||
using SixLabors.ImageSharp.Advanced;
|
||||
@@ -25,8 +23,8 @@ namespace FModel.Views.Snooper;
|
||||
public class Snooper
|
||||
{
|
||||
private readonly IWindow _window;
|
||||
private ImGuiController _controller;
|
||||
private GL _gl;
|
||||
private SnimGui _imGui;
|
||||
private Camera _camera;
|
||||
private IKeyboard _keyboard;
|
||||
private IMouse _mouse;
|
||||
@@ -125,12 +123,7 @@ public class Snooper
|
||||
_gl = GL.GetApi(_window);
|
||||
_gl.Enable(EnableCap.Multisample);
|
||||
|
||||
// we don't need to bother with file check
|
||||
// but keep an eye on font size for different monitors
|
||||
var fontConfig = new ImGuiFontConfig("C:\\Windows\\Fonts\\segoeui.ttf", 16);
|
||||
_controller = new ImGuiController(_gl, _window, input, fontConfig);
|
||||
|
||||
ImGuiExtensions.Theme();
|
||||
_imGui = new SnimGui(_gl, _window, input);
|
||||
|
||||
_framebuffer.Setup(_gl);
|
||||
_skybox.Setup(_gl);
|
||||
@@ -148,44 +141,28 @@ public class Snooper
|
||||
/// </summary>
|
||||
private void OnRender(double deltaTime)
|
||||
{
|
||||
_controller.Update((float) deltaTime);
|
||||
_imGui.Update((float) deltaTime);
|
||||
|
||||
ClearWhatHasBeenDrawn(); // in main window
|
||||
|
||||
_framebuffer.Bind(); // switch to dedicated window
|
||||
ClearWhatHasBeenDrawn(); // in dedicated window
|
||||
|
||||
ImGuiExtensions.DrawDockSpace(_size);
|
||||
ImGuiExtensions.DrawNavbar();
|
||||
ImGui.ShowDemoWindow();
|
||||
|
||||
_skybox.Bind(_camera);
|
||||
_grid.Bind(_camera);
|
||||
|
||||
ImGui.Begin("Properties", ImGuiWindowFlags.NoFocusOnAppearing);
|
||||
if (ImGui.TreeNode("Camera"))
|
||||
{
|
||||
ImGui.Text($"Position: {_camera.Position}");
|
||||
ImGui.Text($"Direction: {_camera.Direction}");
|
||||
ImGui.Text($"Speed: {_camera.Speed}");
|
||||
ImGui.Text($"Far: {_camera.Far}");
|
||||
ImGui.Text($"Near: {_camera.Near}");
|
||||
ImGui.Text($"Zoom: {_camera.Zoom}");
|
||||
ImGui.TreePop();
|
||||
}
|
||||
foreach (var model in _models)
|
||||
{
|
||||
model.Bind(_camera);
|
||||
}
|
||||
ImGui.End();
|
||||
|
||||
ImGuiExtensions.DrawViewport(_framebuffer, _camera, _mouse);
|
||||
_imGui.Construct(_size, _framebuffer, _camera, _mouse, _models);
|
||||
|
||||
_framebuffer.BindMsaa();
|
||||
_framebuffer.Bind(0); // switch back to main window
|
||||
_framebuffer.BindStuff();
|
||||
|
||||
_controller.Render(); // render ImGui in main window
|
||||
_imGui.Render(); // render ImGui in main window
|
||||
}
|
||||
|
||||
private void ClearWhatHasBeenDrawn()
|
||||
@@ -229,7 +206,7 @@ public class Snooper
|
||||
model.Dispose();
|
||||
}
|
||||
_models.Clear();
|
||||
_controller.Dispose();
|
||||
_imGui.Dispose();
|
||||
_window.Dispose();
|
||||
_gl.Dispose();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user