#region --- License --- /* Copyright (c) 2006, 2007 Stefanos Apostolopoulos * See license.txt for license info */ #endregion using System; using System.Collections.Generic; using System.Text; using OpenTK.Platform; namespace OpenTK { /// /// Represents and provides methods to manipulate an OpenGL render context. /// public class GLContext : IGLContext { IGLContext implementation; // The actual render context implementation for the underlying platform. List dispose_queue = new List(); static SortedList available_contexts = new SortedList(); // Contains all available OpenGL contexts. delegate IntPtr GetCurrentContextDelegate(); static GetCurrentContextDelegate StaticGetCurrentContext; #region public GLContext(DisplayMode mode, IWindowInfo window) /// /// Constructs a new GLContext with the specified DisplayMode, and bound to the specified IWindowInfo. /// /// /// public GLContext(DisplayMode mode, IWindowInfo window) { if (available_contexts.Count == 0) available_contexts.Add(0, new WeakReference(null)); switch (Environment.OSVersion.Platform) { case PlatformID.Unix: case (PlatformID)128: implementation = new OpenTK.Platform.X11.X11GLContext(mode, window); break; case PlatformID.Win32NT: case PlatformID.Win32S: case PlatformID.Win32Windows: case PlatformID.WinCE: implementation = new OpenTK.Platform.Windows.WinGLContext(mode, window); break; default: throw new PlatformNotSupportedException("Your platform is not supported currently. Please, refer to http://opentk.sourceforge.net for more information."); } } #endregion #region public static IGLContext CurrentContext public static GLContext CurrentContext { get { return (GLContext)available_contexts[StaticGetCurrentContext().ToInt64()].Target; } } #endregion #region --- IGLContext Members --- /// /// Gets a handle to the OpenGL rendering context. /// public IntPtr Context { get { return implementation.Context; } } /// /// Gets the IWindowInfo describing the window associated with this context. /// public IWindowInfo Info { get { return implementation.Info; } } /// /// Gets the DisplayMode of the context. /// public DisplayMode Mode { get { return implementation.Mode; } } /// /// Creates an OpenGL context. /// public void CreateContext() { CreateContext(true, null); } /// /// Creates an OpenGL context with a direct or indirect rendering mode. This parameter is ignored /// on Windows platforms (direct mode only). /// /// Set to true for direct rendering or false otherwise. /// /// /// Direct rendering is the default rendering mode for OpenTK, since it can provide higher performance /// in some circumastances. /// /// /// The 'direct' parameter is a hint, and will ignored if the specified mode is not supported (e.g. setting /// indirect rendering on Windows platforms). /// /// public void CreateContext(bool direct) { CreateContext(direct, null); } /// /// Creates an OpenGL context with the specified direct/indirect rendering mode and sharing state with the /// specified IGLContext. /// /// Set to true for direct rendering or false otherwise. /// The source IGLContext to share state from.. /// public void CreateContext(bool direct, IGLContext source) { implementation.CreateContext(direct, source); available_contexts.Add(Context.ToInt64(), new WeakReference(this)); if (StaticGetCurrentContext == null) StaticGetCurrentContext = implementation.GetCurrentContext; } /// /// Swaps buffers on a context. This presents the rendered scene to the user. /// public void SwapBuffers() { implementation.SwapBuffers(); } /// /// Makes this context the current rendering target. /// public void MakeCurrent() { implementation.MakeCurrent(); } /// /// Gets a System.Boolean indicating whether this Context is current in the calling thread. /// public bool IsCurrent { get { return implementation.IsCurrent; } } /// /// Gets a System.IntPtr containing the handle to the OpenGL context which is current in the /// calling thread, or IntPtr.Zero if no OpenGL context is current. /// /// A System.IntPtr that holds the handle to the current OpenGL context. public IntPtr GetCurrentContext() { return implementation.GetCurrentContext(); } /// /// Raised when a Context is destroyed. /// public event DestroyEvent Destroy { add { implementation.Destroy += value; } remove { implementation.Destroy -= value; } } /// /// Gets the address of an OpenGL extension function. /// /// The name of the OpenGL function (e.g. "glGetString") /// /// A pointer to the specified function or IntPtr.Zero if the function isn't /// available in the current opengl context. /// /// public IntPtr GetAddress(string function) { return implementation.GetAddress(function); } /// /// Returns the display modes supported by the current opengl context. /// /// An IEnumerable containing all supported display modes. public IEnumerable GetDisplayModes() { return implementation.GetDisplayModes(); } /// /// Gets or sets a value indicating whether VSync is enabled. /// public bool VSync { get { return implementation.VSync; } set { implementation.VSync = value; } } /// /// Registers an OpenGL resource for disposal. /// /// The OpenGL resource to dispose. public void RegisterForDisposal(IDisposable resource) { GC.KeepAlive(resource); dispose_queue.Add(resource); } /// /// Disposes all registered OpenGL resources. /// public void DisposeResources() { foreach (IDisposable resource in dispose_queue) { resource.Dispose(); } dispose_queue.Clear(); } #endregion #region IDisposable Members /// /// Disposes of the GLContext. /// public void Dispose() { available_contexts.Remove(Context.ToInt64()); implementation.Dispose(); } #endregion } }