Merge pull request #652 from Nihlus/glwidget-glarea

Base GLWidget on GLArea instead of DrawingArea
This commit is contained in:
Jarl Gullberg 2017-10-19 21:03:11 +02:00 committed by GitHub
commit 870f1abf8e
8 changed files with 85 additions and 468 deletions

View file

@ -1,3 +1,4 @@
image: Visual Studio 2017
init:
- git config --global core.autocrlf input
build_script:

View file

@ -105,7 +105,8 @@ Target "AssemblyInfo" (fun _ ->
Attribute.Version release.AssemblyVersion
Attribute.FileVersion release.AssemblyVersion
Attribute.CLSCompliant true
Attribute.Copyright copyright ]
Attribute.Copyright copyright
]
let getProjectDetails projectPath =
let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath)

View file

@ -1,14 +1,9 @@
using System;
using System.Threading;
using System.ComponentModel;
using Gdk;
using OpenTK.Graphics;
using OpenTK.Platform;
using Gtk;
using OpenTK.OSX;
using OpenTK.Win;
using OpenTK.X11;
namespace OpenTK
{
@ -17,66 +12,28 @@ namespace OpenTK
/// </summary>
[CLSCompliant(false)]
[ToolboxItem(true)]
public class GLWidget: DrawingArea
public class GLWidget : GLArea
{
private static int _GraphicsContextCount;
private static bool _SharedContextInitialized = false;
private IGraphicsContext _GraphicsContext;
private IWindowInfo _WindowInfo;
private bool _Initialized = false;
/// <summary>
/// Use a single buffer versus a double buffer.
/// The previous frame time reported by GTK.
/// </summary>
[Browsable(true)]
public bool SingleBuffer { get; set; }
private double? _PreviousFrameTime;
/// <summary>
/// Color Buffer Bits-Per-Pixel
/// Gets the time taken to render the last frame (in seconds).
/// </summary>
public int ColorBPP { get; set; }
public double DeltaTime { get; private set; }
/// <summary>
/// Accumulation Buffer Bits-Per-Pixel
/// The set <see cref="ContextFlags"/> for this widget.
/// </summary>
public int AccumulatorBPP { get; set; }
/// <summary>
/// Depth Buffer Bits-Per-Pixel
/// </summary>
public int DepthBPP { get; set; }
/// <summary>
/// Stencil Buffer Bits-Per-Pixel
/// </summary>
public int StencilBPP { get; set; }
/// <summary>
/// Number of samples
/// </summary>
public int Samples { get; set; }
/// <summary>
/// Indicates if steropic renderering is enabled
/// </summary>
public bool Stereo { get; set; }
/// <summary>
/// The major version of OpenGL to use.
/// </summary>
public int GlVersionMajor { get; set; }
/// <summary>
/// The minor version of OpenGL to use.
/// </summary>
public int GlVersionMinor { get; set; }
/// <summary>
/// The set <see cref="GraphicsContextFlags"/> for this widget.
/// </summary>
public GraphicsContextFlags GraphicsContextFlags { get; set; }
public GraphicsContextFlags ContextFlags { get; }
/// <summary>
/// Initializes a new instance of the <see cref="GLWidget"/> class.
@ -98,24 +55,71 @@ namespace OpenTK
/// <param name="graphicsMode">The <see cref="GraphicsMode"/> which the widget should be constructed with.</param>
/// <param name="glVersionMajor">The major OpenGL version to attempt to initialize.</param>
/// <param name="glVersionMinor">The minor OpenGL version to attempt to initialize.</param>
/// <param name="graphicsContextFlags">
/// <param name="contextFlags">
/// Any flags which should be used during initialization of the <see cref="GraphicsContext"/>.
/// </param>
public GLWidget(GraphicsMode graphicsMode, int glVersionMajor, int glVersionMinor, GraphicsContextFlags graphicsContextFlags)
public GLWidget(GraphicsMode graphicsMode, int glVersionMajor, int glVersionMinor, GraphicsContextFlags contextFlags)
{
this.DoubleBuffered = false;
ContextFlags = contextFlags;
SingleBuffer = graphicsMode.Buffers == 1;
ColorBPP = graphicsMode.ColorFormat.BitsPerPixel;
AccumulatorBPP = graphicsMode.AccumulatorFormat.BitsPerPixel;
DepthBPP = graphicsMode.Depth;
StencilBPP = graphicsMode.Stencil;
Samples = graphicsMode.Samples;
Stereo = graphicsMode.Stereo;
AddTickCallback(UpdateFrameTime);
SetRequiredVersion(glVersionMajor, glVersionMinor);
GlVersionMajor = glVersionMajor;
GlVersionMinor = glVersionMinor;
GraphicsContextFlags = graphicsContextFlags;
if (graphicsMode.Depth > 0)
{
HasDepthBuffer = true;
}
if (graphicsMode.Stencil > 0)
{
HasStencilBuffer = true;
}
if (graphicsMode.ColorFormat.Alpha > 0)
{
HasAlpha = true;
}
}
/// <summary>
/// Updates the time delta with a new value from the last frame.
/// </summary>
/// <param name="widget">The sending widget.</param>
/// <param name="frameClock">The relevant frame clock.</param>
/// <returns>true if the callback should be called again; otherwise, false.</returns>
private bool UpdateFrameTime(Widget widget, FrameClock frameClock)
{
var frameTimeµSeconds = frameClock.FrameTime;
if (!_PreviousFrameTime.HasValue)
{
_PreviousFrameTime = frameTimeµSeconds;
return true;
}
var frameTimeSeconds = (frameTimeµSeconds - _PreviousFrameTime) / 10e6;
DeltaTime = (float)frameTimeSeconds;
_PreviousFrameTime = frameTimeµSeconds;
return true;
}
/// <inheritdoc />
protected override GLContext OnCreateContext()
{
var gdkGLContext = Window.CreateGlContext();
GetRequiredVersion(out var major, out var minor);
gdkGLContext.SetRequiredVersion(major, minor);
gdkGLContext.DebugEnabled = ContextFlags.HasFlag(GraphicsContextFlags.Debug);
gdkGLContext.ForwardCompatible = ContextFlags.HasFlag(GraphicsContextFlags.ForwardCompatible);
gdkGLContext.Realize();
return gdkGLContext;
}
/// <summary>
@ -137,39 +141,15 @@ namespace OpenTK
base.Destroy();
}
#if !GTK3
/// <summary>
/// Disposes the current object, releasing any native resources it was using.
/// </summary>
/// <param name="disposing"></param>
public override void Dispose()
{
GC.SuppressFinalize(this);
Dispose(true);
base.Dispose();
}
#endif
#if GTK3
/// <summary>
/// Disposes the current object, releasing any native resources it was using.
/// </summary>
/// <param name="disposing"></param>
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
#else
/// <summary>
/// Disposes the current object, releasing any native resources it was using.
/// </summary>
/// <param name="disposing"></param>
public virtual void Dispose(bool disposing)
{
#endif
if (disposing)
{
_GraphicsContext.MakeCurrent(_WindowInfo);
MakeCurrent();
OnShuttingDown();
if (GraphicsContext.ShareContexts && (Interlocked.Decrement(ref _GraphicsContextCount) == 0))
{
@ -231,22 +211,6 @@ namespace OpenTK
}
}
/// <summary>
/// Called when this <see cref="GLWidget"/> needs to render a frame.
/// </summary>
public event EventHandler RenderFrame;
/// <summary>
/// Invokes the <see cref="RenderFrame"/> event.
/// </summary>
protected virtual void OnRenderFrame()
{
if (RenderFrame != null)
{
RenderFrame(this, EventArgs.Empty);
}
}
/// <summary>
/// Called when this <see cref="GLWidget"/> is being disposed.
/// </summary>
@ -263,62 +227,19 @@ namespace OpenTK
}
}
#if GTK3
/// <summary>
/// Called when the widget needs to be (fully or partially) redrawn.
/// </summary>
/// <param name="cr"></param>
/// <returns></returns>
protected override bool OnDrawn(Cairo.Context cr)
#else
/// <summary>
/// Called when the widget is exposed.
/// </summary>
/// <param name="cr"></param>
/// <returns></returns>
protected override bool OnExposeEvent(Gdk.EventExpose evnt)
#endif
{
if (!_Initialized)
{
Initialize();
}
else
{
_GraphicsContext.MakeCurrent(_WindowInfo);
}
#if GTK3
var result = base.OnDrawn(cr);
#else
bool result = base.OnExposeEvent(evnt);
#endif
OnRenderFrame();
#if !GTK3
evnt.Window.Display.Sync(); // Add Sync call to fix resize rendering problem (Jay L. T. Cornwall) - How does this affect VSync?
#endif
_GraphicsContext.SwapBuffers();
return result;
}
/// <summary>
/// Called whenever the widget is resized.
/// </summary>
/// <param name="evnt"></param>
/// <returns></returns>
protected override bool OnConfigureEvent(Gdk.EventConfigure evnt)
{
bool result = base.OnConfigureEvent(evnt);
if (_GraphicsContext != null)
{
_GraphicsContext.Update(_WindowInfo);
}
return result;
}
@ -329,66 +250,17 @@ namespace OpenTK
{
_Initialized = true;
// If this looks uninitialized... initialize.
if (ColorBPP == 0)
// Make the GDK GL context current
MakeCurrent();
// Create a dummy context that will grab the GdkGLContext that is current on the thread
_GraphicsContext = new GraphicsContext(ContextHandle.Zero, null);
if (ContextFlags.HasFlag(GraphicsContextFlags.Debug))
{
ColorBPP = 32;
if (DepthBPP == 0)
{
DepthBPP = 16;
}
_GraphicsContext.ErrorChecking = true;
}
ColorFormat colorBufferColorFormat = new ColorFormat(ColorBPP);
ColorFormat accumulationColorFormat = new ColorFormat(AccumulatorBPP);
int buffers = 2;
if (SingleBuffer)
{
buffers--;
}
GraphicsMode graphicsMode = new GraphicsMode(colorBufferColorFormat, DepthBPP, StencilBPP, Samples, accumulationColorFormat, buffers, Stereo);
if (Configuration.RunningOnWindows)
{
Console.WriteLine("OpenTK running on windows");
}
else if (Configuration.RunningOnMacOS)
{
Console.WriteLine("OpenTK running on OSX");
}
else
{
Console.WriteLine("OpenTK running on X11");
}
#if GTK3
IntPtr widgetWindowHandle = this.Window.Handle;
#else
IntPtr widgetWindowHandle = this.GdkWindow.Handle;
#endif
// IWindowInfo
if (Configuration.RunningOnWindows)
{
_WindowInfo = WinWindowsInfoInitializer.Initialize(widgetWindowHandle);
}
else if (Configuration.RunningOnMacOS)
{
_WindowInfo = OSXWindowInfoInitializer.Initialize(widgetWindowHandle);
}
else
{
_WindowInfo = XWindowInfoInitializer.Initialize(graphicsMode, this.Display.Handle, this.Screen.Number, widgetWindowHandle, this.Screen.RootWindow.Handle);
}
// GraphicsContext
_GraphicsContext = new GraphicsContext(graphicsMode, _WindowInfo, GlVersionMajor, GlVersionMinor, GraphicsContextFlags);
_GraphicsContext.MakeCurrent(_WindowInfo);
if (GraphicsContext.ShareContexts)
{
Interlocked.Increment(ref _GraphicsContextCount);

View file

@ -1,38 +0,0 @@
using System;
using System.Runtime.InteropServices;
using System.Security;
using OpenTK.Platform;
namespace OpenTK.OSX
{
/// <summary>
/// Handler class for initializing <see cref="IWindowInfo"/> objects under the OSX platform for both GTK2 and
/// GTK3.
/// </summary>
public static class OSXWindowInfoInitializer
{
#if GTK3
private const string OSXLibGdkName = "libgdk-3.dylib";
#else
const string OSXLibGdkName = "libgdk-quartz-2.0.0.dylib";
#endif
/// <summary>
/// Initializes an <see cref="IWindowInfo"/> under the OSX platform.
/// </summary>
/// <param name="gdkWindowHandle"></param>
public static IWindowInfo Initialize(IntPtr gdkWindowHandle)
{
IntPtr windowHandle = gdk_quartz_window_get_nswindow(gdkWindowHandle);
IntPtr viewHandle = gdk_quartz_window_get_nsview(gdkWindowHandle);
return Utilities.CreateMacOSWindowInfo(windowHandle, viewHandle);
}
[SuppressUnmanagedCodeSecurity, DllImport(OSXLibGdkName)]
private static extern IntPtr gdk_quartz_window_get_nswindow(IntPtr handle);
[SuppressUnmanagedCodeSecurity, DllImport(OSXLibGdkName)]
private static extern IntPtr gdk_quartz_window_get_nsview(IntPtr handle);
}
}

View file

@ -42,7 +42,7 @@
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkProfile />
<Deterministic>true</Deterministic>
<LangVersion>6</LangVersion>
<LangVersion>7</LangVersion>
<RunCodeAnalysis>true</RunCodeAnalysis>
<CodeAnalysisRuleSet>..\..\stylecop.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
@ -98,13 +98,10 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="OSX\OSXWindowInfoInitializer.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="GLWidget.cs" />
<Compile Include="Win\WinWindowsInfoInitializer.cs" />
<Compile Include="X11\XWindowInfoInitializer.cs" />
</ItemGroup>
<ItemGroup>
<None Include="paket.references" />
@ -120,8 +117,7 @@
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Choose>
<When
Condition="($(DefineConstants.Contains('GTK3')) And ($(TargetFrameworkVersion) == 'v4.0' Or $(TargetFrameworkVersion) == 'v4.0.3' Or $(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7'))">
<When Condition="($(DefineConstants.Contains('GTK3')) And ($(TargetFrameworkVersion) == 'v4.0' Or $(TargetFrameworkVersion) == 'v4.0.3' Or $(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3' Or $(TargetFrameworkVersion) == 'v4.7'))">
<ItemGroup>
<Reference Include="cairo-sharp">
<HintPath>..\..\packages\gtk-sharp3\lib\net40\cairo-sharp.dll</HintPath>

View file

@ -1,43 +0,0 @@
using System;
using System.Runtime.InteropServices;
using System.Security;
using OpenTK.Platform;
namespace OpenTK.Win
{
/// <summary>
/// Handler class for initializing <see cref="IWindowInfo"/> objects under the Windows platform for both GTK2 and
/// GTK3.
/// </summary>
public static class WinWindowsInfoInitializer
{
#if GTK3
private const string WinLibGDKName = "libgdk-3-0.dll";
#else
private const string WinLibGDKName = "libgdk-win32-2.0-0.dll";
#endif
/// <summary>
/// Initializes an <see cref="IWindowInfo"/> under the Windows platform.
/// </summary>
/// <param name="gdkWindowHandle"></param>
public static IWindowInfo Initialize(IntPtr gdkWindowHandle)
{
#if GTK3
IntPtr windowHandle = gdk_win32_window_get_handle(gdkWindowHandle);
#else
IntPtr windowHandle = gdk_win32_drawable_get_handle(gdkWindowHandle);
#endif
return Utilities.CreateWindowsWindowInfo(windowHandle);
}
#if GTK3
[SuppressUnmanagedCodeSecurity, DllImport(WinLibGDKName, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr gdk_win32_window_get_handle(IntPtr w);
#else
[SuppressUnmanagedCodeSecurity, DllImport(WinLibGDKName, CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr gdk_win32_drawable_get_handle(IntPtr d);
#endif
}
}

View file

@ -1,175 +0,0 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security;
using OpenTK.Graphics;
using OpenTK.Platform;
using OpenTK.Platform.X11;
namespace OpenTK.X11
{
/// <summary>
/// Handler class for initializing <see cref="IWindowInfo"/> objects under the X11 platform for both GTK2 and GTK3.
/// </summary>
public static class XWindowInfoInitializer
{
#if GTK3
private const string UnixLibGdkName = "libgdk-3.so.0";
#else
const string UnixLibGdkName = "libgdk-x11-2.0.so.0";
#endif
private const string UnixLibX11Name = "libX11.so.6";
private const string UnixLibGLName = "libGL.so.1";
/// <summary>
/// Initializes an <see cref="IWindowInfo"/> under the X11 platform.
/// </summary>
/// <param name="mode"></param>
/// <param name="displayHandle"></param>
/// <param name="screenNumber"></param>
/// <param name="gdkWindowHandle"></param>
/// <param name="gdkRootWindowHandle"></param>
/// <returns></returns>
public static IWindowInfo Initialize(GraphicsMode mode, IntPtr displayHandle, int screenNumber, IntPtr gdkWindowHandle, IntPtr gdkRootWindowHandle)
{
IntPtr display = gdk_x11_display_get_xdisplay(displayHandle);
#if GTK3
IntPtr windowXid = gdk_x11_window_get_xid(gdkWindowHandle);
IntPtr rootWindowXid = gdk_x11_window_get_xid(gdkRootWindowHandle);
#else
IntPtr windowXid = gdk_x11_drawable_get_xid(gdkWindowHandle);
IntPtr rootWindowXid = gdk_x11_drawable_get_xid(gdkRootWindowHandle);
#endif
IntPtr visualInfo;
if (mode.Index.HasValue)
{
XVisualInfo info = new XVisualInfo
{
VisualID = mode.Index.Value
};
int dummy;
visualInfo = XGetVisualInfo(display, XVisualInfoMask.ID, ref info, out dummy);
}
else
{
visualInfo = GetVisualInfo(mode, display, screenNumber);
}
IWindowInfo retval = Utilities.CreateX11WindowInfo(display, screenNumber, windowXid, rootWindowXid, visualInfo);
XFree(visualInfo);
return retval;
}
private static IntPtr XGetVisualInfo(IntPtr display, XVisualInfoMask infoMask, ref XVisualInfo template, out int nitems)
{
return XGetVisualInfoInternal(display, (IntPtr)(int)infoMask, ref template, out nitems);
}
private static IntPtr GetVisualInfo(GraphicsMode mode, IntPtr display, int screenNumber)
{
try
{
int[] attributes = CreateAttributeList(mode).ToArray();
return glXChooseVisual(display, screenNumber, attributes);
}
catch (DllNotFoundException e)
{
throw new DllNotFoundException("OpenGL dll not found!", e);
}
catch (EntryPointNotFoundException enf)
{
throw new EntryPointNotFoundException("Glx entry point not found!", enf);
}
}
private static List<int> CreateAttributeList(GraphicsMode mode)
{
List<int> attributeList = new List<int>(24);
attributeList.Add((int)GLXAttribute.RGBA);
if (mode.Buffers > 1)
{
attributeList.Add((int)GLXAttribute.DOUBLEBUFFER);
}
if (mode.Stereo)
{
attributeList.Add((int)GLXAttribute.STEREO);
}
attributeList.Add((int)GLXAttribute.RED_SIZE);
attributeList.Add(mode.ColorFormat.Red / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.GREEN_SIZE);
attributeList.Add(mode.ColorFormat.Green / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.BLUE_SIZE);
attributeList.Add(mode.ColorFormat.Blue / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.ALPHA_SIZE);
attributeList.Add(mode.ColorFormat.Alpha / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.DEPTH_SIZE);
attributeList.Add(mode.Depth);
attributeList.Add((int)GLXAttribute.STENCIL_SIZE);
attributeList.Add(mode.Stencil);
//attributeList.Add(GLX_AUX_BUFFERS);
//attributeList.Add(Buffers);
attributeList.Add((int)GLXAttribute.ACCUM_RED_SIZE);
attributeList.Add(mode.AccumulatorFormat.Red / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.ACCUM_GREEN_SIZE);
attributeList.Add(mode.AccumulatorFormat.Green / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.ACCUM_BLUE_SIZE);
attributeList.Add(mode.AccumulatorFormat.Blue / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.ACCUM_ALPHA_SIZE);
attributeList.Add(mode.AccumulatorFormat.Alpha / 4); // TODO support 16-bit
attributeList.Add((int)GLXAttribute.NONE);
return attributeList;
}
[DllImport(UnixLibX11Name, EntryPoint = "XGetVisualInfo")]
private static extern IntPtr XGetVisualInfoInternal(IntPtr display, IntPtr infoMask, ref XVisualInfo template, out int nitems);
[SuppressUnmanagedCodeSecurity, DllImport(UnixLibX11Name)]
private static extern void XFree(IntPtr handle);
#if GTK3
/// <summary> Returns the X resource (window or pixmap) belonging to a GdkWindow. </summary>
/// <remarks> XID gdk_x11_window_get_xid(GdkWindow *drawable); </remarks>
/// <param name="gdkDisplay"> The GdkDrawable. </param>
/// <returns> The ID of window's X resource. </returns>
[SuppressUnmanagedCodeSecurity, DllImport(UnixLibGdkName)]
private static extern IntPtr gdk_x11_window_get_xid(IntPtr gdkDisplay);
#else
/// <summary> Returns the X resource (window or pixmap) belonging to a GdkDrawable. </summary>
/// <remarks> XID gdk_x11_drawable_get_xid(GdkDrawable *drawable); </remarks>
/// <param name="gdkDisplay"> The GdkDrawable. </param>
/// <returns> The ID of drawable's X resource. </returns>
[SuppressUnmanagedCodeSecurity, DllImport(UnixLibGdkName)]
static extern IntPtr gdk_x11_drawable_get_xid(IntPtr gdkDisplay);
#endif
/// <summary> Returns the X display of a GdkDisplay. </summary>
/// <remarks> Display* gdk_x11_display_get_xdisplay(GdkDisplay *display); </remarks>
/// <param name="gdkDisplay"> The GdkDrawable. </param>
/// <returns> The X Display of the GdkDisplay. </returns>
[SuppressUnmanagedCodeSecurity, DllImport(UnixLibGdkName)]
private static extern IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay);
[SuppressUnmanagedCodeSecurity, DllImport(UnixLibGLName)]
private static extern IntPtr glXChooseVisual(IntPtr display, int screen, int[] attr);
}
}

View file

@ -1,6 +1,7 @@
// <auto-generated/>
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitleAttribute("OpenTK")]
[assembly: AssemblyProductAttribute("OpenTK")]
@ -9,6 +10,7 @@ using System.Reflection;
[assembly: AssemblyFileVersionAttribute("3.0.0")]
[assembly: CLSCompliantAttribute(true)]
[assembly: AssemblyCopyrightAttribute("Copyright (c) 2006 - 2016 Stefanos Apostolopoulos <stapostol@gmail.com> for the Open Toolkit library.")]
[assembly: InternalsVisibleToAttribute("OpenTK.GLWidget, PublicKey=0024000004800000940000000602000000240000525341310004000011000000a3e05aafb87f71fb8fd02b512707f289c12341de98c6ce2ec1494b71c20cb2032cbd65d091b447df3ec772257efb9fa3591201937890e067da1d29a339948a12b29c2847a787cc9fbef2a3bf78267026e85f36aab827228df4bb580e3ae0599ade036f0a97a0e6982f5406d98d114455f332350f6d8369db655e9c3e7976c2c8")]
namespace System {
internal static class AssemblyVersionInformation {
internal const System.String AssemblyTitle = "OpenTK";
@ -18,5 +20,6 @@ namespace System {
internal const System.String AssemblyFileVersion = "3.0.0";
internal const System.Boolean CLSCompliant = true;
internal const System.String AssemblyCopyright = "Copyright (c) 2006 - 2016 Stefanos Apostolopoulos <stapostol@gmail.com> for the Open Toolkit library.";
internal const System.String InternalsVisibleTo = "OpenTK.GLWidget, PublicKey=0024000004800000940000000602000000240000525341310004000011000000a3e05aafb87f71fb8fd02b512707f289c12341de98c6ce2ec1494b71c20cb2032cbd65d091b447df3ec772257efb9fa3591201937890e067da1d29a339948a12b29c2847a787cc9fbef2a3bf78267026e85f36aab827228df4bb580e3ae0599ade036f0a97a0e6982f5406d98d114455f332350f6d8369db655e9c3e7976c2c8";
}
}