diff options
Diffstat (limited to 'Unicity.Renderer/RenderWindow.cs')
| -rw-r--r-- | Unicity.Renderer/RenderWindow.cs | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/Unicity.Renderer/RenderWindow.cs b/Unicity.Renderer/RenderWindow.cs index 840d4fb..2026780 100644 --- a/Unicity.Renderer/RenderWindow.cs +++ b/Unicity.Renderer/RenderWindow.cs @@ -1,22 +1,24 @@ using System; using System.Diagnostics; using System.Drawing; -using System.IO; -using GLFW; +using OpenTK; +using OpenTK.Graphics; +using OpenTK.Graphics.OpenGL4; namespace Unicity.Renderer { public class RenderWindow : IDisposable { - const int FPS = 60; + const int UPS = 60; - internal NativeWindow window = null; + internal GameWindow window = null; Stopwatch loopTimer = new Stopwatch(); public event EventHandler Init; public event EventHandler Update; public event EventHandler Render; + public event EventHandler Destroy; public int Width { @@ -36,57 +38,58 @@ namespace Unicity.Renderer set => window.Title = value; } + bool running = false; + public RenderWindow(int width, int height, string title) { - if (!File.Exists(Glfw.LIBRARY + ".dll")) - { - throw new WindowCreationFailedException("A required library file is missing and operation cannot continue."); - } - - if (!Glfw.Init()) - { - throw new WindowCreationFailedException("Failed to initialize GLFW."); - } + window = new GameWindow(width, height, GraphicsMode.Default, title, GameWindowFlags.Default); - window = new NativeWindow(width, height, title); - window.SizeChanged += Window_SizeChanged; + window.UpdateFrame += Window_UpdateFrame; + window.RenderFrame += Window_RenderFrame; + window.Unload += Window_Unload; + window.Resize += Window_Resize; } - private void Window_SizeChanged(object sender, SizeChangeEventArgs e) + private void Window_UpdateFrame(object sender, FrameEventArgs e) { - GraphicsRenderer.GL.Viewport(0, 0, Width, Height); - UpdateWindow(); + Update?.Invoke(this, EventArgs.Empty); } - public void StartUpdateLoop() + private void Window_RenderFrame(object sender, FrameEventArgs e) { - if (loopTimer.IsRunning) return; + Render?.Invoke(this, EventArgs.Empty); + window.SwapBuffers(); + } - loopTimer.Start(); + private void Window_Unload(object sender, EventArgs e) + { + Destroy?.Invoke(this, EventArgs.Empty); + } - Init?.Invoke(this, EventArgs.Empty); + private void Window_Resize(object sender, EventArgs e) + { + GL.Viewport(0, 0, Width, Height); + Render?.Invoke(this, EventArgs.Empty); + window.SwapBuffers(); + } - while (!window.IsClosed) + public void Open() + { + if (running) { - Glfw.PollEvents(); - - if (!window.IsClosing) UpdateWindow(); + return; } - loopTimer.Stop(); + Init?.Invoke(this, EventArgs.Empty); + window.VSync = VSyncMode.Off; + window.Run(UPS, 0); + + running = true; } - private void UpdateWindow() + public double GetFPS() { - if (loopTimer.Elapsed.TotalMilliseconds >= 1000 / FPS) - { - loopTimer.Restart(); - - Update?.Invoke(this, EventArgs.Empty); - Render?.Invoke(this, EventArgs.Empty); - - window.SwapBuffers(); - } + return window.RenderFrequency; } bool disposed = false; @@ -105,7 +108,6 @@ namespace Unicity.Renderer // Dispose of any unmanaged resources window?.Dispose(); - Glfw.Terminate(); // Set disposed flag to true disposed = true; |
