using StgSharp.Math; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Numerics; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Xml.Linq; namespace StgSharp.Graphics { [StructLayout(LayoutKind.Sequential)] internal struct formInfo { public int width; public int height; public Vector4 color; public string name; } public unsafe partial class Form { internal LinkedList allControl; internal Vector4 color; internal int height; internal IntPtr monitor; internal string name; internal Form sharedForm = null; internal int width; internal IntPtr windowID = default; /// /// Constructor of a Form, creats an instance of a form and /// initilize all the customizing operations. /// public Form(int width, int height, string name, IntPtr monitor, Form sharedForm) { this.width = width; this.height = height; this.name = name; this.sharedForm = sharedForm; this.monitor = monitor; } internal Form() { } ~Form() { GL.gl = default; Marshal.FreeHGlobal((IntPtr)contextID); } public int Height { get => height; set => height = value; } public Vec2d Size { get { return new Vec2d(width, height); } set { width = (int)value.X; height = (int)value.Y; } } public int Width { get => width; set => width = value; } /// /// /// /// public void MakeAsCurrentContext() { if (windowID == default) { IntPtr windowPtr; byte[] tittleBytes = Encoding.UTF8.GetBytes(name); if (sharedForm == null) { windowPtr = InternalIO.glfw.CreateWindow( width, height, tittleBytes, monitor, IntPtr.Zero); } else { windowPtr = InternalIO.glfw.CreateWindow( width, height, tittleBytes, monitor, sharedForm.windowID); } if ((long)windowPtr == -1 || (long)windowPtr == -2) { throw new Exception("Cannot create window instance!"); } else { windowID = windowPtr; } glContext = new GLcontext(); IntPtr ptr = Marshal.AllocHGlobal(sizeof(GLcontextIO)); contextID = (GLcontextIO*)ptr; *contextID = new GLcontextIO(); InternalIO.InternalWriteLog("Successfully create a context binded to current form. " + $"Its ID is {(ulong)ptr}", LogType.Info); } GL.gl = glContext; InternalIO.InternalSetCurrentGLContext(windowID, (IntPtr)contextID); } /// /// Resize the current form /// /// New width of the window /// New height of the window public void SetSize(int width, int height) { this.Width = width; this.Height = height; InternalIO.glfw.SetWindowSize(this.windowID, width, height); } /// /// Resize the current form /// /// /// A (width,height) representing the new size of current form /// public void SetSize(Vec2d size) { this.Size = size; InternalIO.glfw.SetWindowSize(this.windowID, (int)size.X, (int)size.Y); } /// /// Set the size limit of current form /// /// Minimum width of current form /// Minimum height of current form /// Maximum width of curent form /// Maximum height of current form public void SetSizeLimit(int minWidth, int minHeight, int maxWidth, int maxHeight) { InternalIO.glfw.SetWindowSizeLimits( this.windowID, minWidth, minHeight, maxWidth, maxHeight); } /// /// Set the size limit of current form /// /// /// Minimun size of current form. In form of a of (width,height) /// /// /// Maximum size of current form. In form of a of (width,height) /// public void SetSizeLimit(Vec2d minSize, Vec2d maxSize) { InternalIO.glfw.SetWindowSizeLimits( this.windowID, (int)minSize.X, (int)minSize.Y, (int)maxSize.X, (int)maxSize.Y); } } }