diff --git a/Hypercube.Client/Graphics/Event/WindowFocusChangedEvent.cs b/Hypercube.Client/Graphics/Event/WindowFocusChangedEvent.cs new file mode 100644 index 0000000..3628687 --- /dev/null +++ b/Hypercube.Client/Graphics/Event/WindowFocusChangedEvent.cs @@ -0,0 +1,5 @@ +using Hypercube.Client.Graphics.Windows; + +namespace Hypercube.Client.Graphics.Event; + +public readonly record struct WindowFocusChangedEvent(WindowRegistration Registration, bool Focused); \ No newline at end of file diff --git a/Hypercube.Client/Graphics/Rendering/IRenderer.cs b/Hypercube.Client/Graphics/Rendering/IRenderer.cs index 2b7f533..88858d0 100644 --- a/Hypercube.Client/Graphics/Rendering/IRenderer.cs +++ b/Hypercube.Client/Graphics/Rendering/IRenderer.cs @@ -20,6 +20,8 @@ public interface IRenderer void AddMonitor(MonitorRegistration monitor); + void OnFocusChanged(WindowRegistration window, bool focused); + // Drawing void DrawTexture(ITextureHandle texture, Box2 quad, Box2 uv, Color color); } \ No newline at end of file diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs index 986009d..054b396 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs @@ -1,6 +1,7 @@ using Hypercube.Client.Graphics.Shading; using Hypercube.Client.Graphics.Texturing; using Hypercube.Client.Graphics.Viewports; +using Hypercube.Client.Graphics.Windows; using Hypercube.Shared.Math; using Hypercube.Shared.Math.Box; using Hypercube.Shared.Runtimes.Loop.Event; @@ -57,6 +58,9 @@ private void OnLoad() private void OnFrameUpdate(UpdateFrameEvent args) { +#if DEBUG + _windowManager.WindowSetTitle(MainWindow, $"FPS: {_timing.Fps} | RealTime: {_timing.RealTime}"); +#endif _windowManager.PollEvents(); } diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.Window.cs b/Hypercube.Client/Graphics/Rendering/Renderer.Window.cs index de607c4..0033816 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.Window.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.Window.cs @@ -81,4 +81,9 @@ private bool InitMainWindow(ContextInfo? context, WindowCreateSettings settings) return (registration, null); } + + public void OnFocusChanged(WindowRegistration window, bool focused) + { + _eventBus.Invoke(new WindowFocusChangedEvent(window, focused)); + } } \ No newline at end of file diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.cs b/Hypercube.Client/Graphics/Rendering/Renderer.cs index e442103..057a1e5 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.cs @@ -1,4 +1,5 @@ using System.Collections.Frozen; +using Hypercube.Client.Graphics.Event; using Hypercube.Client.Graphics.OpenGL; using Hypercube.Client.Graphics.Texturing; using Hypercube.Client.Graphics.Windows; diff --git a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Callbacks.cs b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Callbacks.cs index a14cc4f..3eb4225 100644 --- a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Callbacks.cs +++ b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Callbacks.cs @@ -1,4 +1,5 @@ -using Hypercube.Client.Input; +using Hypercube.Client.Graphics.Event; +using Hypercube.Client.Input; using Hypercube.Client.Utilities; using OpenTK.Windowing.GraphicsLibraryFramework; using GlfwKeyModifiers = OpenTK.Windowing.GraphicsLibraryFramework.KeyModifiers; @@ -56,4 +57,12 @@ private void OnWindowResized(Window* window, int width, int height) registration.SetSize(width, height); } + + private void OnWindowFocusChanged(Window* window, bool focused) + { + if (!TryGetWindow(window, out var registration)) + return; + + _renderer.OnFocusChanged(registration, focused); + } } \ No newline at end of file diff --git a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Monitors.cs b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Monitors.cs index 8464941..e1f9b1a 100644 --- a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Monitors.cs +++ b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Monitors.cs @@ -63,7 +63,7 @@ private void ThreadSetupMonitor(Monitor* monitor) modes ); - var registration = new GlfwMonitorRegistration(id, handle);; + var registration = new GlfwMonitorRegistration(monitor, handle);; _monitors[id] = registration; _renderer.AddMonitor(registration); diff --git a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Window.cs b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Window.cs index f2be459..74dc1c1 100644 --- a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Window.cs +++ b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.Window.cs @@ -127,6 +127,8 @@ private GlfwWindowRegistration WindowSetup(Window* window) GLFW.SetKeyCallback(window, OnWindowKeyHandled); GLFW.SetWindowCloseCallback(window, OnWindowClosed); GLFW.SetWindowSizeCallback(window, OnWindowResized); + GLFW.SetWindowFocusCallback(window, OnWindowFocusChanged); + return registration; } diff --git a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.cs b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.cs index b87272e..8f38686 100644 --- a/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.cs +++ b/Hypercube.Client/Graphics/Windows/Manager/GlfwWindowManager.cs @@ -1,8 +1,10 @@ -using Hypercube.Client.Graphics.Rendering; +using Hypercube.Client.Graphics.Monitors; +using Hypercube.Client.Graphics.Rendering; using Hypercube.Client.Graphics.Windows.Manager.Registrations; using Hypercube.Client.Input.Handler; using Hypercube.Shared.Dependency; using Hypercube.Shared.Logging; +using Hypercube.Shared.Math.Vector; using OpenTK.Windowing.GraphicsLibraryFramework; namespace Hypercube.Client.Graphics.Windows.Manager; @@ -90,14 +92,33 @@ public nint GetProcAddress(string procName) return GLFW.GetProcAddress(procName); } - public void WindowSetTitle() + public void WindowSetTitle(WindowRegistration window, string title) { - throw new NotImplementedException(); + if (window is not GlfwWindowRegistration glfwWindow) + return; + + GLFW.SetWindowTitle(glfwWindow.Pointer, title); + } + + public void WindowSetMonitor(WindowRegistration window, MonitorRegistration monitor, Vector2Int vector) + { + if (monitor is not GlfwMonitorRegistration glfwMonitor) + return; + + if (window is not GlfwWindowRegistration glfwWindow) + return; + + GLFW.SetWindowMonitor( + glfwWindow.Pointer, + glfwMonitor.Pointer, + vector.X, vector.Y, + monitor.Handle.Size.X, monitor.Handle.Size.Y, + monitor.Handle.RefreshRate); } - public void WindowSetMonitor() + public void WindowSetMonitor(WindowRegistration window, MonitorRegistration registration) { - throw new NotImplementedException(); + WindowSetMonitor(window, registration, Vector2Int.Zero); } public void WindowRequestAttention(WindowRegistration window) @@ -108,9 +129,34 @@ public void WindowRequestAttention(WindowRegistration window) GLFW.RequestWindowAttention(glfwWindow.Pointer); } - public void WindowSetVisible() + public void WindowSetSize(WindowRegistration window, Vector2Int size) + { + if (window is not GlfwWindowRegistration glfwWindow) + return; + + GLFW.SetWindowSize(glfwWindow.Pointer, size.X, size.Y); + } + + public void WindowSetVisible(WindowRegistration registration, bool visible) + { + if (registration is not GlfwWindowRegistration glfwWindow) + return; + + if (visible) + { + GLFW.ShowWindow(glfwWindow.Pointer); + return; + } + + GLFW.HideWindow(glfwWindow.Pointer); + } + + public void WindowSetOpacity(WindowRegistration window, float opacity) { - throw new NotImplementedException(); + if (window is not GlfwWindowRegistration glfwWindow) + return; + + GLFW.SetWindowOpacity(glfwWindow.Pointer, opacity); } public void WindowSwapBuffers(WindowRegistration window) diff --git a/Hypercube.Client/Graphics/Windows/Manager/IWindowManager.cs b/Hypercube.Client/Graphics/Windows/Manager/IWindowManager.cs index 6cba15b..52b9992 100644 --- a/Hypercube.Client/Graphics/Windows/Manager/IWindowManager.cs +++ b/Hypercube.Client/Graphics/Windows/Manager/IWindowManager.cs @@ -1,4 +1,6 @@ -using Hypercube.Client.Graphics.OpenGL; +using Hypercube.Client.Graphics.Monitors; +using Hypercube.Client.Graphics.OpenGL; +using Hypercube.Shared.Math.Vector; namespace Hypercube.Client.Graphics.Windows.Manager; @@ -19,10 +21,13 @@ public interface IWindowManager : IDisposable WindowCreateResult WindowCreate(ContextInfo? context, WindowCreateSettings settings, WindowRegistration? contextShare); void MakeContextCurrent(WindowRegistration? window); void WindowDestroy(WindowRegistration window); - void WindowSetTitle(); - void WindowSetMonitor(); + void WindowSetTitle(WindowRegistration window, string title); + void WindowSetMonitor(WindowRegistration window, MonitorRegistration monitor, Vector2Int vector2Int); + void WindowSetMonitor(WindowRegistration window, MonitorRegistration monitor); void WindowRequestAttention(WindowRegistration window); - void WindowSetVisible(); + void WindowSetOpacity(WindowRegistration window, float opacity); + void WindowSetVisible(WindowRegistration registration, bool visible); + void WindowSetSize(WindowRegistration registration, Vector2Int size); void WindowSwapBuffers(WindowRegistration window); nint GetProcAddress(string procName); diff --git a/Hypercube.Client/Graphics/Windows/Manager/Registrations/GlfwMonitorRegistration.cs b/Hypercube.Client/Graphics/Windows/Manager/Registrations/GlfwMonitorRegistration.cs index 511be64..5366580 100644 --- a/Hypercube.Client/Graphics/Windows/Manager/Registrations/GlfwMonitorRegistration.cs +++ b/Hypercube.Client/Graphics/Windows/Manager/Registrations/GlfwMonitorRegistration.cs @@ -1,8 +1,9 @@ using Hypercube.Client.Graphics.Monitors; +using Monitor = OpenTK.Windowing.GraphicsLibraryFramework.Monitor; namespace Hypercube.Client.Graphics.Windows.Manager.Registrations; -public sealed class GlfwMonitorRegistration(int id, IMonitorHandle handle) : MonitorRegistration(handle) +public sealed unsafe class GlfwMonitorRegistration(Monitor* monitor, IMonitorHandle handle) : MonitorRegistration(handle) { - public int Id = id; + public Monitor* Pointer; } \ No newline at end of file