aboutsummaryrefslogtreecommitdiff
path: root/Unicity.Renderer/RenderWindow.cs
blob: 8307f47c45b28137019151474675e3361a89fc8c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;

namespace Unicity.Renderer
{
    public class RenderWindow : IDisposable
    {
        public event EventHandler Update;
        public event EventHandler Render;

        GameWindow window = null;

        public int Width { get => window.Width; set => window.Width = value; }
        public int Height { get => window.Height; set => window.Height = value; }

        public string Title { get => window.Title; set => window.Title = value; }

        public bool UpdateOnResize = false;

        bool disposed = false;

        public RenderWindow(int width, int height, string title)
        {
            window = new GameWindow(width, height, GraphicsMode.Default, title, GameWindowFlags.Default, DisplayDevice.Default, 3, 3, GraphicsContextFlags.ForwardCompatible);
            window.Load += Window_Load;
            window.Resize += Window_Resize;
            window.UpdateFrame += Window_UpdateFrame;
            window.RenderFrame += Window_RenderFrame;
        }
        private void Window_Load(object sender, EventArgs e)
        {
            GL.Viewport(0, 0, Width, Height);
        }

        private void Window_Resize(object sender, EventArgs e)
        {
            GL.Viewport(0, 0, Width, Height);

            if (UpdateOnResize)
            {
                Window_RenderFrame(this, new FrameEventArgs());
            }
        }

        private void Window_UpdateFrame(object sender, FrameEventArgs e)
        {
            Update?.Invoke(this, EventArgs.Empty);
        }

        private void Window_RenderFrame(object sender, FrameEventArgs e)
        {
            GL.Clear(ClearBufferMask.ColorBufferBit);

            Render?.Invoke(this, EventArgs.Empty);

            window.SwapBuffers();
        }
        
        public void Open(double ups, double fps)
        {
            window.Run(ups, fps);
        }

        public void MakeCurrent()
        {
            if (window.IsExiting)
            {
                return;
            }
            window.MakeCurrent();
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
            {
                return;
            }

            if (disposing)
            {
                // Dispose of managed resources
            }

            // Dispose of unmanaged resources
            window?.Dispose();

            disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}