From 9bcace599eb77c2f566546923980b09f7200cb4b Mon Sep 17 00:00:00 2001 From: the_fiddler Date: Sat, 15 Aug 2009 18:01:15 +0000 Subject: [PATCH] Normalized line endings. --- Source/OpenTK/Graphics/OpenGL/GLHelper.cs | 2388 ++++++++++----------- 1 file changed, 1194 insertions(+), 1194 deletions(-) diff --git a/Source/OpenTK/Graphics/OpenGL/GLHelper.cs b/Source/OpenTK/Graphics/OpenGL/GLHelper.cs index 1403ae4c..bbe50762 100644 --- a/Source/OpenTK/Graphics/OpenGL/GLHelper.cs +++ b/Source/OpenTK/Graphics/OpenGL/GLHelper.cs @@ -1,81 +1,81 @@ -#region --- License --- -/* Copyright (c) 2006-2008 the OpenTK team. - * See license.txt for license info - * - * Contributions by Andy Gill. - */ -#endregion - -#region --- Using Directives --- - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.Reflection; -using System.Diagnostics; -using System.Reflection.Emit; - - -#endregion - -namespace OpenTK.Graphics.OpenGL -{ - /// - /// OpenGL bindings for .NET, implementing OpenGL 3.1, plus extensions. - /// - /// - /// - /// This class contains all OpenGL enums and functions defined in the 3.1 specification. - /// The official .spec files can be found at: http://opengl.org/registry/. - /// - /// A valid OpenGL context must be created before calling any OpenGL function. - /// - /// Use the GL.Load and GL.LoadAll methods to prepare function entry points prior to use. To maintain - /// cross-platform compatibility, this must be done for both core and extension functions. The GameWindow - /// and the GLControl class will take care of this automatically. - /// - /// - /// You can use the GL.SupportsExtension method to check whether any given category of extension functions - /// exists in the current OpenGL context. Keep in mind that different OpenGL contexts may support different - /// extensions, and under different entry points. Always check if all required extensions are still supported - /// when changing visuals or pixel formats. - /// - /// - /// You may retrieve the entry point for an OpenGL function using the GL.GetDelegate method. - /// - /// - /// - /// - /// - /// - /// - public static partial class GL - { - #region --- Fields --- - - internal const string Library = "opengl32.dll"; - - static StringBuilder sb = new StringBuilder(); - static object gl_lock = new object(); - - private static SortedList AvailableExtensions = new SortedList(); - private static bool rebuildExtensionList; - - private static Type glClass; - private static Type delegatesClass; +#region --- License --- +/* Copyright (c) 2006-2008 the OpenTK team. + * See license.txt for license info + * + * Contributions by Andy Gill. + */ +#endregion + +#region --- Using Directives --- + +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Reflection; +using System.Diagnostics; +using System.Reflection.Emit; + + +#endregion + +namespace OpenTK.Graphics.OpenGL +{ + /// + /// OpenGL bindings for .NET, implementing OpenGL 3.1, plus extensions. + /// + /// + /// + /// This class contains all OpenGL enums and functions defined in the 3.1 specification. + /// The official .spec files can be found at: http://opengl.org/registry/. + /// + /// A valid OpenGL context must be created before calling any OpenGL function. + /// + /// Use the GL.Load and GL.LoadAll methods to prepare function entry points prior to use. To maintain + /// cross-platform compatibility, this must be done for both core and extension functions. The GameWindow + /// and the GLControl class will take care of this automatically. + /// + /// + /// You can use the GL.SupportsExtension method to check whether any given category of extension functions + /// exists in the current OpenGL context. Keep in mind that different OpenGL contexts may support different + /// extensions, and under different entry points. Always check if all required extensions are still supported + /// when changing visuals or pixel formats. + /// + /// + /// You may retrieve the entry point for an OpenGL function using the GL.GetDelegate method. + /// + /// + /// + /// + /// + /// + /// + public static partial class GL + { + #region --- Fields --- + + internal const string Library = "opengl32.dll"; + + static StringBuilder sb = new StringBuilder(); + static object gl_lock = new object(); + + private static SortedList AvailableExtensions = new SortedList(); + private static bool rebuildExtensionList; + + private static Type glClass; + private static Type delegatesClass; private static Type importsClass; - readonly static SortedList FunctionMap = new SortedList(); - - #endregion - - #region --- Constructor --- - - static GL() - { - glClass = typeof(GL); - delegatesClass = glClass.GetNestedType("Delegates", BindingFlags.Static | BindingFlags.NonPublic); + readonly static SortedList FunctionMap = new SortedList(); + + #endregion + + #region --- Constructor --- + + static GL() + { + glClass = typeof(GL); + delegatesClass = glClass.GetNestedType("Delegates", BindingFlags.Static | BindingFlags.NonPublic); importsClass = glClass.GetNestedType("Imports", BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] methods = importsClass.GetMethods(BindingFlags.Static | BindingFlags.NonPublic); @@ -83,1121 +83,1121 @@ namespace OpenTK.Graphics.OpenGL foreach (MethodInfo m in methods) { FunctionMap.Add(m.Name, m); - } - } - - #endregion - - #region --- Public Members --- - - #region public static bool SupportsExtension(string name) - - /// - /// Determines whether the specified OpenGL extension category is available in - /// the current OpenGL context. Equivalent to IsExtensionSupported(name, true) - /// - /// The string for the OpenGL extension category (eg. "GL_ARB_multitexture") - /// True if the specified extension is available, false otherwise. - public static bool SupportsExtension(string name) - { - if (rebuildExtensionList) - BuildExtensionList(); - - lock (gl_lock) - { - sb.Remove(0, sb.Length); - if (!name.StartsWith("GL_")) - sb.Append("gl_"); - sb.Append(name.ToLower()); - sb.Replace("_", String.Empty); - - // Search the cache for the string. - return AvailableExtensions.ContainsKey(sb.ToString()); - } - } - - #endregion - - #region public static Delegate GetDelegate(string name) - - /// - /// Returns a System.Delegate wrapping the specified OpenGL function. You must use the - /// base OpenGL name of the function (e.g. "glVertex3fv" instead of "Vertex3"). - /// - /// The name of the OpenGL function (eg. "glNewList") - /// - /// A System.Delegate that can be used to call this OpenGL function or null, if the specified - /// function name does not correspond to an OpenGL function or if the function is not - /// supported by the video drivers. - /// - public static Delegate GetDelegate(string name) - { - FieldInfo info = typeof(Delegates).GetField(name, BindingFlags.Static | BindingFlags.NonPublic); - if (info == null) - return null; - return (Delegate)info.GetValue(null); - } - - #endregion - - #region public static Delegate GetDelegate(string name, Type signature) - - /// - /// Returns a System.Delegate wrapping an OpenGL function. - /// - /// The name of the OpenGL function (eg. "glNewList") - /// The signature of the OpenGL function. - /// - /// A System.Delegate that can be used to call this OpenGL function, or null if the specified - /// function name did not correspond to an OpenGL function. - /// - [Obsolete("Use GetDelegate(string name) instead.")] - public static Delegate GetDelegate(string name, Type signature) - { - return LoadDelegate(name, signature); - } - - #endregion - - #region public static void LoadAll() - - /// - /// Loads all OpenGL functions (core and extensions). - /// - /// - /// - /// This function will be automatically called the first time you use any opengl function. There is - /// - /// - /// Call this function manually whenever you need to update OpenGL entry points. - /// This need may arise if you change the pixelformat/visual, or in case you cannot - /// (or do not want) to use the automatic initialization of the GL class. - /// - /// - public static void LoadAll() - { - if (GraphicsContext.CurrentContext == null) - throw new GraphicsContextMissingException(); - - OpenTK.Platform.Utilities.LoadExtensions(glClass); - } - - #endregion - - #region public static bool Load(string function) - - /// - /// Tries to reload the given OpenGL function (core or extension). - /// - /// The name of the OpenGL function (i.e. glShaderSource) - /// True if the function was found and reloaded, false otherwise. - /// - /// - /// Use this function if you require greater granularity when loading OpenGL entry points. - /// - /// - /// While the automatic initialisation will load all OpenGL entry points, in some cases - /// the initialisation can take place before an OpenGL Context has been established. - /// In this case, use this function to load the entry points for the OpenGL functions - /// you will need, or use ReloadFunctions() to load all available entry points. - /// - /// - /// This function returns true if the given OpenGL function is supported, false otherwise. - /// - /// - /// To query for supported extensions use the IsExtensionSupported() function instead. - /// - /// - public static bool Load(string function) - { - FieldInfo f = delegatesClass.GetField(function, BindingFlags.Static | BindingFlags.NonPublic); - if (f == null) - return false; - - Delegate old = f.GetValue(null) as Delegate; - Delegate @new = LoadDelegate(f.Name, f.FieldType); - if (old.Target != @new.Target) - { - f.SetValue(null, @new); - rebuildExtensionList = true; - } - return @new != null; - } - - #endregion - - #region static Delegate LoadDelegate(string name, Type signature) - - /// - /// - /// Loads an OpenGL function into a type-safe System.Delegate. - /// - /// The name of the OpenGL function (eg. "glNewList") - /// The signature of the OpenGL function. - /// - /// A System.Delegate that can be used to call this OpenGL function, or null if the specified - /// function name did not correspond to an OpenGL function. - /// - static Delegate LoadDelegate(string name, Type signature) - { - MethodInfo m; - return - GetExtensionDelegate(name, signature) ?? - (FunctionMap.TryGetValue((name.Substring(2)), out m) ? - Delegate.CreateDelegate(signature, m) : null); - } - - #endregion - - #region public static bool SupportsFunction(string function) - - /// - /// Checks if a given OpenGL function is supported by the current context - /// - /// The name of the OpenGL function (i.e. glShaderSource) - /// True if the function is supported, false otherwise - public static bool SupportsFunction(string function) - { - lock (gl_lock) - { - if (function == null) - throw new ArgumentNullException("function"); - - sb.Remove(0, sb.Length); - if (!function.StartsWith("gl")) - sb.Append("gl"); - sb.Append(function); - FieldInfo f = delegatesClass.GetField(sb.ToString(), BindingFlags.Static | BindingFlags.NonPublic); - if (f == null) - return false; - - return f.GetValue(null) != null; - } - } - - #endregion - - #region public static bool SupportsFunction(string function, string extension) - - /// - /// Checks if a given OpenGL function is supported by the current context - /// - /// The name of the OpenGL function (e.g. glShaderSource) - /// The name of the extension catagory (e.g. ARB, EXT, ATI, ...) - /// True if the function is supported, false otherwise - public static bool SupportsFunction(string function, string extension) - { - lock (gl_lock) - { - if (function == null) - throw new ArgumentNullException("function"); - if (extension == null) - throw new ArgumentNullException("extension"); - - sb.Remove(0, sb.Length); - if (!function.StartsWith("gl")) - sb.Append("gl"); - sb.Append(function); - if (!function.EndsWith(extension)) - sb.Append(extension); - - FieldInfo f = delegatesClass.GetField(sb.ToString(), BindingFlags.Static | BindingFlags.NonPublic); - if (f == null) - return false; - - return f.GetValue(null) != null; - } - } - - #endregion - - #region static bool SupportsFunction(MethodInfo function) - - /// - /// Checks if a given OpenGL function is supported by the current context. - /// - /// The System.Reflection.MethodInfo for the OpenGL function. - /// True if the function is supported, false otherwise. - static bool SupportsFunction(MethodInfo function) - { - if (function == null) - throw new ArgumentNullException("function"); - - AutoGeneratedAttribute[] attr = (AutoGeneratedAttribute[]) - function.GetCustomAttributes(typeof(AutoGeneratedAttribute), false); - if (attr.Length == 0) - return false; - - return SupportsFunction(attr[0].EntryPoint); - } - - #endregion - - #region private static void BuildExtensionList() - - /// - /// Builds a cache of the supported extensions to speed up searches. - /// - private static void BuildExtensionList() - { - // Assumes there is an opengl context current. - AvailableExtensions.Clear(); - string version_string = GL.GetString(StringName.Version); - if (String.IsNullOrEmpty(version_string)) - { - throw new ApplicationException("Failed to build extension list. Is there an opengl context current?"); - } - - string version; - - // Most drivers return the version in the 3 first characters of the version string, - // (e.g. on Ati X1950 with Catalyst 7.10 -> "2.0.6956 Release"). However, Mesa seems - // to do something strange: "1.4 (2.1 Mesa 7.0.1).". - // Update: this seems to occur with indirect rendering. E.g. Ati 8.2: 1.4 (2.1.7281 ...) - // We'll do some trickery to get the second number (2.1), but this may break on - // some implementations... - //if (version_string.ToLower().Contains("mesa")) - { - int index = version_string.IndexOf('('); - if (index != -1) - version = version_string.Substring(index + 1, 3); - else - version = version_string.TrimStart(' '); - } - //else - // version = version_string.TrimStart(' '); - - if (version.StartsWith("1.1")) - { - AvailableExtensions.Add("glversion11", true); - } - else if (version.StartsWith("1.2")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - } - else if (version.StartsWith("1.3")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - AvailableExtensions.Add("glversion13", true); - } - else if (version.StartsWith("1.4")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - AvailableExtensions.Add("glversion13", true); - AvailableExtensions.Add("glversion14", true); - } - else if (version.StartsWith("1.5")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - AvailableExtensions.Add("glversion13", true); - AvailableExtensions.Add("glversion14", true); - AvailableExtensions.Add("glversion15", true); - } - else if (version.StartsWith("2.0")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - AvailableExtensions.Add("glversion13", true); - AvailableExtensions.Add("glversion14", true); - AvailableExtensions.Add("glversion15", true); - AvailableExtensions.Add("glversion20", true); - } - else if (version.StartsWith("2.1")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - AvailableExtensions.Add("glversion13", true); - AvailableExtensions.Add("glversion14", true); - AvailableExtensions.Add("glversion15", true); - AvailableExtensions.Add("glversion20", true); - AvailableExtensions.Add("glversion21", true); - } - else if (version.StartsWith("3.0")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - AvailableExtensions.Add("glversion13", true); - AvailableExtensions.Add("glversion14", true); - AvailableExtensions.Add("glversion15", true); - AvailableExtensions.Add("glversion20", true); - AvailableExtensions.Add("glversion21", true); - AvailableExtensions.Add("glversion30", true); - } - else if (version.StartsWith("3.1")) - { - AvailableExtensions.Add("glversion11", true); - AvailableExtensions.Add("glversion12", true); - AvailableExtensions.Add("glversion13", true); - AvailableExtensions.Add("glversion14", true); - AvailableExtensions.Add("glversion15", true); - AvailableExtensions.Add("glversion20", true); - AvailableExtensions.Add("glversion21", true); - AvailableExtensions.Add("glversion30", true); - AvailableExtensions.Add("glversion31", true); - } - - string extension_string = GL.GetString(StringName.Extensions); - if (String.IsNullOrEmpty(extension_string)) - return; // no extensions are available - - string[] extensions = extension_string.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string ext in extensions) - AvailableExtensions.Add(ext.Replace("_", String.Empty).ToLower(), true); - - rebuildExtensionList = false; - } - - #endregion - - #region GetAddress - - /// - /// Retrieves the entry point for a dynamically exported OpenGL function. - /// - /// The function string for the OpenGL function (eg. "glNewList") - /// - /// An IntPtr contaning the address for the entry point, or IntPtr.Zero if the specified - /// OpenGL function is not dynamically exported. - /// - /// - /// - /// The Marshal.GetDelegateForFunctionPointer method can be used to turn the return value - /// into a call-able delegate. - /// - /// - /// This function is cross-platform. It determines the underlying platform and uses the - /// correct wgl, glx or agl GetAddress function to retrieve the function pointer. - /// - /// - private static IntPtr GetAddress(string function) - { - return (GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress(function); - } - - #endregion - - #region internal static Delegate GetExtensionDelegate(string name, Type signature) - - /// - /// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function. - /// - /// The name of the OpenGL function (eg. "glNewList") - /// The signature of the OpenGL function. - /// - /// A System.Delegate that can be used to call this OpenGL function or null - /// if the function is not available in the current OpenGL context. - /// - internal static Delegate GetExtensionDelegate(string name, Type signature) - { - IntPtr address = GetAddress(name); - - if (address == IntPtr.Zero || - address == new IntPtr(1) || // Workaround for buggy nvidia drivers which return - address == new IntPtr(2)) // 1 or 2 instead of IntPtr.Zero for some extensions. - { - return null; - } - else - { - return Marshal.GetDelegateForFunctionPointer(address, signature); - } - } - - #endregion - - #endregion - - #region --- GL Overloads --- - -#pragma warning disable 3019 -#pragma warning disable 1591 -#pragma warning disable 1572 -#pragma warning disable 1573 - - #region public static void Color[34]() overloads - - public static void Color3(System.Drawing.Color color) - { - GL.Color3(color.R, color.G, color.B); - } - - public static void Color4(System.Drawing.Color color) - { - GL.Color4(color.R, color.G, color.B, color.A); - } - - public static void Color3(Vector3 color) - { - GL.Color3(color.X, color.Y, color.Z); - } - - public static void Color4(Vector4 color) - { - GL.Color4(color.X, color.Y, color.Z, color.W); - } - - - #endregion - - #region public static void ClearColor() overloads - - public static void ClearColor(System.Drawing.Color color) - { - GL.ClearColor(color.R / 255.0f, color.G / 255.0f, color.B / 255.0f, color.A / 255.0f); - } - - #endregion - - #region public static void BlendColor() overloads - - public static void BlendColor(System.Drawing.Color color) - { - GL.BlendColor(color.R / 255.0f, color.G / 255.0f, color.B / 255.0f, color.A / 255.0f); - } - - #endregion - - #region public static void Material() overloads - - public static void Material(MaterialFace face, MaterialParameter pname, Vector4 @params) - { - unsafe { Material(face, pname, (float*)&@params.X); } - } - - public static void Material(MaterialFace face, MaterialParameter pname, Color4 @params) - { - unsafe { GL.Material(face, pname, (float*)&@params); } - } - - #endregion - - #region public static void Light() overloads - - public static void Light(LightName name, LightParameter pname, Vector4 @params) - { - unsafe { GL.Light(name, pname, (float*)&@params.X); } - } - - public static void Light(LightName name, LightParameter pname, Color4 @params) - { - unsafe { GL.Light(name, pname, (float*)&@params); } - } - - #endregion - - #region --- Overloads for OpenTK.Math --- - - public static void Normal3(Vector3 normal) - { - Delegates.glNormal3f(normal.X, normal.Y, normal.Z); - } - - public static void RasterPos2(Vector2 pos) - { - Delegates.glRasterPos2f(pos.X, pos.Y); - } - - public static void RasterPos3(Vector3 pos) - { - Delegates.glRasterPos3f(pos.X, pos.Y, pos.Z); - } - - public static void RasterPos4(Vector4 pos) - { - Delegates.glRasterPos4f(pos.X, pos.Y, pos.Z, pos.W); - } - - public static void Vertex2(Vector2 v) - { - Delegates.glVertex2f(v.X, v.Y); - } - - public static void Vertex3(Vector3 v) - { - Delegates.glVertex3f(v.X, v.Y, v.Z); - } - - public static void Vertex4(Vector4 v) - { - Delegates.glVertex4f(v.X, v.Y, v.Z, v.W); - } - - public static void TexCoord2(Vector2 v) - { - Delegates.glTexCoord2f(v.X, v.Y); - } - - public static void TexCoord3(Vector3 v) - { - Delegates.glTexCoord3f(v.X, v.Y, v.Z); - } - - public static void TexCoord4(Vector4 v) - { - Delegates.glTexCoord4f(v.X, v.Y, v.Z, v.W); - } - - public static void Rotate(Single angle, Vector3 axis) - { - Delegates.glRotatef((Single)angle, axis.X, axis.Y, axis.Z); - } - - public static void Scale(Vector3 scale) - { - Delegates.glScalef(scale.X, scale.Y, scale.Z); - } - - public static void Translate(Vector3 trans) - { - Delegates.glTranslatef(trans.X, trans.Y, trans.Z); - } - - public static void MultMatrix(ref Matrix4 mat) - { - unsafe - { - fixed (Single* m_ptr = &mat.Row0.X) - { - Delegates.glMultMatrixf((Single*)m_ptr); - } - } - } - - public static void LoadMatrix(ref Matrix4 mat) - { - unsafe - { - fixed (Single* m_ptr = &mat.Row0.X) - { - Delegates.glLoadMatrixf((Single*)m_ptr); - } - } - } - - public static void LoadTransposeMatrix(ref Matrix4 mat) - { - unsafe - { - fixed (Single* m_ptr = &mat.Row0.X) - { - Delegates.glLoadTransposeMatrixf((Single*)m_ptr); - } - } - } - - public static void MultTransposeMatrix(ref Matrix4 mat) - { - unsafe - { - fixed (Single* m_ptr = &mat.Row0.X) - { - Delegates.glMultTransposeMatrixf((Single*)m_ptr); - } - } - } - - public static void MultMatrix(ref Matrix4d mat) - { - unsafe - { - fixed (Double* m_ptr = &mat.Row0.X) - { - Delegates.glMultMatrixd((Double*)m_ptr); - } - } - } - - public static void LoadMatrix(ref Matrix4d mat) - { - unsafe - { - fixed (Double* m_ptr = &mat.Row0.X) - { - Delegates.glLoadMatrixd((Double*)m_ptr); - } - } - } - - public static void LoadTransposeMatrix(ref Matrix4d mat) - { - unsafe - { - fixed (Double* m_ptr = &mat.Row0.X) - { - Delegates.glLoadTransposeMatrixd((Double*)m_ptr); - } - } - } - - public static void MultTransposeMatrix(ref Matrix4d mat) - { - unsafe - { - fixed (Double* m_ptr = &mat.Row0.X) - { - Delegates.glMultTransposeMatrixd((Double*)m_ptr); - } - } - } - - public static void UniformMatrix4(int location, bool transpose, ref Matrix4 matrix) - { - unsafe - { - fixed (float* matrix_ptr = &matrix.Row0.X) - { - GL.UniformMatrix4(location, 1, transpose, matrix_ptr); - } - } - } - - #region Uniform - - [CLSCompliant(false)] - public static void Uniform2(int location, ref Vector2 vector) - { - GL.Uniform2(location, vector.X, vector.Y); - } - - [CLSCompliant(false)] - public static void Uniform3(int location, ref Vector3 vector) - { - GL.Uniform3(location, vector.X, vector.Y, vector.Z); - } - - [CLSCompliant(false)] - public static void Uniform4(int location, ref Vector4 vector) - { - GL.Uniform4(location, vector.X, vector.Y, vector.Z, vector.W); - } - - public static void Uniform2(int location, Vector2 vector) - { - GL.Uniform2(location, vector.X, vector.Y); - } - - public static void Uniform3(int location, Vector3 vector) - { - GL.Uniform3(location, vector.X, vector.Y, vector.Z); - } - - public static void Uniform4(int location, Vector4 vector) - { - GL.Uniform4(location, vector.X, vector.Y, vector.Z, vector.W); - } - - public static void Uniform4(int location, Color4 color) - { - GL.Uniform4(location, color.R, color.G, color.B, color.A); - } - - public static void Uniform4(int location, Quaternion quaternion) - { - GL.Uniform4(location, quaternion.X, quaternion.Y, quaternion.Z, quaternion.W); - } - - #endregion - - #endregion - - #region public static void ShaderSource(Int32 shader, System.String @string) - - public static void ShaderSource(Int32 shader, System.String @string) - { - unsafe - { - int length = @string.Length; - Delegates.glShaderSource((UInt32)shader, 1, new string[] { @string }, &length); - } - } - - #endregion - - #region public static string GetShaderInfoLog(Int32 shader) - - public static string GetShaderInfoLog(Int32 shader) - { - string info; - GetShaderInfoLog(shader, out info); - return info; - } - - #endregion - - #region public static void GetShaderInfoLog(Int32 shader, out string info) - - public static void GetShaderInfoLog(Int32 shader, out string info) - { - unsafe - { - int length; - GL.GetShader(shader, ShaderParameter.InfoLogLength, out length); - if (length == 0) - { - info = String.Empty; - return; - } - StringBuilder sb = new StringBuilder(length); - Delegates.glGetShaderInfoLog((UInt32)shader, sb.Capacity, &length, sb); - info = sb.ToString(); - } - } - - #endregion - - #region public static string GetProgramInfoLog(Int32 program) - - public static string GetProgramInfoLog(Int32 program) - { - string info; - GetProgramInfoLog(program, out info); - return info; - } - - #endregion - - #region public static void GetProgramInfoLog(Int32 program, out string info) - - public static void GetProgramInfoLog(Int32 program, out string info) - { - unsafe - { - int length; - GL.GetProgram(program, OpenTK.Graphics.OpenGL.ProgramParameter.InfoLogLength, out length); if (length == 0) - { - info = String.Empty; - return; - } - StringBuilder sb = new StringBuilder(length); - Delegates.glGetProgramInfoLog((UInt32)program, sb.Capacity, &length, sb); - info = sb.ToString(); - } - } - - #endregion - - #region public static void PointParameter(PointSpriteCoordOriginParameter param) - - /// - /// Helper function that defines the coordinate origin of the Point Sprite. - /// - /// - /// A OpenTK.Graphics.OpenGL.GL.PointSpriteCoordOriginParameter token, - /// denoting the origin of the Point Sprite. - /// - public static void PointParameter(PointSpriteCoordOriginParameter param) - { - GL.PointParameter(PointParameterName.PointSpriteCoordOrigin, (int)param); - } - - #endregion - - #region public static void VertexAttrib2(Int32 index, ref Vector2 v) - - [CLSCompliant(false)] - public static void VertexAttrib2(Int32 index, ref Vector2 v) - { - GL.VertexAttrib2(index, v.X, v.Y); - } - - #endregion - - #region public static void VertexAttrib3(Int32 index, ref Vector3 v) - - [CLSCompliant(false)] - public static void VertexAttrib3(Int32 index, ref Vector3 v) - { - GL.VertexAttrib3(index, v.X, v.Y, v.Z); - } - - #endregion - - #region public static void VertexAttrib4(Int32 index, ref Vector4 v) - - [CLSCompliant(false)] - public static void VertexAttrib4(Int32 index, ref Vector4 v) - { - GL.VertexAttrib4(index, v.X, v.Y, v.Z, v.W); - } - - #endregion - - #region public static void VertexAttrib2(Int32 index, Vector2 v) - - public static void VertexAttrib2(Int32 index, Vector2 v) - { - GL.VertexAttrib2(index, v.X, v.Y); - } - - #endregion - - #region public static void VertexAttrib3(Int32 index, Vector3 v) - - public static void VertexAttrib3(Int32 index, Vector3 v) - { - GL.VertexAttrib3(index, v.X, v.Y, v.Z); - } - - #endregion - - #region public static void VertexAttrib4(Int32 index, Vector4 v) - - public static void VertexAttrib4(Int32 index, Vector4 v) - { - GL.VertexAttrib4(index, v.X, v.Y, v.Z, v.W); - } - - #endregion - - #region public static void MultiTexCoord2(TextureUnit target, ref Vector2 v) - - public static void MultiTexCoord2(TextureUnit target, ref Vector2 v) - { - GL.MultiTexCoord2(target, v.X, v.Y); - } - - #endregion - - #region public static void MultiTexCoord3(TextureUnit target, ref Vector3 v) - - public static void MultiTexCoord3(TextureUnit target, ref Vector3 v) - { - GL.MultiTexCoord3(target, v.X, v.Y, v.Z); - } - - #endregion - - #region public static void MultiTexCoord4(TextureUnit target, ref Vector4 v) - - public static void MultiTexCoord4(TextureUnit target, ref Vector4 v) - { - GL.MultiTexCoord4(target, v.X, v.Y, v.Z, v.W); - } - - #endregion - - #region public static void Rect(System.Drawing.RectangleF rect) - - public static void Rect(System.Drawing.RectangleF rect) - { - GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); - } - - #endregion - - #region public static void Rect(ref System.Drawing.RectangleF rect) - - [CLSCompliant(false)] - public static void Rect(ref System.Drawing.RectangleF rect) - { - GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); - } - - #endregion - - #region public static void Rect(System.Drawing.Rectangle rect) - - public static void Rect(System.Drawing.Rectangle rect) - { - GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); - } - - #endregion - - #region public static void Rect(ref System.Drawing.Rectangle rect) - - [CLSCompliant(false)] - public static void Rect(ref System.Drawing.Rectangle rect) - { - GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); - } - - #endregion - - #region public static int GenTexture() - - public static int GenTexture() - { - int id; - GenTextures(1, out id); - return id; - } - - #endregion - - #region public static void DeleteTexture(int id) - - public static void DeleteTexture(int id) - { - DeleteTextures(1, ref id); - } - - #endregion - - #region [Vertex|Normal|Index|Color|FogCoord|VertexAttrib]Pointer - - public static void VertexPointer(int size, VertexPointerType type, int stride, int pointer) - { - VertexPointer(size, type, stride, (IntPtr)pointer); - } - - public static void NormalPointer(int size, NormalPointerType type, int stride, int pointer) - { - NormalPointer(type, stride, (IntPtr)pointer); - } - - public static void IndexPointer(IndexPointerType type, int stride, int pointer) - { - IndexPointer(type, stride, (IntPtr)pointer); - } - - public static void ColorPointer(int size, ColorPointerType type, int stride, int pointer) - { - ColorPointer(size, type, stride, (IntPtr)pointer); - } - - public static void FogCoordPointer(int size, FogPointerType type, int stride, int pointer) - { - FogCoordPointer(type, stride, (IntPtr)pointer); - } - - public static void EdgeFlagPointer(int stride, int pointer) - { - EdgeFlagPointer(stride, (IntPtr)pointer); - } - - public static void VertexAttribPointer(int index, int size, VertexAttribPointerType type, bool normalized, int stride, int pointer) - { - VertexAttribPointer(index, size, type, normalized, stride, (IntPtr)pointer); - } - - #endregion - - #region Get[Float|Double] - - public static void GetFloat(GetPName pname, out Vector2 vector) - { - unsafe - { - fixed (Vector2* ptr = &vector) - GetFloat(pname, (float*)ptr); - } - } - - public static void GetFloat(GetPName pname, out Vector3 vector) - { - unsafe - { - fixed (Vector3* ptr = &vector) - GetFloat(pname, (float*)ptr); - } - } - - public static void GetFloat(GetPName pname, out Vector4 vector) - { - unsafe - { - fixed (Vector4* ptr = &vector) - GetFloat(pname, (float*)ptr); - } - } - - public static void GetFloat(GetPName pname, out Matrix4 matrix) - { - unsafe - { - fixed (Matrix4* ptr = &matrix) - GetFloat(pname, (float*)ptr); - } - } - - public static void GetDouble(GetPName pname, out Vector2d vector) - { - unsafe - { - fixed (Vector2d* ptr = &vector) - GetFloat(pname, (float*)ptr); - } - } - - public static void GetDouble(GetPName pname, out Vector3d vector) - { - unsafe - { - fixed (Vector3d* ptr = &vector) - GetFloat(pname, (float*)ptr); - } - } - - public static void GetDouble(GetPName pname, out Vector4d vector) - { - unsafe - { - fixed (Vector4d* ptr = &vector) - GetFloat(pname, (float*)ptr); - } - } - - public static void GetDouble(GetPName pname, out Matrix4d matrix) - { - unsafe - { - fixed (Matrix4d* ptr = &matrix) - GetFloat(pname, (float*)ptr); - } - } - - #endregion - - #region Viewport - - public static void Viewport(System.Drawing.Size size) - { - GL.Viewport(0, 0, size.Width, size.Height); - } - - public static void Viewport(System.Drawing.Point location, System.Drawing.Size size) - { - GL.Viewport(location.X, location.Y, size.Width, size.Height); - } - - public static void Viewport(System.Drawing.Rectangle rectangle) - { - GL.Viewport(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); - } - - #endregion - - #region TexEnv - - public static void TexEnv(TextureEnvTarget target, TextureEnvParameter pname, System.Drawing.Color color) - { - Color4 c = new Color4(color); - unsafe - { - TexEnv(target, pname, &c.R); - } - } - - public static void TexEnv(TextureEnvTarget target, TextureEnvParameter pname, Color4 color) - { - unsafe - { - TexEnv(target, pname, &color.R); - } - } - - #endregion - -#pragma warning restore 3019 -#pragma warning restore 1591 -#pragma warning restore 1572 -#pragma warning restore 1573 - - #endregion - } -} + } + } + + #endregion + + #region --- Public Members --- + + #region public static bool SupportsExtension(string name) + + /// + /// Determines whether the specified OpenGL extension category is available in + /// the current OpenGL context. Equivalent to IsExtensionSupported(name, true) + /// + /// The string for the OpenGL extension category (eg. "GL_ARB_multitexture") + /// True if the specified extension is available, false otherwise. + public static bool SupportsExtension(string name) + { + if (rebuildExtensionList) + BuildExtensionList(); + + lock (gl_lock) + { + sb.Remove(0, sb.Length); + if (!name.StartsWith("GL_")) + sb.Append("gl_"); + sb.Append(name.ToLower()); + sb.Replace("_", String.Empty); + + // Search the cache for the string. + return AvailableExtensions.ContainsKey(sb.ToString()); + } + } + + #endregion + + #region public static Delegate GetDelegate(string name) + + /// + /// Returns a System.Delegate wrapping the specified OpenGL function. You must use the + /// base OpenGL name of the function (e.g. "glVertex3fv" instead of "Vertex3"). + /// + /// The name of the OpenGL function (eg. "glNewList") + /// + /// A System.Delegate that can be used to call this OpenGL function or null, if the specified + /// function name does not correspond to an OpenGL function or if the function is not + /// supported by the video drivers. + /// + public static Delegate GetDelegate(string name) + { + FieldInfo info = typeof(Delegates).GetField(name, BindingFlags.Static | BindingFlags.NonPublic); + if (info == null) + return null; + return (Delegate)info.GetValue(null); + } + + #endregion + + #region public static Delegate GetDelegate(string name, Type signature) + + /// + /// Returns a System.Delegate wrapping an OpenGL function. + /// + /// The name of the OpenGL function (eg. "glNewList") + /// The signature of the OpenGL function. + /// + /// A System.Delegate that can be used to call this OpenGL function, or null if the specified + /// function name did not correspond to an OpenGL function. + /// + [Obsolete("Use GetDelegate(string name) instead.")] + public static Delegate GetDelegate(string name, Type signature) + { + return LoadDelegate(name, signature); + } + + #endregion + + #region public static void LoadAll() + + /// + /// Loads all OpenGL functions (core and extensions). + /// + /// + /// + /// This function will be automatically called the first time you use any opengl function. There is + /// + /// + /// Call this function manually whenever you need to update OpenGL entry points. + /// This need may arise if you change the pixelformat/visual, or in case you cannot + /// (or do not want) to use the automatic initialization of the GL class. + /// + /// + public static void LoadAll() + { + if (GraphicsContext.CurrentContext == null) + throw new GraphicsContextMissingException(); + + OpenTK.Platform.Utilities.LoadExtensions(glClass); + } + + #endregion + + #region public static bool Load(string function) + + /// + /// Tries to reload the given OpenGL function (core or extension). + /// + /// The name of the OpenGL function (i.e. glShaderSource) + /// True if the function was found and reloaded, false otherwise. + /// + /// + /// Use this function if you require greater granularity when loading OpenGL entry points. + /// + /// + /// While the automatic initialisation will load all OpenGL entry points, in some cases + /// the initialisation can take place before an OpenGL Context has been established. + /// In this case, use this function to load the entry points for the OpenGL functions + /// you will need, or use ReloadFunctions() to load all available entry points. + /// + /// + /// This function returns true if the given OpenGL function is supported, false otherwise. + /// + /// + /// To query for supported extensions use the IsExtensionSupported() function instead. + /// + /// + public static bool Load(string function) + { + FieldInfo f = delegatesClass.GetField(function, BindingFlags.Static | BindingFlags.NonPublic); + if (f == null) + return false; + + Delegate old = f.GetValue(null) as Delegate; + Delegate @new = LoadDelegate(f.Name, f.FieldType); + if (old.Target != @new.Target) + { + f.SetValue(null, @new); + rebuildExtensionList = true; + } + return @new != null; + } + + #endregion + + #region static Delegate LoadDelegate(string name, Type signature) + + /// + /// + /// Loads an OpenGL function into a type-safe System.Delegate. + /// + /// The name of the OpenGL function (eg. "glNewList") + /// The signature of the OpenGL function. + /// + /// A System.Delegate that can be used to call this OpenGL function, or null if the specified + /// function name did not correspond to an OpenGL function. + /// + static Delegate LoadDelegate(string name, Type signature) + { + MethodInfo m; + return + GetExtensionDelegate(name, signature) ?? + (FunctionMap.TryGetValue((name.Substring(2)), out m) ? + Delegate.CreateDelegate(signature, m) : null); + } + + #endregion + + #region public static bool SupportsFunction(string function) + + /// + /// Checks if a given OpenGL function is supported by the current context + /// + /// The name of the OpenGL function (i.e. glShaderSource) + /// True if the function is supported, false otherwise + public static bool SupportsFunction(string function) + { + lock (gl_lock) + { + if (function == null) + throw new ArgumentNullException("function"); + + sb.Remove(0, sb.Length); + if (!function.StartsWith("gl")) + sb.Append("gl"); + sb.Append(function); + FieldInfo f = delegatesClass.GetField(sb.ToString(), BindingFlags.Static | BindingFlags.NonPublic); + if (f == null) + return false; + + return f.GetValue(null) != null; + } + } + + #endregion + + #region public static bool SupportsFunction(string function, string extension) + + /// + /// Checks if a given OpenGL function is supported by the current context + /// + /// The name of the OpenGL function (e.g. glShaderSource) + /// The name of the extension catagory (e.g. ARB, EXT, ATI, ...) + /// True if the function is supported, false otherwise + public static bool SupportsFunction(string function, string extension) + { + lock (gl_lock) + { + if (function == null) + throw new ArgumentNullException("function"); + if (extension == null) + throw new ArgumentNullException("extension"); + + sb.Remove(0, sb.Length); + if (!function.StartsWith("gl")) + sb.Append("gl"); + sb.Append(function); + if (!function.EndsWith(extension)) + sb.Append(extension); + + FieldInfo f = delegatesClass.GetField(sb.ToString(), BindingFlags.Static | BindingFlags.NonPublic); + if (f == null) + return false; + + return f.GetValue(null) != null; + } + } + + #endregion + + #region static bool SupportsFunction(MethodInfo function) + + /// + /// Checks if a given OpenGL function is supported by the current context. + /// + /// The System.Reflection.MethodInfo for the OpenGL function. + /// True if the function is supported, false otherwise. + static bool SupportsFunction(MethodInfo function) + { + if (function == null) + throw new ArgumentNullException("function"); + + AutoGeneratedAttribute[] attr = (AutoGeneratedAttribute[]) + function.GetCustomAttributes(typeof(AutoGeneratedAttribute), false); + if (attr.Length == 0) + return false; + + return SupportsFunction(attr[0].EntryPoint); + } + + #endregion + + #region private static void BuildExtensionList() + + /// + /// Builds a cache of the supported extensions to speed up searches. + /// + private static void BuildExtensionList() + { + // Assumes there is an opengl context current. + AvailableExtensions.Clear(); + string version_string = GL.GetString(StringName.Version); + if (String.IsNullOrEmpty(version_string)) + { + throw new ApplicationException("Failed to build extension list. Is there an opengl context current?"); + } + + string version; + + // Most drivers return the version in the 3 first characters of the version string, + // (e.g. on Ati X1950 with Catalyst 7.10 -> "2.0.6956 Release"). However, Mesa seems + // to do something strange: "1.4 (2.1 Mesa 7.0.1).". + // Update: this seems to occur with indirect rendering. E.g. Ati 8.2: 1.4 (2.1.7281 ...) + // We'll do some trickery to get the second number (2.1), but this may break on + // some implementations... + //if (version_string.ToLower().Contains("mesa")) + { + int index = version_string.IndexOf('('); + if (index != -1) + version = version_string.Substring(index + 1, 3); + else + version = version_string.TrimStart(' '); + } + //else + // version = version_string.TrimStart(' '); + + if (version.StartsWith("1.1")) + { + AvailableExtensions.Add("glversion11", true); + } + else if (version.StartsWith("1.2")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + } + else if (version.StartsWith("1.3")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + AvailableExtensions.Add("glversion13", true); + } + else if (version.StartsWith("1.4")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + AvailableExtensions.Add("glversion13", true); + AvailableExtensions.Add("glversion14", true); + } + else if (version.StartsWith("1.5")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + AvailableExtensions.Add("glversion13", true); + AvailableExtensions.Add("glversion14", true); + AvailableExtensions.Add("glversion15", true); + } + else if (version.StartsWith("2.0")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + AvailableExtensions.Add("glversion13", true); + AvailableExtensions.Add("glversion14", true); + AvailableExtensions.Add("glversion15", true); + AvailableExtensions.Add("glversion20", true); + } + else if (version.StartsWith("2.1")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + AvailableExtensions.Add("glversion13", true); + AvailableExtensions.Add("glversion14", true); + AvailableExtensions.Add("glversion15", true); + AvailableExtensions.Add("glversion20", true); + AvailableExtensions.Add("glversion21", true); + } + else if (version.StartsWith("3.0")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + AvailableExtensions.Add("glversion13", true); + AvailableExtensions.Add("glversion14", true); + AvailableExtensions.Add("glversion15", true); + AvailableExtensions.Add("glversion20", true); + AvailableExtensions.Add("glversion21", true); + AvailableExtensions.Add("glversion30", true); + } + else if (version.StartsWith("3.1")) + { + AvailableExtensions.Add("glversion11", true); + AvailableExtensions.Add("glversion12", true); + AvailableExtensions.Add("glversion13", true); + AvailableExtensions.Add("glversion14", true); + AvailableExtensions.Add("glversion15", true); + AvailableExtensions.Add("glversion20", true); + AvailableExtensions.Add("glversion21", true); + AvailableExtensions.Add("glversion30", true); + AvailableExtensions.Add("glversion31", true); + } + + string extension_string = GL.GetString(StringName.Extensions); + if (String.IsNullOrEmpty(extension_string)) + return; // no extensions are available + + string[] extensions = extension_string.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string ext in extensions) + AvailableExtensions.Add(ext.Replace("_", String.Empty).ToLower(), true); + + rebuildExtensionList = false; + } + + #endregion + + #region GetAddress + + /// + /// Retrieves the entry point for a dynamically exported OpenGL function. + /// + /// The function string for the OpenGL function (eg. "glNewList") + /// + /// An IntPtr contaning the address for the entry point, or IntPtr.Zero if the specified + /// OpenGL function is not dynamically exported. + /// + /// + /// + /// The Marshal.GetDelegateForFunctionPointer method can be used to turn the return value + /// into a call-able delegate. + /// + /// + /// This function is cross-platform. It determines the underlying platform and uses the + /// correct wgl, glx or agl GetAddress function to retrieve the function pointer. + /// + /// + private static IntPtr GetAddress(string function) + { + return (GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress(function); + } + + #endregion + + #region internal static Delegate GetExtensionDelegate(string name, Type signature) + + /// + /// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function. + /// + /// The name of the OpenGL function (eg. "glNewList") + /// The signature of the OpenGL function. + /// + /// A System.Delegate that can be used to call this OpenGL function or null + /// if the function is not available in the current OpenGL context. + /// + internal static Delegate GetExtensionDelegate(string name, Type signature) + { + IntPtr address = GetAddress(name); + + if (address == IntPtr.Zero || + address == new IntPtr(1) || // Workaround for buggy nvidia drivers which return + address == new IntPtr(2)) // 1 or 2 instead of IntPtr.Zero for some extensions. + { + return null; + } + else + { + return Marshal.GetDelegateForFunctionPointer(address, signature); + } + } + + #endregion + + #endregion + + #region --- GL Overloads --- + +#pragma warning disable 3019 +#pragma warning disable 1591 +#pragma warning disable 1572 +#pragma warning disable 1573 + + #region public static void Color[34]() overloads + + public static void Color3(System.Drawing.Color color) + { + GL.Color3(color.R, color.G, color.B); + } + + public static void Color4(System.Drawing.Color color) + { + GL.Color4(color.R, color.G, color.B, color.A); + } + + public static void Color3(Vector3 color) + { + GL.Color3(color.X, color.Y, color.Z); + } + + public static void Color4(Vector4 color) + { + GL.Color4(color.X, color.Y, color.Z, color.W); + } + + + #endregion + + #region public static void ClearColor() overloads + + public static void ClearColor(System.Drawing.Color color) + { + GL.ClearColor(color.R / 255.0f, color.G / 255.0f, color.B / 255.0f, color.A / 255.0f); + } + + #endregion + + #region public static void BlendColor() overloads + + public static void BlendColor(System.Drawing.Color color) + { + GL.BlendColor(color.R / 255.0f, color.G / 255.0f, color.B / 255.0f, color.A / 255.0f); + } + + #endregion + + #region public static void Material() overloads + + public static void Material(MaterialFace face, MaterialParameter pname, Vector4 @params) + { + unsafe { Material(face, pname, (float*)&@params.X); } + } + + public static void Material(MaterialFace face, MaterialParameter pname, Color4 @params) + { + unsafe { GL.Material(face, pname, (float*)&@params); } + } + + #endregion + + #region public static void Light() overloads + + public static void Light(LightName name, LightParameter pname, Vector4 @params) + { + unsafe { GL.Light(name, pname, (float*)&@params.X); } + } + + public static void Light(LightName name, LightParameter pname, Color4 @params) + { + unsafe { GL.Light(name, pname, (float*)&@params); } + } + + #endregion + + #region --- Overloads for OpenTK.Math --- + + public static void Normal3(Vector3 normal) + { + Delegates.glNormal3f(normal.X, normal.Y, normal.Z); + } + + public static void RasterPos2(Vector2 pos) + { + Delegates.glRasterPos2f(pos.X, pos.Y); + } + + public static void RasterPos3(Vector3 pos) + { + Delegates.glRasterPos3f(pos.X, pos.Y, pos.Z); + } + + public static void RasterPos4(Vector4 pos) + { + Delegates.glRasterPos4f(pos.X, pos.Y, pos.Z, pos.W); + } + + public static void Vertex2(Vector2 v) + { + Delegates.glVertex2f(v.X, v.Y); + } + + public static void Vertex3(Vector3 v) + { + Delegates.glVertex3f(v.X, v.Y, v.Z); + } + + public static void Vertex4(Vector4 v) + { + Delegates.glVertex4f(v.X, v.Y, v.Z, v.W); + } + + public static void TexCoord2(Vector2 v) + { + Delegates.glTexCoord2f(v.X, v.Y); + } + + public static void TexCoord3(Vector3 v) + { + Delegates.glTexCoord3f(v.X, v.Y, v.Z); + } + + public static void TexCoord4(Vector4 v) + { + Delegates.glTexCoord4f(v.X, v.Y, v.Z, v.W); + } + + public static void Rotate(Single angle, Vector3 axis) + { + Delegates.glRotatef((Single)angle, axis.X, axis.Y, axis.Z); + } + + public static void Scale(Vector3 scale) + { + Delegates.glScalef(scale.X, scale.Y, scale.Z); + } + + public static void Translate(Vector3 trans) + { + Delegates.glTranslatef(trans.X, trans.Y, trans.Z); + } + + public static void MultMatrix(ref Matrix4 mat) + { + unsafe + { + fixed (Single* m_ptr = &mat.Row0.X) + { + Delegates.glMultMatrixf((Single*)m_ptr); + } + } + } + + public static void LoadMatrix(ref Matrix4 mat) + { + unsafe + { + fixed (Single* m_ptr = &mat.Row0.X) + { + Delegates.glLoadMatrixf((Single*)m_ptr); + } + } + } + + public static void LoadTransposeMatrix(ref Matrix4 mat) + { + unsafe + { + fixed (Single* m_ptr = &mat.Row0.X) + { + Delegates.glLoadTransposeMatrixf((Single*)m_ptr); + } + } + } + + public static void MultTransposeMatrix(ref Matrix4 mat) + { + unsafe + { + fixed (Single* m_ptr = &mat.Row0.X) + { + Delegates.glMultTransposeMatrixf((Single*)m_ptr); + } + } + } + + public static void MultMatrix(ref Matrix4d mat) + { + unsafe + { + fixed (Double* m_ptr = &mat.Row0.X) + { + Delegates.glMultMatrixd((Double*)m_ptr); + } + } + } + + public static void LoadMatrix(ref Matrix4d mat) + { + unsafe + { + fixed (Double* m_ptr = &mat.Row0.X) + { + Delegates.glLoadMatrixd((Double*)m_ptr); + } + } + } + + public static void LoadTransposeMatrix(ref Matrix4d mat) + { + unsafe + { + fixed (Double* m_ptr = &mat.Row0.X) + { + Delegates.glLoadTransposeMatrixd((Double*)m_ptr); + } + } + } + + public static void MultTransposeMatrix(ref Matrix4d mat) + { + unsafe + { + fixed (Double* m_ptr = &mat.Row0.X) + { + Delegates.glMultTransposeMatrixd((Double*)m_ptr); + } + } + } + + public static void UniformMatrix4(int location, bool transpose, ref Matrix4 matrix) + { + unsafe + { + fixed (float* matrix_ptr = &matrix.Row0.X) + { + GL.UniformMatrix4(location, 1, transpose, matrix_ptr); + } + } + } + + #region Uniform + + [CLSCompliant(false)] + public static void Uniform2(int location, ref Vector2 vector) + { + GL.Uniform2(location, vector.X, vector.Y); + } + + [CLSCompliant(false)] + public static void Uniform3(int location, ref Vector3 vector) + { + GL.Uniform3(location, vector.X, vector.Y, vector.Z); + } + + [CLSCompliant(false)] + public static void Uniform4(int location, ref Vector4 vector) + { + GL.Uniform4(location, vector.X, vector.Y, vector.Z, vector.W); + } + + public static void Uniform2(int location, Vector2 vector) + { + GL.Uniform2(location, vector.X, vector.Y); + } + + public static void Uniform3(int location, Vector3 vector) + { + GL.Uniform3(location, vector.X, vector.Y, vector.Z); + } + + public static void Uniform4(int location, Vector4 vector) + { + GL.Uniform4(location, vector.X, vector.Y, vector.Z, vector.W); + } + + public static void Uniform4(int location, Color4 color) + { + GL.Uniform4(location, color.R, color.G, color.B, color.A); + } + + public static void Uniform4(int location, Quaternion quaternion) + { + GL.Uniform4(location, quaternion.X, quaternion.Y, quaternion.Z, quaternion.W); + } + + #endregion + + #endregion + + #region public static void ShaderSource(Int32 shader, System.String @string) + + public static void ShaderSource(Int32 shader, System.String @string) + { + unsafe + { + int length = @string.Length; + Delegates.glShaderSource((UInt32)shader, 1, new string[] { @string }, &length); + } + } + + #endregion + + #region public static string GetShaderInfoLog(Int32 shader) + + public static string GetShaderInfoLog(Int32 shader) + { + string info; + GetShaderInfoLog(shader, out info); + return info; + } + + #endregion + + #region public static void GetShaderInfoLog(Int32 shader, out string info) + + public static void GetShaderInfoLog(Int32 shader, out string info) + { + unsafe + { + int length; + GL.GetShader(shader, ShaderParameter.InfoLogLength, out length); + if (length == 0) + { + info = String.Empty; + return; + } + StringBuilder sb = new StringBuilder(length); + Delegates.glGetShaderInfoLog((UInt32)shader, sb.Capacity, &length, sb); + info = sb.ToString(); + } + } + + #endregion + + #region public static string GetProgramInfoLog(Int32 program) + + public static string GetProgramInfoLog(Int32 program) + { + string info; + GetProgramInfoLog(program, out info); + return info; + } + + #endregion + + #region public static void GetProgramInfoLog(Int32 program, out string info) + + public static void GetProgramInfoLog(Int32 program, out string info) + { + unsafe + { + int length; + GL.GetProgram(program, OpenTK.Graphics.OpenGL.ProgramParameter.InfoLogLength, out length); if (length == 0) + { + info = String.Empty; + return; + } + StringBuilder sb = new StringBuilder(length); + Delegates.glGetProgramInfoLog((UInt32)program, sb.Capacity, &length, sb); + info = sb.ToString(); + } + } + + #endregion + + #region public static void PointParameter(PointSpriteCoordOriginParameter param) + + /// + /// Helper function that defines the coordinate origin of the Point Sprite. + /// + /// + /// A OpenTK.Graphics.OpenGL.GL.PointSpriteCoordOriginParameter token, + /// denoting the origin of the Point Sprite. + /// + public static void PointParameter(PointSpriteCoordOriginParameter param) + { + GL.PointParameter(PointParameterName.PointSpriteCoordOrigin, (int)param); + } + + #endregion + + #region public static void VertexAttrib2(Int32 index, ref Vector2 v) + + [CLSCompliant(false)] + public static void VertexAttrib2(Int32 index, ref Vector2 v) + { + GL.VertexAttrib2(index, v.X, v.Y); + } + + #endregion + + #region public static void VertexAttrib3(Int32 index, ref Vector3 v) + + [CLSCompliant(false)] + public static void VertexAttrib3(Int32 index, ref Vector3 v) + { + GL.VertexAttrib3(index, v.X, v.Y, v.Z); + } + + #endregion + + #region public static void VertexAttrib4(Int32 index, ref Vector4 v) + + [CLSCompliant(false)] + public static void VertexAttrib4(Int32 index, ref Vector4 v) + { + GL.VertexAttrib4(index, v.X, v.Y, v.Z, v.W); + } + + #endregion + + #region public static void VertexAttrib2(Int32 index, Vector2 v) + + public static void VertexAttrib2(Int32 index, Vector2 v) + { + GL.VertexAttrib2(index, v.X, v.Y); + } + + #endregion + + #region public static void VertexAttrib3(Int32 index, Vector3 v) + + public static void VertexAttrib3(Int32 index, Vector3 v) + { + GL.VertexAttrib3(index, v.X, v.Y, v.Z); + } + + #endregion + + #region public static void VertexAttrib4(Int32 index, Vector4 v) + + public static void VertexAttrib4(Int32 index, Vector4 v) + { + GL.VertexAttrib4(index, v.X, v.Y, v.Z, v.W); + } + + #endregion + + #region public static void MultiTexCoord2(TextureUnit target, ref Vector2 v) + + public static void MultiTexCoord2(TextureUnit target, ref Vector2 v) + { + GL.MultiTexCoord2(target, v.X, v.Y); + } + + #endregion + + #region public static void MultiTexCoord3(TextureUnit target, ref Vector3 v) + + public static void MultiTexCoord3(TextureUnit target, ref Vector3 v) + { + GL.MultiTexCoord3(target, v.X, v.Y, v.Z); + } + + #endregion + + #region public static void MultiTexCoord4(TextureUnit target, ref Vector4 v) + + public static void MultiTexCoord4(TextureUnit target, ref Vector4 v) + { + GL.MultiTexCoord4(target, v.X, v.Y, v.Z, v.W); + } + + #endregion + + #region public static void Rect(System.Drawing.RectangleF rect) + + public static void Rect(System.Drawing.RectangleF rect) + { + GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); + } + + #endregion + + #region public static void Rect(ref System.Drawing.RectangleF rect) + + [CLSCompliant(false)] + public static void Rect(ref System.Drawing.RectangleF rect) + { + GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); + } + + #endregion + + #region public static void Rect(System.Drawing.Rectangle rect) + + public static void Rect(System.Drawing.Rectangle rect) + { + GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); + } + + #endregion + + #region public static void Rect(ref System.Drawing.Rectangle rect) + + [CLSCompliant(false)] + public static void Rect(ref System.Drawing.Rectangle rect) + { + GL.Rect(rect.Left, rect.Top, rect.Right, rect.Bottom); + } + + #endregion + + #region public static int GenTexture() + + public static int GenTexture() + { + int id; + GenTextures(1, out id); + return id; + } + + #endregion + + #region public static void DeleteTexture(int id) + + public static void DeleteTexture(int id) + { + DeleteTextures(1, ref id); + } + + #endregion + + #region [Vertex|Normal|Index|Color|FogCoord|VertexAttrib]Pointer + + public static void VertexPointer(int size, VertexPointerType type, int stride, int pointer) + { + VertexPointer(size, type, stride, (IntPtr)pointer); + } + + public static void NormalPointer(int size, NormalPointerType type, int stride, int pointer) + { + NormalPointer(type, stride, (IntPtr)pointer); + } + + public static void IndexPointer(IndexPointerType type, int stride, int pointer) + { + IndexPointer(type, stride, (IntPtr)pointer); + } + + public static void ColorPointer(int size, ColorPointerType type, int stride, int pointer) + { + ColorPointer(size, type, stride, (IntPtr)pointer); + } + + public static void FogCoordPointer(int size, FogPointerType type, int stride, int pointer) + { + FogCoordPointer(type, stride, (IntPtr)pointer); + } + + public static void EdgeFlagPointer(int stride, int pointer) + { + EdgeFlagPointer(stride, (IntPtr)pointer); + } + + public static void VertexAttribPointer(int index, int size, VertexAttribPointerType type, bool normalized, int stride, int pointer) + { + VertexAttribPointer(index, size, type, normalized, stride, (IntPtr)pointer); + } + + #endregion + + #region Get[Float|Double] + + public static void GetFloat(GetPName pname, out Vector2 vector) + { + unsafe + { + fixed (Vector2* ptr = &vector) + GetFloat(pname, (float*)ptr); + } + } + + public static void GetFloat(GetPName pname, out Vector3 vector) + { + unsafe + { + fixed (Vector3* ptr = &vector) + GetFloat(pname, (float*)ptr); + } + } + + public static void GetFloat(GetPName pname, out Vector4 vector) + { + unsafe + { + fixed (Vector4* ptr = &vector) + GetFloat(pname, (float*)ptr); + } + } + + public static void GetFloat(GetPName pname, out Matrix4 matrix) + { + unsafe + { + fixed (Matrix4* ptr = &matrix) + GetFloat(pname, (float*)ptr); + } + } + + public static void GetDouble(GetPName pname, out Vector2d vector) + { + unsafe + { + fixed (Vector2d* ptr = &vector) + GetFloat(pname, (float*)ptr); + } + } + + public static void GetDouble(GetPName pname, out Vector3d vector) + { + unsafe + { + fixed (Vector3d* ptr = &vector) + GetFloat(pname, (float*)ptr); + } + } + + public static void GetDouble(GetPName pname, out Vector4d vector) + { + unsafe + { + fixed (Vector4d* ptr = &vector) + GetFloat(pname, (float*)ptr); + } + } + + public static void GetDouble(GetPName pname, out Matrix4d matrix) + { + unsafe + { + fixed (Matrix4d* ptr = &matrix) + GetFloat(pname, (float*)ptr); + } + } + + #endregion + + #region Viewport + + public static void Viewport(System.Drawing.Size size) + { + GL.Viewport(0, 0, size.Width, size.Height); + } + + public static void Viewport(System.Drawing.Point location, System.Drawing.Size size) + { + GL.Viewport(location.X, location.Y, size.Width, size.Height); + } + + public static void Viewport(System.Drawing.Rectangle rectangle) + { + GL.Viewport(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + } + + #endregion + + #region TexEnv + + public static void TexEnv(TextureEnvTarget target, TextureEnvParameter pname, System.Drawing.Color color) + { + Color4 c = new Color4(color); + unsafe + { + TexEnv(target, pname, &c.R); + } + } + + public static void TexEnv(TextureEnvTarget target, TextureEnvParameter pname, Color4 color) + { + unsafe + { + TexEnv(target, pname, &color.R); + } + } + + #endregion + +#pragma warning restore 3019 +#pragma warning restore 1591 +#pragma warning restore 1572 +#pragma warning restore 1573 + + #endregion + } +}