#region --- License --- /* Copyright (c) 2006, 2007 Stefanos Apostolopoulos * See license.txt for license info */ #endregion #region --- Using Directives --- using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Diagnostics; using OpenTK.Platform; #endregion namespace OpenTK { // TODO: Document the GLControl class. /// /// Defines a UserControl with opengl rendering capabilities. /// public partial class GLControl : UserControl, IGLControl { #region --- Private Fields --- private IGLControl glControl; #endregion #region --- Contructors --- /// /// Constructs a new GLControl. /// public GLControl() :this(new DisplayMode()) { } /// /// Constructs a new GLControl, with the specified DisplayMode. /// /// The DisplayMode of the control. public GLControl(DisplayMode mode) { InitializeComponent(); this.Visible = false; this.Fullscreen = mode.Fullscreen; this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } #endregion #region --- Public Methods --- #region public void CreateContext() /// /// Forces the creation of the opengl rendering context. /// public void CreateContext() { if (glControl != null) { throw new ApplicationException("Attempted to create GLControl more than once."); } if (this.DesignMode) { glControl = new DummyGLControl(); } else { switch (Environment.OSVersion.Platform) { case PlatformID.Win32NT: case PlatformID.Win32Windows: glControl = new OpenTK.Platform.Windows.WinGLControl(this, new DisplayMode(Width, Height)); break; case PlatformID.Unix: case (PlatformID)128: // some older versions of Mono reported 128. glControl = new OpenTK.Platform.X11.X11GLControl(this); break; default: throw new PlatformNotSupportedException("Your operating system is not currently supported. We are sorry for the inconvenience."); } } this.Visible = true; OpenTK.OpenGL.GL.LoadAll(); this.OnResize(EventArgs.Empty); } #endregion #region public void SwapBuffers() /// /// Swaps the front and back buffers, and presents the rendered scene to the screen. /// public void SwapBuffers() { Context.SwapBuffers(); } #endregion #region public void MakeCurrent() /// /// Makes the underlying GLContext of this GLControl current. All OpenGL commands issued /// from this point are interpreted by this GLContext. /// public void MakeCurrent() { Context.MakeCurrent(); } #endregion #endregion #region --- Public Properties --- /// /// Gets the AspectRatio of the control this GLContext object /// renders to. This is usually used in a call to Glu.Perspective. /// public double AspectRatio { get { return this.Width / (double)this.Height; } } /// /// Gets or sets the display mode of the control. /// public bool Fullscreen { get { return false; //throw new NotImplementedException(); } set { //throw new NotImplementedException(); } } #endregion #region --- IGLControl Members --- #region public bool IsIdle /// /// Gets the idle status of the control. /// public bool IsIdle { get { if (glControl == null) this.CreateContext(); return glControl.IsIdle; } } #endregion #region public IGLContext Context /// /// Gets the opengl context associated with this control. /// public IGLContext Context { get { if (glControl == null) this.CreateContext(); return glControl.Context; } } #endregion #region DisplayMode changes /// /// Selects the fullscreen DisplayMode closest to the DisplayMode requested. /// /// /// The fullscreen DisplayMode to match, or null to get the current screen DisplayMode. /// /// The DisplayMode closest to the requested one, or null if no DisplayModes are available. /// /// SetDisplayMode /// public DisplayMode SelectDisplayMode(DisplayMode mode) { throw new NotImplementedException(); //return glWindow.SelectDisplayMode(mode); } /// /// Selects the fullscreen DisplayMode closest to the DisplayMode requested, accoriding to the specified /// parameters. /// /// /// The fullscreen DisplayMode to match, or null to get the current screen DisplayMode. /// /// /// The DisplayModeMatchOptions flags that indicate how to search for the requested DisplayMode. /// /// /// The DisplayMode closest to the requested one, or null if no DisplayModes are available or /// DisplayModeMatchOptions.ExactMatch was passed. /// /// /// SetDisplayMode /// public DisplayMode SelectDisplayMode(DisplayMode mode, DisplayModeMatchOptions options) { throw new NotImplementedException(); //return glWindow.SelectDisplayMode(mode, options); } /// /// Sets the requested DisplayMode. /// /// /// The fulscreen DisplayMode to set. Passing null will return the application to windowed /// mode. /// /// /// Use SelectDisplayMode to select one of the available fullscreen modes. /// /// If the mode requested is not available, this function will throw a /// DisplayModeNotAvailable exception. /// /// /// Pass null to return to windowed mode. The previous desktop DisplayMode will be automatically reset by this /// function. This function cannot be used to permanently change the user's desktop DisplayMode. /// /// SelectDisplayMode /// DisplayModeNotAvailable exception /// public void SetDisplayMode(DisplayMode mode) { throw new NotImplementedException(); //glWindow.SetDisplayMode(mode); } #endregion #endregion } }